You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为两个Go pprof文件生成差分火焰图?解决stackcollapse-go.pl失效问题

Go程序生成差分火焰图的正确方法

先解决你遇到的stackcollapse-go.pl生成空文件问题

你直接将.pprof二进制文件传入stackcollapse-go.pl是错误的——这个脚本只能处理pprof导出的原始栈文本数据,无法直接解析二进制pprof文件,所以才会生成空文件。

完整的差分火焰图生成步骤

假设你要对比的是CPU性能差异(最常用的场景),按以下步骤操作:

  1. 生成有效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的采样条件一致,否则差分结果无参考意义。
  2. 将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
    
  3. 生成差分折叠栈文件
    使用difffolded.pl对比两个折叠栈文件,得到差异数据:

    ./difffolded.pl before.folded after.folded > diff.folded
    
  4. 生成差分火焰图
    用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:01:05