首頁>技術>

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,接下來再介紹幾個常用的命令。

top

top預設檢視程式中佔用cpu前10位的函式。

top 3 可以檢視程式中佔用CPU前三位的函式。

最後一列為函式名稱,其他各項內容意義如下:

flat:當前函式佔用CPU的耗時flat%:當前函式佔用CPU的耗時百分比sum%:函式佔用CPU的累積耗時百分比cum:當前函式+呼叫當前函式的佔用CPU總耗時cum%: 當前函式+呼叫當前函式的佔用CPU總耗時百分比list

我們還可以使用list 函式名命令檢視具體的函式分析,例如:

pdf

pdf命令可以生成視覺化的pdf檔案。

help

help命令可以提供所有pprof支援的命令說明。

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • tutorial第二部分/Ember Data