1. 程式人生 > >Golang 效能測試 (3) 跟蹤刨析 golang trace

Golang 效能測試 (3) 跟蹤刨析 golang trace

簡介

對於絕大部分服務,跟蹤刨析是用不到的。但是如果遇到了下面問題,可以不妨一試:

  • 懷疑哪個協程慢了
  • 系統呼叫有問題
  • 協程排程問題 (chan 互動、互斥鎖、訊號量等)
  • 懷疑是 gc (Garbage-Collect) 影響了服務效能
  • 網路阻塞
  • 等等

坦白的講,通過跟蹤刨析可以看到每個協程在某一時刻在幹什麼。

做跟蹤刨析,首先需要獲取trace 資料。可以通過程式碼中插入trace, 或者上節提到的通過pprof 下載即可。

Example

Code

下面通過程式碼直接插入的方式來獲取trace. 內容會涉及到網路請求,涉及協程非同步執行等。

package main

import (
	"io/ioutil"
	"math/rand"
	"net/http"
	"os"
	"runtime/trace"
	"strconv"
	"sync"
	"time"
)


var wg sync.WaitGroup
var httpClient = &http.Client{Timeout: 30 * time.Second}

func SleepSomeTime() time.Duration{
	return time.Microsecond * time.Duration(rand.Int()%1000)
}

func create(readChan chan int) {
	defer wg.Done()
	for i := 0; i < 500; i++ {
		readChan <- getBodySize()
		SleepSomeTime()
	}
	close(readChan)
}

func convert(readChan chan int, output chan string) {
	defer wg.Done()
	for readChan := range readChan {
		output <- strconv.Itoa(readChan)
		SleepSomeTime()
	}
	close(output)
}

func outputStr(output chan string) {
	defer wg.Done()
	for _ = range output {
		// do nothing
		SleepSomeTime()
	}
}

// 獲取taobao 頁面大小
func getBodySize() int {
	resp, _ := httpClient.Get("https://taobao.com")
	res, _ := ioutil.ReadAll(resp.Body)
	_ = resp.Body.Close()
	return len(res)
}

func run() {
	readChan, output := make(chan int), make(chan string)
	wg.Add(3)
	go create(readChan)
	go convert(readChan, output)
	go outputStr(output)
}

func main() {
	f, _ := os.Create("trace.out")
	defer f.Close()
	_ = trace.Start(f)
	defer trace.Stop()
	run()
	wg.Wait()
}

編譯,並執行,然後啟動trace;

[~/blog]$ go build trace_example.go 
[~/blog]$ ./trace_example
[~/blog]$ go tool trace -http=":8000" trace_example trace.out 
2020/04/15 17:34:48 Parsing trace...
2020/04/15 17:34:50 Splitting trace...
2020/04/15 17:34:51 Opening browser. Trace viewer is listening on http://0.0.0.0:8000

然後開啟瀏覽器,訪問8000 埠即可。

Trace 功能

其中:
View trace:檢視跟蹤 (按照時間分段,上面我的例子時間比較短,所以沒有分段)
Goroutine analysis:Goroutine 分析
Network blocking profile:網路阻塞概況
Synchronization blocking profile:同步阻塞概況
Syscall blocking profile:系統呼叫阻塞概況
Scheduler latency profile:排程延遲概況
User defined tasks:使用者自定義任務
User defined regions:使用者自定義區域
Minimum mutator utilization:最低 Mutator 利用率 (主要是GC 的評價標準, 暫時沒搞懂)

goroutine 排程分析

下圖包含了兩種事件:

  1. 網路相關 main.create 觸發網路寫的協程,網路寫操作的協程 writeLoop,然後等待網路返回。
  2. GC 相關操作

下面是web請求到資料,從epoll 中觸發,然後readLoop協程響應,直接觸發main.create 的協程得到執行。

當然我們也可以篩選協程做具體分析,從 Goroutine analysis 進入,選擇具體的協程進行分析:

我們選擇對 main.create 的協程做分析(這個協程略複雜,可以分析的東西比較多)

可以從圖中看出,network 喚醒 readLoop 協程,進而readLoop 又通知了main.create 協程。

當然,我們也可以選擇 main.convert 協程。可以看出協程被main.create 喚醒了(由於給chan 提供了資料)

除了可以分析goroutine 排程之外,還可以做網路阻塞分析,非同步阻塞分析,系統排程阻塞分析,協程排程阻塞分析(下圖)

自定義 Task 和 Region

當然,還可以指定task 和 Region 做分析,下面是官方舉的例子:

//filepath:  src/runtime/trace/trace.go
ctx, task := trace.NewTask(ctx, "makeCappuccino")
trace.Log(ctx, "orderID", orderID)

milk := make(chan bool)
espresso := make(chan bool)

go func() {
        trace.WithRegion(ctx, "steamMilk", steamMilk)
        milk <- true
}()
go func() {
        trace.WithRegion(ctx, "extractCoffee", extractCoffee)
        espresso <- true
}()
go func() {
        defer task.End() // When assemble is done, the order is complete.
        <-espresso
        <-milk
        trace.WithRegion(ctx, "mixMilkCoffee", mixMilkCoffee)
}()

MMU 圖

除此之外,還提供了Minimum Mutator Utilization 圖 (mmu 圖 )

mmu 圖,數軸是服務可以佔用cpu的百分比 (其他時間為gc操作)

從圖中可以看出,在2ms之後,可利用的cpu逐步上升,直到接近100%.所以gc 毫無壓力。

重點提醒

  1. 必須用chrome,並且高版本不行。我使用的是76.
  2. trace 的檔案都比較大,幾分鐘可能上百兆,所以網路一定要好,或者使用本機做驗證。
  3. 造作是 w 放大, s 縮小, a 左移, d 右移
  4. gc 的mmu 圖解釋 (備註下,還沒有來得及看)https://www.cs.cmu.edu/~guyb/papers/gc2001.pdf

相關推薦

Golang 效能測試 (3) 跟蹤 golang trace

簡介 對於絕大部分服務,跟蹤刨析是用不到的。但是如果遇到了下面問題,可以不妨一試: 懷疑哪個協程慢了 系統呼叫有問題 協程排程問題 (chan 互動、互斥鎖、訊號量等) 懷疑是 gc (Garbage-Collect) 影響了服務效能 網路阻塞 等等 坦白的講,通過跟蹤刨析可以看到每個協程在某一時刻在幹什

Golang效能測試與思考

本文測試Go、Python、PyPy、C的效率,作為學習Go的參考標準。測試用例:進行(2<<25)次簡單加法 測試環境: 系統:Windows7 專業版 CPU:Intel® Core™ i5-4590 CPU @ 3.30GHZ 3.30GHZ

golang--效能測試和分析

前言 測試分為:壓力測試、負載測試、效能測試,功能測試等等,其中在開發過程中開發人員經常要寫一些test case unit 自己的模組進行功能測試測和效能。在分析出模組的效能瓶頸後開發人員就需要針對性的調優,但需要提醒的是調優工程一般要放在最後在進行,過早地優化會浪費開發時間,而且有時在需求或者功能變動後

golang 效能測試 (1)

本文介紹golang 如何做基準效能測試。 編寫完程式碼除了跑必要的單元測試外,還需要考慮程式碼跑起來的效能如何。效能的衡量其實就是程式執行時候程序的記憶體分配,CPU消耗情況。 golang 語言在提供了功能測試的基礎上,提供了豐富的效能測試功能。 SHOW CODE 首先,從一個例子來講起。 隨便寫一個簡

golang 效能測試 (1) 基準效能測試

本文介紹golang 如何做基準效能測試。 編寫完程式碼除了跑必要的單元測試外,還需要考慮程式碼跑起來的效能如何。效能的衡量其實就是程式執行時候程序的記憶體分配,CPU消耗情況。 golang 語言在提供了功能測試的基礎上,提供了豐富的效能測試功能。 SHOW CODE 首先,從一個例子來講起。 隨便寫一個簡

漫遊測試效能測試(3.4、Tsung的介紹 一)

tsung是erlang開發的一個開源的多協議分散式負載測試工具,它能用來壓力測試HTTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP和Jabber/XMPP的伺服器的效能。其區別於其它效能測試工具最大特點在於高效能。利用其多節點叢集能力,相同的機器配

JMeter效能測試3.0時代之-多維度的圖形化HTML報告

轉http://www.jianshu.com/p/be8930c4eef2 一.為什麼談這個新特性 在JMeter3.0之前,官方只提供在工具的UI上對測試結果部分維度的圖形化展示,這對我帶來了兩方面的困擾: 在實際使用中,在平臺中整合JMeter後需要頁面展示TPS曲線,平均響應時間曲線等圖表時

效能測試3-效能需求分析

僅供自己學習和分享 第三章      如何獲得需求 1、客戶方提出   客戶方能提出明確的效能需求,說明對方很重視效能測試,這樣的企業一般是金融、電信、銀行、醫療器械等;他們一般對系統的效能要求非常高,對效能也非常瞭解。提出需求也比較明確。   曾經有一個銀行專案,已經到最後的效能測試極端,因為

漫遊測試效能測試(3.3.5.Locust的分散式執行、3.3.6.Locust中的測試結果、)

3.3.5.Locust的分散式執行 主機-master: locust -f test2.py --master --logfile=/srv/7-31.log 從機-slave: locust -f test2.py --slave --master-ho

Golang的簡單反射效能測試

測試用例 我們對Golang的結構體變數賦值, 以及單引數函式呼叫進行反射和native操作的測試package mainimport ( "reflect" "testing")type data struct { Hp int}const AssignTimes = 100000

Golang單元測試效能測試

Test 單元測試 testing包提供了對Go包的自動測試支援。 這是和go test 命令相呼應的功能, go test 命令會自動執行所以符合格式 func TestXXX(t *testing.T) 的函式。 Benchmark 效能測試 Functions of the f

Golang RPC效能測試

最近剛好要使用Golang的RPC,因此對Golang標準庫的RPC進行了一下測試,看看其效能到底如何。RPC服務端和客戶端的實現完全使用RPC的net/rpc標準庫,沒有經過特殊的優化,主要針對下面三個場景進行測試。測試之前需要先說明一下,Go的rpc連線是支

關於golang測試覆蓋率及效能測試

命令行同樣可以使用 在powershell 需要除錯的資料夾下go test -coverprofile=c.out 繼續輸入go tool cover -html=c.out 瀏覽器列印具體程式碼覆蓋率 繼續探討效能測試語句如下 命令行同樣可以執行效能測試

golang 基礎知識3

斷言 val study article 使用 log post als 而不是 斷言: 參考 https://studygolang.com/articles/3314 var.(T)類型斷言失敗時會返回T類型的“0值”,而不是變量原始值。 var是要判斷的變量,T類型,

grpc(3):使用 golang 開發 grpc 服務端和client

ava 相互調用 相互 localhost rpcclient int err pri nec 1,關於grpc-go golang 能夠能夠做grpc的服務端

Jmeter效能測試工具學習(3.重要元件介紹)

jmeter元件(元素) 1)jmeter中sampler(取樣器) 2)jmeter計時器 3)jmeter前置處理器/後置處理器   (在取樣器存在後存在) 4)jmeter斷言   5)jmeter中Controller

效能測試通用原則【3-1;2-5-10;80/20】

如果設計說明書中沒有給出明確的標準,那麼可以參考國外的業內公認的一些標準:    3+1原則(指量、全、深+快) 主要對效能測試設計、測試執行以及資料分析。 量:包括業務量(業務型別),負荷量(系統處理的流量),配置量(軟體配置和硬體配置),使用者量(靜態使用者和動態使用者)

jmeter介面效能測試3)----引數化

1.新增使用者自定義變數 給http請求新增使用者自定義變數:執行緒組》配置元件》使用者自定義變數 定義一個名稱為s的變數 在http請求中呼叫該引數 2.CSV Data Set Config 執行緒組》配置元件》CSV Data Set Config

效能測試初級篇3(錄製)

  一、錄製第一個小指令碼   1、啟動 LoadRunner。     選擇開始 > 程式 > HP LoadRunner > LoadRunner。這時將開啟 HP LoadRunner11.00 視窗。    2、開啟 VuGen。     在 LoadRunner