背景
最近在排查一个server的性能问题时,用到了golang的火焰图,总结一下步骤;
问题现象
正常请求性能没问题,并发上千后,响应时间急剧增长;
工具
- 数据收集:golang自带cpu分析工具:pprof
- 压力测试工具:根据业务自行选择
- 分析数据:可用go pprof或go-torch工具
- 其它依赖工具:安装brew install graphviz / yum install graphviz
- 在你的main文件里import _ "net/http/pprof",如下图
import(
"log"
"net/http"
_"net/http/pprof"//引入就好了
"regexp"
)
- 使用http启动获取pprof收集内容的接口
- 启动服务
- 使用工具进行打压,压至程序问题暴露
- 使用go tool pprof http://localhost:9999/pprof/profile收集数据,收集30s后在进入命令行模式后输入quit退出,会生成名为【pprof.二进制名.samples.cpu.00x.pb.gz】的文件,默认放到$HOME/pprof/下
- 使用go tool pprof -http=:8080 [步骤5中生成的文件]解释数据并生成调用栈graph图示,点击view切换成火焰图,如下图:
- 火焰图(或者叫冰柱图)会默认从左到右按处理时间从大到小排列,方便定位问题;
- 根据火焰图的结果,分析程序响应变慢时,哪个函数占据了更多的处理时间,可以更直观的定位问题;