解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?
内容提要
随着软件技术的发展,企业软件系统从单体应用向云原生微服务架构演进,应用链路变得越来越长,根因定位变得困难。持续剖析技术通过动态实时采集应用程序的堆栈信息,帮助监测和定位性能瓶颈。火焰图是一种可视化程序性能分析工具,通过将函数调用方法栈转化为火焰形图像,可以快速诊断程序的性能瓶颈。ARMS提供开销即用的持续剖析能力,已有很多用户成功使用该功能进行线上问题的诊断和定位。
延伸解读
持续剖析与即时剖析的核心差异
文章指出,Arthas 等工具生成 CPU 热点火焰图属于即时剖析,通常在压测时手动开启,采集一段时间后关闭。而持续剖析以低开销方式伴随应用整个运行生命周期,持续采集数据。这意味着对于难以复现的线上问题,持续剖析能提供更完整的观测数据,而即时剖析可能因采集窗口有限而遗漏关键信息。
火焰图分析的关键步骤
文章详细介绍了火焰图的分析方法:首先判断火焰图类型,找到栈顶方向;若总资源占用高,检查栈顶是否有较宽部分;然后沿栈顶向栈底搜索,找到第一个属于应用自身定义的方法,重点排查其优化空间。这为开发人员提供了可操作的性能瓶颈定位路径,避免在 JDK 库函数上浪费精力。
ARMS 持续剖析的开销实测
文章通过压测场景测算了 ARMS 持续剖析的开销:在 4c8g 容器、6000 TPS 极限压力下,全部功能开启后 CPU 开销约 5%,堆内内存开销不明显,堆外内存占用约 50MB。流量较小或仅开启部分功能时开销更低。这表明该功能对应用性能影响较小,适合在生产环境长期开启。
用户案例揭示的典型问题场景
文章列举了三个用户案例:应用启动时前几个请求慢,代码热点定位到 Sharding-JDBC 初始化耗时;压测中部分节点响应慢,代码热点发现写日志争抢 CPU;堆内存使用量大,内存热点发现微服务框架持久化上游服务信息。这些案例展示了持续剖析在解决 Tracing 监控盲区、资源竞争和内存泄漏类问题上的实际价值。
Q&A
持续剖析技术是什么?它和传统的性能诊断工具有什么区别?
持续剖析(Continuous Profiling)是通过动态实时采集应用程序 CPU/内存等资源申请的堆栈信息,来帮助监测和定位应用程序的性能瓶颈。与传统的即时剖析工具(如 Arthas CPU 热点火焰图)不同,持续剖析以低开销的方式伴随应用整个运行生命周期,持续采集数据,而即时剖析通常只在压测等场景手动开启,是临时性的。
持续剖析的实现原理是什么?它是如何采集数据的?
持续剖析在更底层对资源申请相关的 JDK 库关键位置进行埋点,或依赖操作系统特定事件来采集信息。例如 CPU 热点剖析,通过操作系统底层的系统调用获得 CPU 上执行线程的信息,然后以一定频率(如 10ms)采集线程的方法栈信息,1 秒可采集 100 个线程方法栈,最后通过可视化技术如火焰图展示。
火焰图是什么?如何通过火焰图定位性能瓶颈?
火焰图是一种可视化程序性能分析工具,将函数调用方法栈转化为火焰形图像,矩形宽度表示资源使用占比,高度表示调用深度。分析时:先判断火焰图类型找到栈顶方向;若总资源占用高,检查栈顶是否有较宽部分;若有,沿栈顶往栈底搜索,找到第一个属于应用自身定义的方法,重点排查该方法是否有优化空间。
ARMS 持续剖析产品有哪些核心特点和功能?
ARMS 提供开箱即用的持续剖析能力,具有开销低、粒度细和方法栈完备等特点。功能上针对 CPU、堆内存分析提供 CPU 热点、内存热点功能,针对慢调用链诊断提供代码热点功能。目前已有接近 1 万个应用实例在线上开启该功能进行持续数据采集与监控。
ARMS 持续剖析在实际线上问题诊断中有哪些成功案例?
案例包括:用户 A 应用启动时前几个请求慢,Tracing 无法诊断,通过代码热点发现是 Sharding-JDBC 框架初始化耗时所致;用户 B 压测时部分节点响应慢,通过代码热点发现大量时间消耗在写日志上,原因是日志采集组件占用大量 CPU;用户 C 堆内存使用量大,通过内存热点发现是微服务框架持久化上游服务信息导致,升级框架版本后解决。
ARMS 持续剖析的开销有多大?对应用性能影响如何?
在 4c8g 容器环境、4g 堆内存、压力极限 6000 TPS 的压测场景下,全部持续剖析功能开启后,CPU 开销约 5%,堆内内存开销不明显,堆外内存占用约 50MB。流量小或仅开启部分功能时开销更低。