火焰图基本使用教程
1. 基本流程
-
下载
FlameGrapth包:https://github.com/brendangregg/FlameGraph,无需安装,直接使用。也可以直接使用命令git clone https://github.com/brendangregg/FlameGraph.git -
perf recocrd -g...(记得要加
-g,这样才会保留调用栈)抓去性能分析数据,会生成perf.data文件,在第二次使用perf record..后,新生成的perf数据为perf.data,旧的perf数据变成了perf.data.old,仅保留最近两次perf数据。
另外,perf抓取的调用栈信息可能存在部分问题,使用时请适当注意。 -
perf script -i filename > out.perf-i filename指定perf数据文件,默认为perf.data,该命令要在perf.data目录下使用。 -
FlameGraph/stackcollapse-perf.pl out.perf > out.folded -
FlameGraph/flamegraph out.folded > out.svg -
简化命令:
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > out.svg
2. 火焰图含义
- y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
- x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
- 火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
- 注意:颜色没有特殊含义
3. 互动性
-
鼠标悬浮:火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。
-
点击放大:在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。左上角会同时显示
Reset Zoom,点击后图片会恢复原样。 -
搜索
Ctrl+F会显示出搜索框,可以搜索想找的函数
4. 示例

最顶层的函数g()占用 CPU 时间最多。d()的宽度最大,但是它直接耗用 CPU 的部分很少。b()和c()没有直接消耗 CPU。因此,如果要调查性能问题,首先应该调查g(),其次是i()。
另外,从图中可知a()有两个分支b()和h(),这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()。
5. 参考链接
</article>