如何看懂火焰图

简介: 如何看懂火焰图

什么是火焰图


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

image.png

火焰图 svg 文件可以通过浏览器打开,它对于调用图的优点是:可以通过点击每个方块来分析它上面的内容。

火焰图的调用顺序从下到上,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。

火焰图特征

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

火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子。

在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。

按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。

总的来说

  • 颜色本身没有什么意义
  • 纵向表示调用栈的深度
  • 横向表示消耗的时间

上述几个部分分别体现什么


横向来看

  • 由于横向表示消耗的时间,所以一个格子的宽度越大越说明其可能是瓶颈

纵向来看

  • 由于纵向表示调用栈的深度,所以火焰的火苗尖部就是CPU正在执行的操作

综上

  • 主要看那些比较宽大的火苗
  • 特别是那些平头的火苗

火焰图类型

image.png

相关文章
|
流计算 Java 监控
如何分析及处理 Flink 反压?
反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题。反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速。
如何分析及处理 Flink 反压?
idea实现protobuf的.proto文件编译成.java文件教程
1..proto文件语法高亮显示1.1 打开idea的插件列表1.2 下载protobuf辅助插件1.3 安装好后重启idea 在项目中新增配置生成环境 1.6.1
13859 0
|
JavaScript
性能工具之 FlameGraph 火焰图
其实很多类似 perf 的工具都能生成火焰图,像 systemtap/dtrace 之类的 并且这个思路,现在在 js 优化、代码优化等各方面都有具体的应用了 至于怎么理解? 简单点说,就是看谁又平又宽
285 7
性能工具之 FlameGraph 火焰图
|
存储 缓存 弹性计算
重新审视 CXL 时代下的分布式内存
从以太网到 RDMA 再到 CXL,标志着互连技术的重大突破。
|
SQL 监控 安全
架构设计第五讲:数据巡检系统的设计与应用
架构设计第五讲:数据巡检系统的设计与应用
753 0
|
JSON 监控 Java
Java中如何解决JsonProcessingException异常?
Java中如何解决JsonProcessingException异常?
|
关系型数据库 MySQL Java
译 | Off-CPU Flame Graphs
译 | Off-CPU Flame Graphs
376 0
|
关系型数据库 MySQL 调度
深入理解MySQL InnoDB线程模型
深入理解MySQL InnoDB线程模型
|
Linux 调度
Linux系统调试篇——Perf性能分析指南
Linux系统调试篇——Perf性能分析指南
|
Arthas 测试技术 网络安全
Profiler 生成火焰图 | 学习笔记
快速学习 Profiler 生成火焰图
Profiler 生成火焰图 | 学习笔记