持续剖析可以有效发现Java程序中因为CPU、内存和IO导致的瓶颈问题,并且按照方法名称、类名称和行号进行细分统计,最终协助开发者优化程序、降低延迟、增加吞吐、节约成本。本文介绍如何开通ARMS 持续剖析功能以及如何查看持续剖析数据。
持续剖析功能经性能测试,在一般的Spring Web应用所有功能效果全部开启的情况下, CPU增加开销5%左右,堆外增加内存开销50 M左右,GC以及请求延迟增加不明显。
前提条件
请先接入ARMS应用监控,并且将Agent版本更新至v2.7.3.5或以上版本。接入应用监控的操作,请参见应用监控接入概述;升级探针的操作,请参见升级ARMS探针。
如果应用所部署环境的VPC网络配置了可访问阿里云对象存储OSS的Bucket限制策略,由于该功能会将应用实例所采集数据上传到ARMS统一的OSS Bucket中进行存储与处理,如果配置相关策略但未将ARMS统一的OSS Bucket配置在其中会导致数据无法被有效采集。需要将持续剖析功能相关的Bucket(arms-profiling-<regionId>)配置在您的策略规则中。请将<regionId>换成对应的地域ID,例如您应用部署在cn-hangzhou地域,Bucket则对应为arms-profiling-cn-hangzhou。
持续剖析功能当前仅支持OpenJDK和Oracle JDK,不支持IBM OpenJ9和Oracle GraalVM JDK。
使用限制
操作系统内核
Linux 2.6.32-431.23.3.el6.x86_64及以上。
通过uname -r
命令可以查询当前内核版本。
JDK版本
ARMS的持续剖析功能使用Java虚拟机工具接口(Java Virtual Machine Tool Interface,简称JVM TI)获取应用的方法栈,从而获得应用运行期间的CPU以及内存使用详情。JVM TI存在已知的Crash问题,可能导致应用崩溃,这个问题在OpenJDK 8u352/11.0.17/17.0.5,Oracle JDK 11.0.21/17.0.9版本中已经得到了修复。对于问题修复之前的JDK版本,ARMS团队进行了多次测试,发现问题的触发依赖特殊的场景,发生概率极低。因此,在JDK版本不能满足要求的情况下,ARMS不会强制关闭持续剖析能力,您可以根据需要,临时打开持续剖析功能,并通过应用IP限制生效范围。但为了应用运行稳定,我们强烈建议您按照要求升级JDK版本,在低版本的JDK上使用持续剖析功能,存在应用崩溃的风险。
持续剖析功能主要依赖于JDK中存在调试符号(debug symbols),Alpine基础镜像为了控制体积而去除了JDK调试符号导致功能使用受影响,如需使用相关功能建议优先考虑使用非Alpine基础镜像。
持续剖析建议JDK版本:
JDK类型 | 版本 |
OpenJDK |
|
Oracle JDK |
|
在控制台上开通持续剖析功能
登录ARMS控制台,在左侧导航栏选择 。
在应用列表页面顶部选择目标地域,然后单击目标应用名称。
说明语言列的图标含义如下:
:接入应用监控的Java应用。
:接入应用监控的Golang应用。
:接入应用监控的Python应用。
-:接入可观测链路 OpenTelemetry 版的应用。
在左侧导航栏中单击应用设置,并在右侧单击自定义配置页签。
在自定义配置页签的持续剖析区域,打开总开关,并设置IP白名单或IP范围。
在自定义配置页签左下角单击保存。
查看持续剖析数据
登录ARMS控制台,在左侧导航栏选择 。
在应用列表页面顶部选择目标地域,然后单击目标应用名称。
说明语言列的图标含义如下:
:接入应用监控的Java应用。
:接入应用监控的Golang应用。
:接入应用监控的Python应用。
-:接入可观测链路 OpenTelemetry 版的应用。
在左侧导航栏中单击持续剖析。
在左侧实例列表中选择目标实例,然后在右侧页面设置数据展示时间。
在右侧查询页签,您可以执行以下操作筛选数据并查看聚合分析。
在时间窗口大小区域(图示①)选择快照时间大小,然后在曲线图上通过鼠标拖拽选择快照时间范围。
在图示②的下拉框可以选择数据类型:CPU情况、JVM Heap、JVM GC。
在图示③区域显示了快照时间范围内的数据列表,单击右上角的聚合分析可以查看快照详情。
在右侧对比页签,您可以分别两组筛选数据,对不同时间段的数据进行对比分析。
使用代码热点功能
开启持续剖析功能后,您还可以开启代码热点功能,通过持续剖析技术定时采集请求线程堆栈快照,真实还原代码执行的第一现场。具体操作,请参见使用代码热点诊断慢调用链的问题。