持续性能剖析

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

开启持续性能剖析

持续性能剖析功能是默认关闭的,如果您需要使用该功能,请前往应用配置 > 自定义配置页面开启该功能。

amqlGp35Qs

开通后该功能需要等1~2分钟才会有数据,如果长时间无数据表示当前状态下未采集到数据,请检查是否满足以下条件。

前提条件

  • 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. 应用监控页面,单击应用诊断 > 持续性能剖析,即可查看具体信息。

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

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

gZe113LpOO

查看持续剖析数据

  • 选择快照时间范围:

    查询页签的时间窗口大小区域,选择快照时间大小,支持1分钟5分钟15分钟,选择好快照时间大小后,可在曲线图上通过鼠标拖拽选择快照时间范围。

  • 选择数据类型:

    查询页签的时间窗口大小区域下方,单击下拉框选择数据类型,即可查看目标资源的曲线图。

    • Java应用支持选择的数据类型:cpu情况、jvm heap、jvm gc。

    • Golang应用支持选择的数据类型:cpu、go heap、goroutine、mutex、block。

    ET1GdgCYsV

  • 查看目标资源的快照详情:

    在查询页签,按照选择的快照时间范围列出了快照时间可快照大小。

    yu7Ol6Kvki

  • 聚合分析:

    单击聚合分析可以查看快照详情。

    性能分析

    您可以在性能分析类型对应的下拉框中选择指标类型。

    4nv4VCpame

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

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

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

    指标列表

    指标列表页签,可查看CPU、JVM线程数堆内存详情等指标的曲线图。

    说明

    Golang应用不支持查看指标列表。

    72v7ux2BsZ

    快照列表

    • 快照大小:表示每分钟快照采集的数据量。

    • CPU CORES:表示当前系统使用的CPU核心数。

    • 内存分配次数:表示单位时间内对象分配的次数。

    • 内存(TLAB):表示线程本地分配缓冲区(Thread-Local Allocation Buffer)的使用情况。

    ZzmZeQRHsA

相关文档

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

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