這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
效能最佳化是個永恒的話題,而很多時候我們在作效能最佳化的時候,往往基於代碼上面的直覺,把所有能想到的最佳化都最佳化了一遍,不錯過任何小的最佳化點,結果整個代碼的邏輯變得極其複雜,而效能上面並沒有太大的提升。事實上,效能問題往往集中在某些小點,有時候很小的改動就能有巨大的提升,所以問題的關鍵是是怎麼去找出這些最佳化點,幸運的是 golang 在設計的時候就考慮了這個問題,原生提供了效能分析的工具,可以很方便地幫我們找到效能瓶頸
pprof 簡介
golang 的效能分析庫在 runtime/pprof 裡,主要提供下面幾個介面
// 堆棧分析func WriteHeapProfile(w io.Writer) error// cpu分析func StartCPUProfile(w io.Writer) errorfunc StopCPUProfile()
使用上面比較簡單,只需要將檔案指標傳給對應的函數即可,效能資料將寫入到檔案中,然後可以使用 golang 內建的 pprof 工具產生 svg,pdf 的可視化圖,然後就可以很直觀地從這些圖裡面看到主要的效能消耗了
舉個例子
首先需要一個程式
首先需要在你的程式裡面注入 pprof 代碼,下面是一段範例程式碼,完整代碼在:https://github.com/hatlonely/...
func main() { go doSomething1() go doSomething2() go doSomething3() if err := pprof.PPCmd("cpu 10s"); err != nil { panic(err) } if err := pprof.PPCmd("mem"); err != nil { panic(err) }}
編譯,運行上面代碼會產生兩個 pprof 檔案,cpu.pprof.yyyymmddhhmmss 和 mem.pprof.yyyymmddhhmmss,編譯啟動並執行方法如下:
cd $GOPATH/srcgit clone git@github.com:hatlonely/hellogolang.gitcd hellogolangglide installgo build cmd/pprof_runtime.go./pprof_runtime
pprof 檔案分析
pprof 檔案是二進位的,不是給人讀的,需要翻譯一下,而 golang 原生就給我們提供了分析工具,直接執行下面命令即可,會產生一張很直觀的 svg 圖片,直接用 chrome 就可以開啟,當然也可以產生別的格式(pdf,png 都可以),可以用 go tool pprof -h 命令查看支援的輸出類型
go tool pprof -svg ./pprof_runtime cpu.pprof.201801301415 > cpu.svg
注意這個工具依賴於 graphviz 工具,Mac 上可用 brew install graphviz,centos yum install graphviz 即可
http 介面
net/http/pprof 裡面對 runtime/pprof 作了一些封裝,對外提供了 http 介面,可以直接通過瀏覽器訪問,但是只是一些字串的結果,沒有作可視化,體驗並不是很好,用 go tool 訪問體驗能好一點
go tool pprof http://localhost:3000/debug/pprof/profilego tool pprof http://localhost:3000/debug/pprof/heap
個人感覺這個介面比較雞肋,首先最大的問題是展示上面並不直觀,要是能直接在網頁上面可視化地展示可能還真的挺方便的;還有就是需要額外的提供一個 http 的連接埠,而這個介面還依賴 net/http這就意味著如果你的應用使用的是其他第三方的 http 庫,可能還需要解決相容性的問題;實際上,我再使用這個介面的時候,在伺服器壓力較大的情境下,會出現訪問逾時,而這種壓力較大情況下的效能可能才是真正的效能瓶頸。
建議在根據的需求,自己封裝 runtime/pprof 的介面,當然是用情境比較簡單也可以用我上面的封裝,然後在服務裡面自己提供一個專門的效能分析介面(可能是 gprc,thrift,或者其他的第三方 http 架構)
火焰圖
除了上面產生的 svg 圖,還可以產生火焰圖,這是 uber 提供的一個工具,在顯示上面可能更直觀一些
安裝命令如下:
go get github.com/uber/go-torchgit clone git@github.com:brendangregg/FlameGraph.gitexport PATH=$PATH:/path/to/FlameGraph
使用方法如下:
go-torch --binaryname=./pprof_runtime --binaryinput=cpu.pprof.201801301415
參考連結
- Package pprof: https://golang.org/pkg/runtim...
- Profiling Go Programs: https://blog.golang.org/profi...
- Go torch: https://github.com/uber/go-torch
轉載請註明出處
本文連結:http://hatlonely.github.io/20...