golang pprof 性能分析工具

性能優化是個永恆的話題,而不少時候咱們在做性能優化的時候,每每基於代碼上面的直覺,把全部能想到的優化都優化了一遍,不錯過任何小的優化點,結果整個代碼的邏輯變得極其複雜,而性能上面並無太大的提高。事實上,性能問題每每集中在某些小點,有時候很小的改動就能有巨大的提高,因此問題的關鍵是是怎麼去找出這些優化點,幸運的是 golang 在設計的時候就考慮了這個問題,原生提供了性能分析的工具,能夠很方便地幫咱們找到性能瓶頸git

pprof 簡介

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.yyyymmddhhmmssmem.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 文件分析

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/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-性能分析工具/

相關文章
相關標籤/搜索