火焰图基本使用教程

火焰图基本使用教程

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. 参考链接

上一篇:使用火焰图(FlameGraph)分析程序性能


下一篇:五、perf的安装和使用