go效能調優之火焰圖

idwtwt發表於2018-05-16

瞭解到go中有pprof包來做程式碼的效能監控,可以檢視堆疊、cpu資訊等。在兩個地方有包:

net/http/pprof

runtime/pprof

但是使用起來並不是特別好用(不是特別直觀)。之前在接觸systemtap的時候,瞭解到火焰圖這個東西。後來瞭解到uber開源了一個生成火焰圖的工具——go-torch。

下面整理下,之前使用分析的一個過程。

1 新增pprof程式碼

首先我們要在例項的main函式中新增pprof的相關的程式碼:

package main

import (
        ...
	_"net/http/pprof"
	"github.com/astaxie/beego"

	"os/exec"
	"net/http"
)


func main() {

	go func(){
		http.ListenAndServe(":6789", nil)
	}()

這樣我們可以通過訪問URL:http://<ip>:6789/debug/pprof/得到堆疊資訊


通過訪問URl:http://<ip>:6789/debug/pprof/profile獲得函式呼叫CPU消耗的情況(不是特別直觀,一堆文字)

2 生成火焰圖工具安裝

需要安裝兩個工具:FlameGraph指令碼和go-torch

git clone https://github.com/brendangregg/FlameGraph.git

cp flamegraph.pl /usr/local/bin
或
export FlameGraph所在的path

go get -v github.com/uber/go-torch

3 測試

完成安裝之後,執行測試程式和測試工具:

go-torch -u http://<ip>:6789 -t60 -p > profile-local.svg

表示採集60s的資料(預設30s),完了後會在當前目錄生成一張火焰圖,可以用瀏覽器開啟:



4 如何看圖

參考:https://blog.csdn.net/wwwasw/article/details/52137630

   每個框代表一個棧裡的一個函式
   Y軸代表棧深度(棧楨數)。最頂端的框顯示正在執行的函式,這之下的框都是呼叫者。在下面的函式是上面函式的父函式
   X軸代表取樣總量。從左到右並不代表時間變化,從左到右也不具備順序性
   框的寬度代表佔用CPU總時間。寬的框代表的函式可能比窄的執行慢,或者被呼叫了更多次數。框的顏色深淺也沒有任何意義
   如果是多執行緒同時取樣,取樣總數會超過總時間


相關文章