如何看懂火焰图
火焰图官方主页
什么是火焰图
火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。
火焰图 svg 文件可以通过浏览器打开,它对于调用图的优点是:可以通过点击每个方块来分析它上面的内容。
火焰图的调用顺序从下到上,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。
火焰图特征
- 每一列代表一个调用栈,每一个格子代表一个函数
- 纵轴展示了栈的深度,按照调用关系从下到上排列。最顶上格子代表采样时,正在占用 cpu 的函数。
- 横轴的意义是指:火焰图将采集的多个调用栈信息,通过按字母横向排序的方式将众多信息聚合在一起。需要注意的是它并不代表时间。
- 横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。
- 火焰图格子的颜色是随机的暖色调,方便区分各个调用信息。
- 其他的采样方式也可以使用火焰图, on-cpu 火焰图横轴是指 cpu 占用时间,off-cpu 火焰图横轴则代表阻塞时间。
- 采样可以是单线程、多线程、多进程甚至是多 host
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子。
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
总的来说
- 颜色本身没有什么意义
- 纵向表示调用栈的深度
- 横向表示消耗的时间
上述几个部分分别体现什么
横向来看
- 由于横向表示消耗的时间,所以一个格子的宽度越大越说明其可能是瓶颈
纵向来看
- 由于纵向表示调用栈的深度,所以火焰的火苗尖部就是CPU正在执行的操作
综上
火焰图类型
欢迎关注公众号:程序员财富自由之路
公众号:程序员财富自由之路
博客:CSDN 王小明
关注我们,了解更多
关注后:回复 “idea” 或者 “内推”, 有惊喜
参考资料
- https://juejin.cn/post/6844903802378649607
- https://segmentfault.com/a/1190000017962911
- https://juejin.cn/post/6986437088337985572
- https://www.ruanyifeng.com/blog/2017/09/flame-graph.html
- https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651439006&idx=1&sn=0db8849336cc4172c663a574212ea8db&chksm=80bb616cb7cce87a1dc529e6c8bdcf770e293fc4ce67ede8e1908199480534c39f79803038e3&scene=21#wechat_redirect
- https://jishuin.proginn.com/p/763bfbd37ae2
- https://www.infoq.cn/article/a8kmnxdhbwmzxzsytlga
- https://juejin.cn/post/6986437088337985572
- https://www.cnblogs.com/qcrao-2018/p/11832732.html
- http://guileen.github.io/2016/06/15/how-did-i-optimize-golang-gc/