美文网首页
火焰图(Flame Graphs)

火焰图(Flame Graphs)

作者: wayyyy | 来源:发表于2021-05-01 22:04 被阅读0次

火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。

image.png

火焰图整个图形看起来就像一个跳动的火焰,这就是它名字的由来:

  • 每一列代表一个调用栈,每一个格子代表一个函数
  • 纵轴展示了栈的深度,按照调用关系从下到上排列,最顶上格子代表采样时,正在占用 cpu 的函数。
  • 横轴的意义是指:火焰图将采集的多个调用栈信息,通过按字母横向排序的方式将众多信息聚合在一起。需要注意的是它并不代表时间。
  • 横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。
  • 火焰图格子的颜色是随机的暖色调,方便区分各个调用信息。
  • 其他的采样方式也可以使用火焰图, on-cpu 火焰图横轴是指 cpu 占用时间,off-cpu 火焰图横轴则代表阻塞时间。
  • 采样可以是单线程、多线程、多进程甚至是多 host,进阶用法可以参考附录进阶阅读
火焰图类型

常见的火焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 。

火焰图类型 横轴含义 纵轴含义 解决问题 采样方式
On-CPU CPU 占用时间 调用栈 找出CPU占用高的问题函数,分析代码热路径 固定频率采样CPU调用栈
火焰图分析技巧
  • 纵轴代表调用栈的深度(栈桢数),用于表示函数间调用关系:下面的函数是上面函数的父函数。
  • 横轴代表调用频次,一个格子的宽度越大,越说明其可能是瓶颈原因。
  • 不同类型火焰图适合优化的场景不同,比如 on-cpu 火焰图适合分析 cpu 占用高的问题函数,off-cpu 火焰图适合解决阻塞和锁抢占问题。
  • 无意义的事情:横向先后顺序是为了聚合,跟函数间依赖或调用关系无关;火焰图各种颜色是为方便区分,本身不具有特殊含义

多练习:进行性能优化有意识的使用火焰图的方式进行性能调优(如果时间充裕)

如何绘制火焰图

Github上有 Brendan D. Gregg 的 Flame Graph 工程实现了一套生成火焰图的脚本.我们可以直接克隆下来直接用。

# git clone https://github.com/brendangregg/FlameGraph.git

生成火焰图,一般遵循一下流程:

  • 捕获堆栈
    使用perf捕捉进程运行堆栈信息

  • 折叠堆栈

    # perf script -i /root/perf.data &> /root/perf.unfold
    

    用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠

    # ./stackcollapse-perf.pl /root/perf.unfold &> /root/perf.folded
    
  • 生成火焰图

    ./flamegraph.pl /root/perf.folded > /root/perf.svg
    

    浏览器打开。


参考资料
1、https://zhuanlan.zhihu.com/p/147875569
2、https://cloud.tencent.com/developer/article/1656810

相关文章

网友评论

      本文标题:火焰图(Flame Graphs)

      本文链接:https://www.haomeiwen.com/subject/jglnrltx.html