使用 pprof 调试 Golang 服务

2022年2月6日 13:12

一. 简介

在日常开发过程中,除了使用 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. 火焰图

flame-graph

重点信息

  • 纵向:调用堆栈
  • 横向:CPU 占用时间

重点关注并优化横向过长的代码

修复上线后,再次观察火焰图,并进一步优化

2. Profile

profile-graph

通过 gif 命令生成的 profile 图,效果类似