快速定位系统瓶颈 -- 用 Arthas 生成火焰图
2021-01-08 11:14:32 最后更新: 2021-01-08 11:15:12 访问数量:61
2021-01-08 11:14:32 最后更新: 2021-01-08 11:15:12 访问数量:61
上一篇文章中,我们系统介绍了阿里巴巴公司开源的 java 性能分析工具箱 -- Arthas:
Arthas 集成了大量十分易用、好用的工具,可以帮助我们分析系统运行情况、发现问题、解决问题。
本文我们就来介绍其中一个十分关键的一个工具 -- 火焰图的生成工具 profiler。
分析一个接口性能的消耗在哪里在系统优化工作中是最常见的,那么,有什么手段可以快速定位接口性能的具体消耗呢?
你可能要说通过分步日志来查看,但对于流量巨大的线上接口来说,一来细到每一步的分步日志将占用过大的磁盘空间,也会对接口性能造成一定的影响,最为关键的是,要想从大量的日志中分析出系统的瓶颈,也无异于大海捞针,难以真正有效的定位。
此时,火焰图正是一件这个场景下的实用利器,你可能也会实用很多开源的监控系统或可视化工具,实际上,这些打印整个调用流程分步甘特图的可视化工具与火焰图的使用也是非常接近,本文对于火焰图的介绍对于你使用这些开源工具也同样大有裨益。
那么,究竟什么是火焰图呢?
上图就是一张火焰图,他就像是熊熊燃烧的火焰一样,从底部向上升,产生出很多焰尖,整体颜色呈暖色,但颜色在火焰图中并没有什么特殊含义。
火焰图的 y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图顶层的宽度越大,说明执行占用 CPU 的时间越长。只要有这样的"平顶"(plateaus)出现,就表示该函数可能存在性能问题。
通常,火焰图是以 svg 矢量图作为输出格式的,这个由 W3C 开发的图片格式拥有十分强大的交互能力。
当鼠标放到火焰图上的某一层的节点悬停一小段时间,就会有完整的函数名、抽样抽中的次数、占据总抽样次数的百分比等信息悬浮出来。
例如:
DemoClass::demoMethod (23 samples, 81.21 percent)
在火焰图中,点击某一节点,该节点就会被扩充水平占满屏幕宽度,显示更为详细的信息。
火焰图中,通过快捷键 Ctrl + F 可以进行搜索,也支持正则表达式。
由于图幅有限,如果调用栈过深,那么只会显示上层调用栈,这样就造成了信息的丢失,这是不可避免的。
关于如何安装和使用 Arthas,上一篇文章已经有了十分详细的介绍。
下面我们就来介绍如何用 Arthas 生成火焰图。
Arthas 内置了 async-profiler 组件,并封装为 profiler 命令供我们使用。
因此,可以同时参看 Arthas 的文档和 async-profiler 的文档来进行操作:
https://github.com/jvm-profiling-tools/async-profiler
https://arthas.aliyun.com/doc/profiler
profiler 命令的格式是:
profiler action [actionArg]
action 包括:
上述的指令中,actionArg 所代表的就是 Arthas 的可选参数:
在不同的平台下,可选的跟踪事件会有所不同。
http://www.brendangregg.com/perf.html#FlameGraphs
https://github.com/jvm-profiling-tools/async-profiler
https://arthas.aliyun.com/doc/profiler