持续性能剖析
持续性能剖析可以有效发现Java程序中因为CPU、内存和IO导致的瓶颈问题,并且按照方法名称、类名称和行号进行细分统计,最终协助开发者优化程序、降低延迟、增加吞吐、节约成本。本文介绍如何开通ARMS持续性能剖析功能以及如何查看持续性能剖析数据。
持续性能剖析功能经性能测试,在一般的Spring Web应用所有功能效果全部开启的情况下, CPU增加开销5%左右,堆外增加内存开销50 M左右,GC以及请求延迟增加不明显。
前提条件
仅专家版和按写入可观测数据量计费模式支持持续性能剖析功能。
持续性能剖析数据仅支持存储7天,存储在用户名下的SLS中(SLS Project:proj-xtrace-<encode>-<region-id>,SLS Logstore:logstore-profiling)。
请先接入ARMS应用监控,并且升级ARMS探针至v2.7.3.5或以上版本。
持续性能剖析功能当前仅支持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或实时生效网段。
单击保存。
查看持续性能剖析数据
数据查询
筛选元数据(图示①)
Profile元数据包含应用名和Profile类型两个部分,可以通过这两个部分确定一组Profile。
选择一组元数据后,系统将根据您所选择的元数据自动更新趋势图和火焰图。
说明更换选择的元数据,系统将清除快捷筛选区域内已有的标签筛选条件。
设置元数据的时间范围(图示②)
该时间范围用于指定元数据和快捷筛选数据的获取范围。为保证响应速度,默认为最近15分钟。通常情况下无需更改。在数据变动较频繁或间隔较大时,可以进行对应调整。
该时间仅影响趋势图和火焰图的时间范围,不会影响元数据的时间范围,支持自动刷新。
快捷筛选(图示③)
快捷标签数据依赖于元数据的时间范围,标签键来源于性能监控数据中的
labels
字段(JSON格式)。不同标签之间为“与”的逻辑关系。选择标签后,系统将根据您所选择的标签自动更新趋势图和火焰图。主机地址:开始性能剖析的实例IP。
线程名称:应用的全部线程,可以根据CPU耗时、内存占用等发现异常线程。
线程组名称:展示线程组,是一组规则相同的线程合集,可以根据CPU耗时、内存占用等发现一类异常线程。
趋势图(图示④)
对应Profile元数据在指定时间范围内的趋势。
火焰图(图示⑤)。
选择元数据、标签、时间后,系统将自动生成一组Profile的火焰图。
单击
图标,可以查看Copilot对当前火焰图分析出的问题和处理建议。您也可以自定义问题,进一步了解CPU、内存、火焰图相关数据。
选择显示模式,可以设置仅火焰图、仅表格或表格+火焰图。
单击查看SQL,可以查看构建该火焰图的SQL语句,您可以根据SQL语句前往阿里云日志服务SLS的对应Project和Logstore进行数据分析。
数据对比
通过数据对比可以查看目标Profile在当前一段时间和过去一段时间内的数值对比。
筛选元数据(图示①)
Profile元数据包含应用名和Profile类型两个部分,可以通过这两个部分确定一组Profile。
选择一组元数据后,系统将根据您所选择的元数据自动更新趋势图和火焰图。
说明更换元数据的选择,系统将清除快捷筛选区域内已有的标签筛选条件。
设置元数据的时间范围(图示②)
该时间范围用于指定元数据和快捷筛选数据的获取范围。为保证响应速度,默认为最近15分钟。通常情况下无需更改。在数据变动较频繁或间隔较大时,可以进行对应调整。
该时间仅影响趋势图和火焰图的时间范围,不会影响元数据的时间范围,支持自动刷新。
快捷筛选(图示③)
快捷标签数据依赖于元数据的时间范围,标签键来源于性能监控数据中的
labels
字段(JSON格式)。不同标签之间为“与”的逻辑关系。选择标签后,系统将根据您所选择的标签自动更新趋势图和火焰图。主机地址:开始性能剖析的实例IP。
线程名称:应用的全部线程,可以根据CPU耗时、内存占用等发现异常线程。
线程组名称:展示线程组,是一组规则相同的线程合集,可以根据CPU耗时、内存占用等发现一类异常线程。
趋势图(图示④)
趋势图用于展示当前一段时间和过去一段时间内数据波动情况和总体趋势。趋势图是基于元数据和标签的筛选结果,以时间进行聚合,其聚合策略来源于元数据区域。
在当前值区域,时间范围固定与主时间范围(图示②)相同,您可以在过去值区域,单击过去N小时指定要对比的时间段。
火焰图(图示⑤)。
选择元数据、标签、时间后,系统将自动生成Profile的火焰图。单击
图标,可以切换查看简单对比视图和融合对比视图。
简单对比视图
融合对比视图
红色代表相对过去占比增加,蓝色代表相对过去占比减少。
单击
图标,可以查看Copilot对当前火焰图分析出的问题和处理建议。您也可以自定义问题,进一步了解CPU、内存、火焰图相关数据。
在融合对比视图中,Copilot会对两段时间内的性能剖析数据进行对比分析,给出对比火焰图的前后性能变化,影响性能的因素等。单击火焰图详情分析,Copilot可以进一步分析具体的性能问题,并给出修复建议。
选择显示模式,可以设置仅火焰图、仅表格或表格+火焰图。
单击查看SQL,可以查看构建该火焰图的SQL语句,您可以根据SQL语句前往阿里云日志服务SLS的对应Project和Logstore进行数据分析。