如何为两个Go pprof文件生成差分火焰图?解决stackcollapse-go.pl失效问题
Go程序生成差分火焰图的正确方法
先解决你遇到的stackcollapse-go.pl生成空文件问题
你直接将.pprof二进制文件传入stackcollapse-go.pl是错误的——这个脚本只能处理pprof导出的原始栈文本数据,无法直接解析二进制pprof文件,所以才会生成空文件。
完整的差分火焰图生成步骤
假设你要对比的是CPU性能差异(最常用的场景),按以下步骤操作:
生成有效CPU Profile文件
- 初始版本代码生成
first.pprof:# 针对测试代码的场景 go test -bench=. -run=^$ -cpuprofile first.pprof # 针对运行中程序的场景(需提前在代码中集成pprof,或用pprof远程采集) go tool pprof -output first.pprof http://localhost:6060/debug/pprof/profile?seconds=30 - 优化代码后,在相同负载、相同运行环境下生成
second.pprof,确保两个profile的采样条件一致,否则差分结果无参考意义。
- 初始版本代码生成
将pprof文件转换为折叠栈格式
用go tool pprof导出原始栈数据,再传入stackcollapse-go.pl处理:# 处理初始版本 go tool pprof -raw first.pprof | ./stackcollapse-go.pl > before.folded # 处理优化后版本 go tool pprof -raw second.pprof | ./stackcollapse-go.pl > after.folded生成差分折叠栈文件
使用difffolded.pl对比两个折叠栈文件,得到差异数据:./difffolded.pl before.folded after.folded > diff.folded生成差分火焰图
用flamegraph.pl将差分数据转为可视化的SVG火焰图:# --negate参数会将优化后减少的耗时标为蓝色,增加的标为红色 ./flamegraph.pl --title "Go程序性能优化差分火焰图" --negate diff.folded > diff.svg
关键注意事项
- 确保你使用的
stackcollapse-go.pl、difffolded.pl、flamegraph.pl是适配Go程序的版本,脚本需支持解析Go的栈格式。 - 若你要分析的是内存(heap)或其他类型的profile,需对应使用适配的折叠脚本(比如
stackcollapse-go.pl主要处理CPU栈,heap profile可能需要调整处理方式)。 - 先通过
go tool pprof first.pprof进入交互模式,执行top命令检查pprof文件是否有有效数据,避免因原始profile为空导致后续步骤出错。
内容的提问来源于stack exchange,提问作者luxin.chen
相关产品推荐
相关产品推荐

