golang pprof 效能分析工具

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

效能最佳化是個永恒的話題,而很多時候我們在作效能最佳化的時候,往往基於代碼上面的直覺,把所有能想到的最佳化都最佳化了一遍,不錯過任何小的最佳化點,結果整個代碼的邏輯變得極其複雜,而效能上面並沒有太大的提升。事實上,效能問題往往集中在某些小點,有時候很小的改動就能有巨大的提升,所以問題的關鍵是是怎麼去找出這些最佳化點,幸運的是 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.yyyymmddhhmmssmem.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...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.