简介

pprof 是 golang 自带的性能分析工具,可以查看web应用的运行状态,分析程序CPU,内存,goroutine等使用情况。

golang 针对不同使用场景,提供了以下两种方式开启pprof性能分析

runtime/pprof:采集程序(非 Server)的运行数据进行分析
net/http/pprof:采集 HTTP Server 的运行时数据进行分析
  • 开启pprof,举个栗子
package mainimport ("net/http"_ "net/http/pprof"
)func main () {// 通过协程开启pprof数据采集go func(){_ = http.ListenAndServe("0.0.0.0:6060", nil)}()// 业务代码doSomeThing...
}

通过嵌入以上代码,程序将会自动采集运行时指标。

  • 通过web界面分析

打开浏览器,访问http://127.0.0.1:6060/debug/pprof/

/debug/pprof/Types of profiles available:
Count	Profile
10	allocs                 
0	block
0	cmdline
93	goroutine
10	heap
0	mutex
0	profile
12	threadcreate
0	trace
full goroutine stack dumpProfile Descriptions:allocs: 过去所有内存分配的采样block: 导致同步原语阻塞的堆栈跟踪cmdline: 当前程序的命令行调用goroutine: 所有当前goroutine的堆栈跟踪heap: 活动对象内存分配的采样mutex: 互斥锁的堆栈跟踪profile: CPU使用情况threadcreate: 导致创建新OS线程的堆栈跟踪 trace:当前程序的执行跟踪.

一般goroutine导致的内存泄露,goroutine 的count数值会异常偏大。

  • 通过交互命令分析

执行以下命令,等待60秒。pprof会采集CPU信息,结束后进入命令行模式

go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=60
Fetching profile over HTTP from http://127.0.0.1:8888/debug/pprof/profile?seconds=60
Saved profile in C:\Users\2837.GOLDENTECAD\pprof\pprof.samples.cpu.001.pb.gz
Type: cpu
Time: Oct 28, 2021 at 3:09pm (CST)
Duration: 1mins, Total samples = 30ms ( 0.05%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

输入 web 命令,可在弹出的浏览器窗口看到cpu占用情况;
输入 pdf 命令,会生成一张pdf文件;
输入 top10,会显示前10 最消耗cpu的程序片断;

(pprof) top10
Showing nodes accounting for 30ms, 100% of 30ms total
Showing top 10 nodes out of 15flat  flat%   sum%        cum   cum%10ms 33.33% 33.33%       10ms 33.33%  runtime.checkTimers10ms 33.33% 66.67%       10ms 33.33%  runtime.lock210ms 33.33%   100%       10ms 33.33%  sync.(*Pool).pin
...descriptionflat:给定函数上运行耗时flat%:同上的 CPU 运行耗时总比例sum%:给定函数累积使用 CPU 总比例cum:当前函数加上它之上的调用运行总耗时cum%:同上的 CPU 运行耗时总比例

执行以下命令, pprof会分析内存占用信息,并进入命令行模式

go tool pprof http://127.0.0.1:6060/debug/pprof/heap
Fetching profile over HTTP from http://127.0.0.1:8888/debug/pprof/heap
Saved profile in C:\Users\2837.GOLDENTECAD\pprof\pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Type: inuse_space
Time: Oct 28, 2021 at 3:15pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

同上也可输入 web,pdf,top10 等命令查看具体信息

  • 参考:
https://segmentfault.com/a/1190000016412013