pprof 功能有2種開(kāi)啟方式,對(duì)應(yīng)兩種包:
- net/http/pprof:使用服務(wù)器的場(chǎng)景
- runtime/pprof:使用在非服務(wù)器應(yīng)用程序的場(chǎng)景
這兩個(gè)本質(zhì)上是一致的,net/http/pporf 也只是在 runtime/pprof 上的一層 web 封裝
pprof 支持四種類型的分析:
- CPU
CPU 分析,采樣消耗 cpu 的調(diào)用,這個(gè)一般用來(lái)定位排查程序里耗費(fèi)計(jì)算資源的地方。 - Memory
內(nèi)存分析,一般用來(lái)排查內(nèi)存占用,內(nèi)存泄露等問(wèn)題。 - Block
阻塞分析,會(huì)采樣程序里阻塞的調(diào)用情況。 - Mutex
互斥鎖分析,采樣互斥鎖的競(jìng)爭(zhēng)情況。
一個(gè)簡(jiǎn)單的例子
package main
import (
"fmt"
"net/http"
_ "net/http/pprof"
)
var datas []string
func add(s string) []string {
datas = append(datas, s)
return datas
}
func main() {
go func() {
for {
fmt.Println(add("hello world"))
}
}()
http.ListenAndServe("0.0.0.0:6060", nil)
}
直接web訪問(wèn):http://127.0.0.1:6060/debug/pprof/

需要注意的是:默認(rèn)情況下是不會(huì)追蹤 block 和 mutex 信息的,如果想要看這2個(gè)信息,需要在代碼中加入:
runtime.SetBlockProfileRate(1) // 開(kāi)啟對(duì)阻塞操作的跟蹤,block
runtime.SetMutexProfileFraction(1) // 開(kāi)啟對(duì)鎖調(diào)用的跟蹤,mutex
這上面最能看出來(lái)的是 goroutine,可以從上面看出當(dāng)前系統(tǒng) goroutine 數(shù)量,這個(gè)對(duì)于定位 goroutine 數(shù)量泄漏非常方便。
分析數(shù)據(jù)
用 go tool pprof 工具可進(jìn)行數(shù)據(jù)的分析。
命令格式:
go tool pprof [binary] [source]
- binary 是應(yīng)用的二進(jìn)制文件,用來(lái)解析各種符號(hào),也可以不填。
- source 表示 profile 數(shù)據(jù)的來(lái)源,可以是本地的文件,也可以是 http 地址。
舉例:
# cpu profile
go tool pprof http://127.0.0.1:6060/debug/pprof/profile
運(yùn)行上述命令將會(huì)采樣半分鐘的cpu數(shù)據(jù)并進(jìn)入一個(gè)交互界面,可以通過(guò)輸入命令查看分析結(jié)果:

接著我們可以輸入一些命令,來(lái)獲取一些信息:
-
top
列出cpu占用高的函數(shù)
image.png還可以使用
top20查看前20個(gè)函數(shù)。 list
還可以使用list 函數(shù)名命令查看具體的函數(shù)分析,例如執(zhí)行l(wèi)ist logicCode查看我們編寫的函數(shù)的詳細(xì)分析。traces
列出函數(shù)調(diào)用棧
-
svg
可以生成圖形的形式查看當(dāng)前資源監(jiān)控。需要事先安裝 graphviz。
image.png
內(nèi)存分配相關(guān)的數(shù)據(jù)查看
- 查看當(dāng)前內(nèi)存分配數(shù)據(jù)
go tool pprof -inuse_space http://127.0.0.1:8080/debug/pprof/heap go tool pprof -inuse_objects http://127.0.0.1:8080/debug/pprof/heap - 查看總共的內(nèi)存分配數(shù)據(jù)
go tool pprof -alloc_space http://127.0.0.1:8080/debug/pprof/heap go tool pprof -alloc_objects http://127.0.0.1:8080/debug/pprof/heap
火焰圖
golang性能監(jiān)控結(jié)果可以轉(zhuǎn)換成火焰圖來(lái)進(jìn)行直觀展示。
有兩種方式:go-torch(golang version < 1.10)和 golang原生的pprof(golang version > 1.10+的pprof集成了火焰圖功能)。
這里只介紹golang官方的火焰圖。
go tool pprof -http=:6061 http://localhost:6060/debug/pprof/profile
從執(zhí)行命令的過(guò)程,可以看到pprof工具 http://localhost:6060/debug/pprof/profile 獲取監(jiān)控?cái)?shù)據(jù),并保存到地:xxx.005.pb.gz。
然后對(duì)該文件進(jìn)行分析,并啟動(dòng)一個(gè)Web服務(wù)器:http://localhost:6061??梢詮牡谝恍械牟藛沃星袚QView,選擇Flame Graph即可顯示火焰圖。
火焰圖的調(diào)用順序從下到上,每個(gè)方塊代表一個(gè)函數(shù),它上面一層表示這個(gè)函數(shù)會(huì)調(diào)用哪些函數(shù),方塊的大小代表了占用資源值的多少(例如,CPU使用時(shí)間的長(zhǎng)短,內(nèi)存使用的大小等)。
pprof 與測(cè)試的結(jié)合
go test 命令有兩個(gè)參數(shù)和 pprof 相關(guān),它們分別指定生成的 CPU 和 Memory profiling 保存的文件:
- cpuprofile:cpu profiling 數(shù)據(jù)要保存的文件地址
- memprofile:memory profiling 數(shù)據(jù)要報(bào)文的文件地址
比如下面執(zhí)行測(cè)試的同時(shí),也會(huì)執(zhí)行 CPU profiling,并把結(jié)果保存在 cpu.prof 文件中:
go test -bench . -cpuprofile=cpu.prof
參考資料
1、Go語(yǔ)言之pprof的性能調(diào)優(yōu)
2、https://mp.weixin.qq.com/s/SvzMEdhxHfI9hYU62r1C7g
3、https://zhuanlan.zhihu.com/p/396363069
4、https://zhuanlan.zhihu.com/p/265080950

