火焰图使用详解

2021-12-01 warehouse

通过火焰图可以有效观察资源消耗在那,不重要的会自然淡化甚至消失,而真正重要的代码路径则会突显,从而提供恰到好处的信息,不多也不少。

介绍

火焰图是通过采样方式获取的调用栈信息,纵轴代表了调用栈的深度,横轴没有明显的指代关系,但是宽度可以标识调用时长。

大部分的文章基本都是源自 Flame Graphs 中的介绍,可以从 Github FlameGraph 下载相关的脚本。

然后通过如下命令生成火焰图。

----- 记录Perf事件,其中-F指定频率,-p 指定进程ID
# perf record -F 99 -ag -p <PID>
----- 对采集数据进行解析,这样可以直接复制到本地机器处理
# perf script -i perf.data > perf.unfold
----- 将符号进行折叠
# FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
----- 最后生成火焰图
# FlameGraph/flamegraph.pl perf.folded > perf.svg

如果出现 Unknown 问题,可以在 record 时增加 --call-graph dwarf 参数。

参考

  • GoTorch 由 Uber 开发的火焰图工具,通过 GoLang 开发,当前建议使用 pprof 工具,还可以参考 Rust 的实现。
  • FlameGraph 官方的工具仓库,用于直接下载执行。