性能優化是個永恆的話題,而很多時候我們在作性能優化的時候,往往基於代碼上面的直覺,把所有能想到的優化都優化了一遍,不錯過任何小的優化點,結果整個代碼的邏輯變得極其復雜,而性能上面並沒有太大的提升。事實上,性能問題往往集中在某些小點,有時候很小的改動就能有巨大的提升,所以問題的關鍵是是怎么去找出這些優化點,幸運的是 golang 在設計的時候就考慮了這個問題,原生提供了性能分析的工具,可以很方便地幫我們找到性能瓶頸
pprof 簡介
golang 的性能分析庫在 runtime/pprof
里,主要提供下面幾個接口
// 堆棧分析 func WriteHeapProfile(w io.Writer) error // cpu分析 func StartCPUProfile(w io.Writer) error func 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/src git clone git@github.com:hatlonely/hellogolang.git cd hellogolang glide install go 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
即可