天天看點

使用 pprof 分析 go-callvis

go-callvis 是一個可視化的項目源碼調用鍊路分析工具。

這裡有篇簡要分析源碼的文章 https://mp.weixin.qq.com/s/dUXXGd8hqEhKE_Cj4EY2Lw
使用 pprof 分析 go-callvis

pprof 是 golang 内置的性能優化工具。

今天就介紹下用 pprof 來分析 go-callvis 的性能,看看到底耗時在哪。

先把 go-callvis 下載下傳到本地

git clone https://github.com/ofabry/go-callvis.git
cd go-callvis
           

再在 main.go 的開頭處中加上 pprof 相關函數來分析一波

defer func(t int64) {
	end := time.Now().UnixNano()-t
	fmt.Println("go-callvis 程式執行時間:", end, "納秒", end/int64(time.Millisecond), "毫秒", end/int64(time.Second), "秒")
}(time.Now().UnixNano())

cpuProfile, _ := os.Create("cpu_profile")
err := pprof.StartCPUProfile(cpuProfile)
if err != nil {
	fmt.Println("cpu err", err.Error())
	return
}
defer pprof.StopCPUProfile()
           

同時,為了更好分析主要函數的耗時,就把上面代碼的第一個 defer 裡的語句分别加到 Analysis.Render()、Analysis.DoAnalysis 處,接下來在指令行執行以下指令

go run ./  -nostd -format=png -file stock -group pkg,type github.com/ofabry/go-callvis
           
上述中的 ./ 意思是把入口的所有 go 檔案都加載上(也可以換成 *.go),因為這個項目中除了入口 main.go 外,其他幾個 go 檔案都是 package main 的,且 main.go 引用裡面的變量和函數,如果隻執行 main.go 會提示 undefined 之類的錯誤的。

執行完畢,控制台輸出如下

DoAnalysis 程式執行時間: 8205012000 納秒 8205 毫秒 8 秒
Render 程式執行時間: 47695902000 納秒 47695 毫秒 47 秒
2022/02/28 23:31:01 writing dot output..
2022/02/28 23:31:01 converting dot to png..
dotToImage 程式執行時間: 304492000 納秒 304 毫秒 0 秒
程式執行時間: 56206939000 納秒 56206 毫秒 56 秒
           

同時 go-callvis 的自身的函數調用鍊如下

使用 pprof 分析 go-callvis

最後,來檢視下 pprof 分析的結果

go tool pprof -http=":8081" go-demo cpu_profile
           

這是會自動跳轉到到浏覽器,輸出如下

使用 pprof 分析 go-callvis

分為兩欄,上面一欄是菜單,下面一欄預設顯示調用函數及耗時圖。

比如,要看調用耗時清單,可以依次點選 VIEW - Top

使用 pprof 分析 go-callvis

也可以看火焰圖,依次點選 VIEW - Flame Graph

使用 pprof 分析 go-callvis

二者還有更好的玩法,接下來就靠各位讀者自己發掘了,cheers。

繼續閱讀