Go語言內建了獲取程式執行資料的工具,包括以下兩個標準庫:
runtime/pprof: 採集工具型應用執行資料進行分析net/http/pprof: 採集服務型應用執行時資料進行分析pprof開啟後,每隔一段時間(10ms)就會收集當前的堆疊資訊,獲取各個函式佔用的CPU以及記憶體資源,然後通過對這些取樣資料進行分析,形成一個性能分析報告。
效能優化主要有一下幾個方面:
CPU Profile:報告程式的CPU使用情況,按照一定頻率去採集應用程式在CPU和暫存器上面的資料。Memory Profile(Heap Profile):報告程式的記憶體使用情況。Block Profiling: 報告goroutines不在執行狀態的情況,可以用來分析和查詢死鎖等效能瓶頸。Goroutine Profiling: 報告goroutines的使用情況,有哪些roroutines,它們的呼叫關係是怎樣的。注意:我們只應該在效能測試的時候才在程式碼中引入pprof
下載Gin框架專用pprof包並在專案中新增go get https://github.com/gin-contrib/pprof
新增pprof之後的程式碼如下:
package mainimport ( "net/http" "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin")func main() { app := gin.Default() pprof.Register(app) // 效能 app.GET("/test", func(c *gin.Context) { c.String(http.StatusOK, "test") }) app.Run(":3000")}
編譯並執行程式碼。程式碼執行之後可以看到系統自動增加了很多/debug/pprof的API。通過這些API我們可以看到需要的資料。
在瀏覽器裡訪問/debug/pprof, 通過這個頁面我們可以看到我們需要的所有資料:
使用go tool pprof採集資料再新建一個終端視窗輸入以下命令,獲取當前協程的堆疊資訊:
go tool pprof --seconds 20 http://localhost:3000/debug/pprof/goroutine或者採用如下寫法go tool pprof http://localhost:3000/debug/pprof/goroutine?second=20上述命令的意思是採集協程資料並持續20S。執行結果如下:
現在已經進入了命令列模式,在最後一行的pprof後輸入web,會自動開啟本地瀏覽器並訪問相關頁面,當然這隻限於圖形化介面系統,如MacOS,Ubuntu Desktop,Windows等。如果不是,比如說使用的雲伺服器就可能會是如下結果:
在這種情況,我們可以使用資料採集的結果檔案建立新的web服務,以用來在客戶端瀏覽。請注意採集資料時的Saved profile一行,這便是我們需要的資料檔案。啟動新的終端視窗,輸入如下命令:
go tool pprof -http://0.0.0.0:3001 /home/ubuntu/pprof/pprof.rumgo.goroutine.001.pb.gz直接在瀏覽器裡訪問http://ip:3001, 如果沒有安裝graphviz,會出現Could not execute dot;may need to install graphviz。安裝graphviz的方式如下:
brew install graphviz # for macosapt-get install graphviz # for ubuntuyum install graphviz # for centos注:graphviz一定是安裝在伺服器上的哦
在瀏覽器中我們可以看到圖形化的函式呼叫堆疊資訊。右上角的VIEW欄有一些選項,可以點開檢視,Flame Graph就是傳說中的火焰圖。
go tool pprof命令列互動介面
go tool pprof只通過命令列也可以實現強大的功能,在上一節裡我們遇到了一個命令,就是web,接下來再介紹幾個常用的命令。
toptop預設檢視程式中佔用cpu前10位的函式。
top 3 可以檢視程式中佔用CPU前三位的函式。
最後一列為函式名稱,其他各項內容意義如下:
flat:當前函式佔用CPU的耗時flat%:當前函式佔用CPU的耗時百分比sum%:函式佔用CPU的累積耗時百分比cum:當前函式+呼叫當前函式的佔用CPU總耗時cum%: 當前函式+呼叫當前函式的佔用CPU總耗時百分比list我們還可以使用list 函式名命令檢視具體的函式分析,例如:
pdfpdf命令可以生成視覺化的pdf檔案。
helphelp命令可以提供所有pprof支援的命令說明。