快速定位系统瓶颈 -- 用 Arthas 生成火焰图

2021-01-08 11:14:32   最后更新: 2021-01-08 11:15:12   访问数量:61




1.1 Arthas

上一篇文章中,我们系统介绍了阿里巴巴公司开源的 java 性能分析工具箱 -- Arthas:

java 性能调优神器 -- 黑暗骑士 Arthas

 

Arthas 集成了大量十分易用、好用的工具,可以帮助我们分析系统运行情况、发现问题、解决问题。

本文我们就来介绍其中一个十分关键的一个工具 -- 火焰图的生成工具 profiler。

 

1.2 火焰图

分析一个接口性能的消耗在哪里在系统优化工作中是最常见的,那么,有什么手段可以快速定位接口性能的具体消耗呢?

你可能要说通过分步日志来查看,但对于流量巨大的线上接口来说,一来细到每一步的分步日志将占用过大的磁盘空间,也会对接口性能造成一定的影响,最为关键的是,要想从大量的日志中分析出系统的瓶颈,也无异于大海捞针,难以真正有效的定位。

此时,火焰图正是一件这个场景下的实用利器,你可能也会实用很多开源的监控系统或可视化工具,实际上,这些打印整个调用流程分步甘特图的可视化工具与火焰图的使用也是非常接近,本文对于火焰图的介绍对于你使用这些开源工具也同样大有裨益。

 

2.1 火焰图的说明

那么,究竟什么是火焰图呢?

 

 

上图就是一张火焰图,他就像是熊熊燃烧的火焰一样,从底部向上升,产生出很多焰尖,整体颜色呈暖色,但颜色在火焰图中并没有什么特殊含义。

火焰图的 y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图顶层的宽度越大,说明执行占用 CPU 的时间越长。只要有这样的"平顶"(plateaus)出现,就表示该函数可能存在性能问题。

 

2.2 SVG 图片的交互

通常,火焰图是以 svg 矢量图作为输出格式的,这个由 W3C 开发的图片格式拥有十分强大的交互能力。

 

2.2.1 详细信息浮层

当鼠标放到火焰图上的某一层的节点悬停一小段时间,就会有完整的函数名、抽样抽中的次数、占据总抽样次数的百分比等信息悬浮出来。

 

例如:

DemoClass::demoMethod (23 samples, 81.21 percent)

 

2.2.2 点击放大

在火焰图中,点击某一节点,该节点就会被扩充水平占满屏幕宽度,显示更为详细的信息。

 

2.2.3 搜索

火焰图中,通过快捷键 Ctrl + F 可以进行搜索,也支持正则表达式。

 

2.3 火焰图的不足

由于图幅有限,如果调用栈过深,那么只会显示上层调用栈,这样就造成了信息的丢失,这是不可避免的。

 

关于如何安装和使用 Arthas,上一篇文章已经有了十分详细的介绍。

下面我们就来介绍如何用 Arthas 生成火焰图。

 

Arthas 内置了 async-profiler 组件,并封装为 profiler 命令供我们使用。

因此,可以同时参看 Arthas 的文档和 async-profiler 的文档来进行操作:

https://github.com/jvm-profiling-tools/async-profiler

https://arthas.aliyun.com/doc/profiler

 

3.1 profiler 的操作

profiler 命令的格式是:

profiler action [actionArg]

 

action 包括:

  1. start -- 开始采样
  2. getSample -- 获取采样个数
  3. status -- 查看 profiler 的执行状态
  4. stop -- 停止采样
  5. resume -- 从上次 stop 时开始继续采样,保存上次采样的数据
  6. actions -- 查看所有支持的 action
  7. version -- 查看 profiler 版本
  8. framebuf -- 设置结果的缓存空间大小,默认是 1’000’000
  9. include/exclude -- 选择或排除指定数据

 

3.2 可选参数

上述的指令中,actionArg 所代表的就是 Arthas 的可选参数:

  • -i -- 采样间隔,以纳秒为单位,默认为 10ms
  • -f -- 输出文件指定路径
  • -d -- 运行指定秒数后自动停止采样
  • -e -- 跟踪事件,默认为 cpu
  • --format -- 文件存储格式,默认为 svg,可以传递 html 生成 html 格式的结果

 

3.3 可选的跟踪事件

在不同的平台下,可选的跟踪事件会有所不同。

 

3.3.1 macos

 

  • cpu
  • alloc
  • lock
  • wall
  • itimer

 

3.3.2 linux

 

  • cpu
  • alloc
  • lock
  • wall
  • itimer
  • page-faults
  • context-switches
  • cycles
  • instructions
  • cache-references
  • cache-misses
  • branches
  • branch-misses
  • bus-cycles
  • L1-dcache-load-misses
  • LLC-load-misses
  • dTLB-load-misses
  • mem:breakpoint
  • trace:tracepoint

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,全部原创,只有干货没有鸡汤

 

 

http://www.brendangregg.com/perf.html#FlameGraphs

https://github.com/jvm-profiling-tools/async-profiler

https://arthas.aliyun.com/doc/profiler

 

 






java      架构      技术贴      arthas      火焰图      阿尔萨斯      性能分析     


京ICP备15018585号