Java应用持续剖析

持续剖析可以有效发现Java程序中因为CPU、内存和IO导致的瓶颈问题,并且按照方法名称、类名称和行号进行细分统计,最终协助开发者优化程序、降低延迟、增加吞吐、节约成本。本文介绍如何开通ARMS 持续剖析功能以及如何查看持续剖析数据。

重要

ARMS应用监控面向已开通新版计费的用户提供全新的监控详情页面,新版计费详情,请参见产品计费(新版)

对于未开通新版计费的用户,如需查看新版监控详情页面,可在应用列表页面单击切换新版

持续剖析功能经性能测试,在一般的Spring Web应用所有功能效果全部开启的情况下, CPU增加开销5%左右,堆外增加内存开销50 M左右,GC以及请求延迟增加不明显。

前提条件

重要
  • 仅专家版和按写入可观测数据量计费模式支持持续剖析功能,开通专家版的操作,请参见按量付费。切换到按写入可观测数据量计费模式的操作,请参见计费变更

  • 金融云和政务云部分地域暂不支持持续剖析功能,如需体验此功能,请联系用户群(群号:22560019672)协助开通。

  • 持续剖析数据仅支持存储7天。

  • 请先接入ARMS应用监控,并且将Agent版本更新至v2.7.3.5或以上版本。接入应用监控的操作,请参见应用监控接入概述;升级探针的操作,请参见升级ARMS探针

  • 如果应用所部署环境的VPC网络配置了可访问阿里云对象存储OSSBucket限制策略,由于该功能会将应用实例所采集数据上传到ARMS统一的OSS Bucket中进行存储与处理,如果配置相关策略但未将ARMS统一的OSS Bucket配置在其中会导致数据无法被有效采集。需要将持续剖析功能相关的Bucket(arms-profiling-<regionId>)配置在您的策略规则中。请将<regionId>换成对应的地域ID,例如您应用部署在cn-hangzhou地域,Bucket则对应为arms-profiling-cn-hangzhou。

  • 持续剖析功能当前仅支持OpenJDKOracle JDK,不支持IBM OpenJ9Oracle 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

  • OpenJDK 8u352+

  • OpenJDK 11.0.17+

  • OpenJDK 17.0.5+

Oracle JDK

  • Oracle JDK 11.0.21+

  • Oracle JDK 17.0.9+

开启持续剖析功能

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表

  2. 应用列表页面顶部选择目标地域,然后单击目标应用名称。

    说明

    语言列的图标含义如下:

    Java图标:接入应用监控的Java应用。

    image:接入应用监控的Golang应用。

    image:接入应用监控的Python应用。

    -:接入可观测链路 OpenTelemetry 版的应用。

  3. 在上方导航栏选择应用配置 > 自定义配置

  4. 持续剖析区域,打开总开关,并设置IP白名单IP范围

  5. 单击保存

查看持续剖析数据

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表

  2. 应用列表页面顶部选择目标地域,然后单击目标应用名称。

    说明

    语言列的图标含义如下:

    Java图标:接入应用监控的Java应用。

    image:接入应用监控的Golang应用。

    image:接入应用监控的Python应用。

    -:接入可观测链路 OpenTelemetry 版的应用。

  3. 在上方导航栏选择应用诊断 > 持续剖析

  4. 在左侧实例列表中选择目标实例,然后在右侧页面设置数据展示时间。

  5. 在右侧查询页签,您可以执行以下操作筛选数据并查看聚合分析。

    数据展示

    1. 时间窗口大小区域(图示①)选择快照时间大小,然后在曲线图上通过鼠标拖拽选择快照时间范围。

    2. 在图示②的下拉框可以选择数据类型:CPU情况、JVM Heap、JVM GC。

    3. 在图示③区域显示了快照时间范围内的数据列表,单击右上角的聚合分析可以查看快照详情。

      图 1. 性能分析性能分析

      • Self列表示方法在自身的调用栈中所消耗的时间或资源,不包括其子方法调用所消耗的时间或资源。可以用于识别哪些方法在自身内部花费了大量的时间或资源。

      • Total列包含方法自身消耗的时间或资源,及其所有子方法调用所消耗的时间或资源。可以帮助了解整个方法调用栈中哪些方法贡献了最多的时间或资源。

      如需排查具体的热点代码逻辑,可以通过重点关注Self列或直接查看右侧火焰图中底部的较宽火苗从中定位到高耗时的业务方法,较宽火苗是引发上层耗时高的根源,一般是系统性能的瓶颈所在,您可以重点关注。

      图 2. 指标列表指标列表

      图 3. 快照列表快照列表

使用代码热点功能

开启持续剖析功能后,您还可以开启代码热点功能,通过持续剖析技术定时采集请求线程堆栈快照,真实还原代码执行的第一现场。具体操作,请参见使用代码热点诊断慢调用链的问题

相关文档

您可以使用持续剖析功能排查CPU和内存使用率较高的问题,具体操作如下:

持续剖析功能使用过程中的常见问题,请参见常见问题