一. 简介
在日常开发过程中,除了使用 Delve/gdb 对程序进行调试,有时还需要对线上流量进行采样分析,这个时候可以使用 pprof 进行分析。
go 的 pprof 可以用来检测进程的运行数据,可以将一段时间内的运行情况生成文件,通过画图工具将运行情况可视化。
二. 准备工作
安装画图工具 graphviz
- Linux
apt-get install graphviz
- Mac
brew install graphviz
启动 server 时引入 pprof
import _ "net/http/pprof"
启动一个 goroutine 开通 pprof 入口,便于后续通过接口进行采样压测
go func() { http.ListenAndServe("localhost:8080", nil)}()
代码上线后即可通过 8080 端口获取服务状态,运行信息
• 浏览器访问 http://localhost:8080/debug/pprof/
三. 绘图
根据一段时间内运行采样信息,绘制火焰图,仍使用之前服务器开放的端口,seconds 参数不填默认为 30
go tool pprof http://localhost:8080/debug/pprof/profile -seconds 10
- 执行该命令后,进入 pprof 命令行,使用
gif
命令可生成各代码段 CPU 占用时间图 top[N]
可输出 topN 的采样排名列表
• 一段时间后生成xxx.pb.gz
文件,使用该文件进行绘图
使用采样文件生成火焰图
go tool pprof -http=:8081 ~/pprof/xxx.pb.gz
,该命令启动一个新的服务,并在浏览器中启动,使用 8081 端口- 在 web 中的 view 选择火焰图
1. 火焰图
重点信息
- 纵向:调用堆栈
- 横向:CPU 占用时间
重点关注并优化横向过长的代码
修复上线后,再次观察火焰图,并进一步优化
2. Profile
通过 gif 命令生成的 profile 图,效果类似