golang 的 pprof 是性能分析的神器,包括交互命令行和 UI 圖像化的分析。主要來看看 pprof 支持哪些功能,以及我們?nèi)绾斡盟麃矸治鲂阅堋?/p>
pprof 使用
使用 pprof 需要在代碼里倒入如下的包
import _ "net/http/pprof"
如果沒有跑http server,比如說跑了一個進程,那么需要另起一個 goroutines 跑一下 http server
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
使用交互式命令
- 查看堆棧調(diào)用信息
go tool pprof http://localhost:6060/debug/pprof/heap
- 查看 30 秒內(nèi)的 CPU 信息
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
- 查看 goroutine 阻塞
go tool pprof http://localhost:6060/debug/pprof/block
- 收集 5 秒內(nèi)的執(zhí)行路徑
go tool pprof http://localhost:6060/debug/pprof/trace?seconds=5
- 爭用互斥持有者的堆棧跟蹤
go tool pprof http://localhost:6060/debug/pprof/mutex
UI web 界面
相比較于交互式命令行,這個UI分析工具就比較強大了,包括各種流程圖式的分析,還有火焰圖。但是會麻煩一點,首先我們得導出文件,下面例子是查看堆棧調(diào)用信息,其他相關(guān)信息需要調(diào)相關(guān)接口。
curl -sK -v http://localhost:6060/debug/pprof/heap > heap.out
然后用 go tool 工具 使用該導出文件起一個服務,會自動跳到 UI 界面。這個需要服務器安裝 graphviz
go tool pprof -http=:8080 heap.out
彈出來的 UI 如下。
UI 圖
UI VIEW
UI VIEW 提供多種查看模式,我們可以從下圖看到共有 6 種模式。這里主要需要兩個參數(shù)的意義(
flat
表示堆棧中當前層函數(shù)的內(nèi)存,cum
表示堆棧中直到當前函數(shù)所累積的內(nèi)存)
- Top:類似于 linux top 那種形式。從高到底排序
- Graph:默認彈出來的就是該模式,也就是上一個圖的那種帶有調(diào)用關(guān)系的圖。
- Flame Graph:pprof 火焰圖。
- Peek:類似于 Top 也是從高到底的排序。
- Source:和交互命令式的那種一樣,帶有源碼標注。
- Disassemble:顯示所有的總量。
VIEW
UI SAMPLE
UI SAMPLE 為 VIEW 提供 4 種查詢模式。
- alloc_objects:已分配的對象總量(不管是否已釋放)
- alloc_space:已分配的內(nèi)存總量(不管是否已釋放)
- inuse_objects: 已分配但尚未釋放的對象數(shù)量
- inuse_sapce:已分配但尚未釋放的內(nèi)存數(shù)量
SAMPLE
UI REFINE
UI REFINE 主要是依據(jù)右邊的 Search regexp 輸入框?qū)?SAMPLE 做一些結(jié)果篩選分析,從名字我們可以看到是支持正則的。
REFINE