火焰图基本使用教程
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()
。