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``"包,并在主函数中添加以下代码:

  1. import _ "net/http/pprof"
  2. go func() {
  3. http.ListenAndServe(":6060", nil)
  4. }()
  5. // net/http/pprof包的init函数中注册了以下路由到http服务中
  6. func init() {
  7. http.HandleFunc("/debug/pprof/", Index)
  8. http.HandleFunc("/debug/pprof/cmdline", Cmdline)
  9. http.HandleFunc("/debug/pprof/profile", Profile)
  10. http.HandleFunc("/debug/pprof/symbol", Symbol)
  11. http.HandleFunc("/debug/pprof/trace", Trace)
  12. }

用浏览器打开http://localhost:6060/debug/pprof/,即可使用pprof提供的功能。
image.png

  • 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的函数。

  1. go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60
  2. top10

执行该命令后,等待60s(可调整),pprof会进行CPU Profiling。结束后将默认进入pprof的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行pprof help查看。
image.png

flat:给定函数上运行耗时 flat%:同上的 CPU 运行耗时总比例 sum%:给定函数累积使用 CPU 总比例 cum:当前函数加上它之上的调用运行总耗时 cum%:同上的 CPU 运行耗时总比例

执行go tool pprof http://localhost:6060/debug/pprof/heap -> top10,查看内存占用前10的函数。

实际使用

  1. 若web框架使用的是beego,则可采用beego框架集成的pprof(需要在app.conf中打开EnableAdmin并配置AdminPort,参考进程内监控)。其他框架则需要自行打开pprof。
  2. 在容器中wget -O - http://localhost:port/prof?command=get%20memprof(相关Url可通过本地运行代码后打开localhost:port在F12上看到)
  3. 生成mem-X.memprof,拷贝到本机
  4. go tool pprof mem-X.memprof
  5. top20

参考文章

Golang 大杀器之性能剖析 PProf
pprof简介