性能優化是個永恆的話題,而不少時候咱們在做性能優化的時候,每每基於代碼上面的直覺,把全部能想到的優化都優化了一遍,不錯過任何小的優化點,結果整個代碼的邏輯變得極其複雜,而性能上面並無太大的提高。事實上,性能問題每每集中在某些小點,有時候很小的改動就能有巨大的提高,因此問題的關鍵是是怎麼去找出這些優化點,幸運的是 golang 在設計的時候就考慮了這個問題,原生提供了性能分析的工具,能夠很方便地幫咱們找到性能瓶頸git
golang 的性能分析庫在 runtime/pprof
裏,主要提供下面幾個接口github
// 堆棧分析 func WriteHeapProfile(w io.Writer) error // cpu分析 func StartCPUProfile(w io.Writer) error func StopCPUProfile()
使用上面比較簡單,只須要將文件指針傳給對應的函數便可,性能數據將寫入到文件中,而後可使用 golang 自帶的 pprof 工具生成 svg,pdf 的可視化圖,而後就能夠很直觀地從這些圖裏面看到主要的性能消耗了golang
首先須要在你的程序裏面注入 pprof 代碼,下面是一段示例代碼,完整代碼在:https://github.com/hatlonely/hellogolang/blob/master/cmd/pprof_runtime.go,這裏使用的 PPCmd
方法,是爲了方便使用,作的一個簡單封裝,代碼在:https://github.com/hatlonely/easygolang/blob/master/pprof/pprof.gochrome
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
,編譯運行的方法以下:centos
cd $GOPATH/src git clone git@github.com:hatlonely/hellogolang.git cd hellogolang glide install go build cmd/pprof_runtime.go ./pprof_runtime
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
便可性能優化
net/http/pprof
裏面對 runtime/pprof
做了一些封裝,對外提供了 http 接口,能夠直接經過瀏覽器訪問,可是隻是一些字符串的結果,沒有做可視化,體驗並非很好,用 go tool
訪問體驗能好一點服務器
go tool pprof http://localhost:3000/debug/pprof/profile go tool pprof http://localhost:3000/debug/pprof/heap
我的感受這個接口比較雞肋,首先最大的問題是展現上面並不直觀,要是能直接在網頁上面可視化地展現可能還真的挺方便的;還有就是須要額外的提供一個 http 的端口,而這個接口還依賴 net/http
這就意味着若是你的應用使用的是其餘第三方的 http 庫,可能還須要解決兼容性的問題;實際上,我再使用這個接口的時候,在服務器壓力較大的場景下,會出現訪問超時,而這種壓力較大狀況下的性能可能纔是真正的性能瓶頸。框架
建議在根據的需求,本身封裝 runtime/pprof
的接口,固然是用場景比較簡單也能夠用我上面的封裝,而後在服務裏面本身提供一個專門的性能分析接口(多是 gprc,thrift,或者其餘的第三方 http 框架)ide
除了上面生成的 svg 圖,還能夠生成火焰圖,這是 uber 提供的一個工具,在顯示上面可能更直觀一些
安裝命令以下:
go get github.com/uber/go-torch git clone git@github.com:brendangregg/FlameGraph.git export PATH=$PATH:/path/to/FlameGraph
使用方法以下:
go-torch --binaryname=./pprof_runtime --binaryinput=cpu.pprof.201801301415
轉載請註明出處
本文連接:http://hatlonely.github.io/2018/01/29/golang-pprof-性能分析工具/