這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
原文: A Short Survey of PProf Visualization Tools by Jordan Crabtree。
調試CPU相關的問題經常會涉及關於趨勢的微妙問題。堆使用的峰值是否逐漸的增長? routine在什麼地方被調用,調用的頻度如何?
一圖勝千言。
一張圖片就可以提供很多有用的上下文資訊,否則如果用語言解釋起來累的半死。將pprof可視化顯示可以將有用的CPU統計資料與整個時間的上下文關聯起來。
pprof 是什嗎?
PProf是一個CPU分析器( cpu profiler), 它是gperftools工具的一個組件, 由Google工程師為分析多線程的程式所開發。
Go標準庫中的pprof package通過HTTP的方式為pprof工具提供資料。
(譯者註:不止這個包,runtime/pprof還可以為控制台程式或者測試程式產生pprof資料)
既然pprof資料通過HTTP提供,所以它需要在你的應用中運行一個web伺服器。可以通過 import pprof的副作用(這裡副作用 side-effect 是指引入這個包讓其初始化,不是貶義詞), 這個包就可以在預設的web伺服器中註冊它的handler,並補需要其它額外的操作。
下面是一個使用pprof長時間啟動並執行例子:
1234567891011 |
import ("log""net/http"_ "net/http/pprof")func main(){go func() {log.Println(http.ListenAndServe("localhost:6060", nil))}()... |
使用 pprof
pprof能夠藉助grapgviz產生程式的調用圖。預設情況下pprof基於對程式的30秒採樣產生調用圖。
- 圖中的連線代表對方法的調用, 連線上的標籤代表指定的方法調用的採樣值(譯者註:go tool pprof顯示的是調用時間)。
- 方框的大小與方法啟動並執行採樣值的大小有關。
- 每個方框由兩個標籤:一個是方法啟動並執行時間佔比,一個是它在採樣的堆棧中出現的時間佔比(譯者註: 前者你可以看成flat時間,後者看成cumulate時間)。
在Mac上安裝工具:
12 |
$ brew install gperftools$ brew install graphviz |
1 |
$ pprof --web localhost:6060/debug |
譯者注:
我並沒有使用上面的工具,因為Go開發環境已經整合了pprof工具,所以你不需要安裝gperftools工具,而且使用的命令和上面的命令不一樣。
當然graphviz是必裝的。
你可以通過下面的命令採集30s的資料並產生SVG調用圖:
1 |
go tool pprof -web http://10.75.25.126:9091/debug/pprof/profile |
go-torch
go-torch是uber開發的一個工具,使用效能分析的專家Brendan Gregg (譯者註:口口相傳的效能分析的工具圖就是來自他, 效能之巔一書的作者。看他的網站可以學到很多效能相關的知識)的指令碼產生火焰圖。
和pprof一樣,它也採用30秒的採樣資料產生火焰圖。
- 棧幀(Stack frame,調用鏈)垂直堆疊,顯示棧的深度
- 幀的寬度代表一個方法的啟動並執行時間佔比
- 如果一個方法被調用者調用,它會顯示多次,分列在不同的調用者的堆棧上。(譯者註:這點和pprof工具不同,pprof至顯示一個方法的框,上面的時間標籤是所有的調用者調用的時間)
- 顏色是任意的(arbitrary), 橫座標根據字母順序排列
安裝
需要安裝go-torch工具和brandangregg的火焰圖產生指令碼:
123 |
$ go get github.com/uber/go-torch$ git clone git@github.com:brendangregg/FlameGraph.git$ export PATH-$PATH:/path/to/FlameGraph |
1 |
go-torch --file "torch.svg" --url http://localhost:6060 |
GOM
gom是一個即時的 curses-風格的命令列工具,由Google的工程師Jaana Dogan開發。
- 可以顯示啟動並執行goroutine和機器線程數
- 即時更新
- 出現可視化,gom還提供了基於文本的CPU和heap的資料
1 |
$ go get github.com/rakyll/gom/cmd/gom |
通過 import gom, gom同樣可以註冊額外的handler在預設的伺服器上,就像pprof一樣。
123 |
import (_ "github.com/rakyll/gom/http") |
1 |
$ gom --target http://localhost:6060 |
Debug charts
Debug charts是由Marko Kevac開發的一個工具,使用plotly.js庫來為啟動並執行程式建立一個可視化的web視圖。
- 運行在瀏覽器中
- 可視化gc pause,記憶體配置和cpu佔用等資訊
- 即時更新
通過import debugcharts,可以為預設的web伺服器註冊額外的handler,就像pprof、gom一樣。
123 |
import (_ "github.com/mkevac/debugcharts") |
然後訪問 localhost:6060/debug/charts
就可以顯示相關的即時效能圖表了。