pprof是什么
pprof 是一个强大的性能分析工具,可以捕捉到多维度的运行状态的数据,下面简单介绍一下pprof的用法。
golang在语言层面集成了profile采样工具,在程序运行过程中可以获取cpu、heap、block、traces等执行信息,这些会涉及到runtime/pprof、net/http/pprof、runtime/trace等package。
pprof的使用
一般情况下,获取profile数据最有两种形式:web形式与profile文件生成形式。
Web方式
引入"``net/http/pprof``"包,并在主函数中添加以下代码:
import _ "net/http/pprof"go func() {http.ListenAndServe(":6060", nil)}()// net/http/pprof包的init函数中注册了以下路由到http服务中func init() {http.HandleFunc("/debug/pprof/", Index)http.HandleFunc("/debug/pprof/cmdline", Cmdline)http.HandleFunc("/debug/pprof/profile", Profile)http.HandleFunc("/debug/pprof/symbol", Symbol)http.HandleFunc("/debug/pprof/trace", Trace)}
用浏览器打开http://localhost:6060/debug/pprof/,即可使用pprof提供的功能。
- block
报告协程阻塞的情况,可以用来分析和查找死锁等性能瓶颈,默认不开启, 需要调用runtime.SetBlockProfileRate(rate)开启。(rate:采样阻塞的频率)
- goroutine
报告协程相关信息,可以用来查看有哪些协程正在运行、有多少协程在运行等。两种查看方式:
http://ip:port/debug/pprof/goroutine?debug=1,查看某条调用路径上,当前阻塞在此的goroutine的数量。
http://ip:port/debug/pprof/goroutine?debug=2,查看所有goroutine的运行栈,可以显示阻塞在此的时间。
- heap
查看堆相关信息,包括一些GC的信息
- mutex
查看互斥的争用情况,默认不开启, 需要调用需要在程序中调用runtime.SetMutexProfileFraction。
Profile方式
执行go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60 -> top10,查看CPU占用前10的函数。
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60top10
执行该命令后,等待60s(可调整),pprof会进行CPU Profiling。结束后将默认进入pprof的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行pprof help查看。
flat:给定函数上运行耗时flat%:同上的 CPU 运行耗时总比例sum%:给定函数累积使用 CPU 总比例cum:当前函数加上它之上的调用运行总耗时cum%:同上的 CPU 运行耗时总比例
执行go tool pprof http://localhost:6060/debug/pprof/heap -> top10,查看内存占用前10的函数。
实际使用
- 若web框架使用的是beego,则可采用beego框架集成的pprof(需要在app.conf中打开EnableAdmin并配置AdminPort,参考进程内监控)。其他框架则需要自行打开pprof。
- 在容器中
wget -O - http://localhost:port/prof?command=get%20memprof(相关Url可通过本地运行代码后打开localhost:port在F12上看到) - 生成
mem-X.memprof,拷贝到本机 go tool pprof mem-X.memproftop20
