Arthas诊断

Arthas是诊断Java领域线上问题的利器,利用字节码增强技术,可以在不重启JVM进程的情况下,查看程序的运行情况。

ARMS 100%集成Arthas的所有能力,且相比自行挂载使用有如下优势:

  • 不依赖JDK环境,您无需下载安装Arthas,可按需批量一键开启/关闭。

  • 常用功能白屏化,免去记命令、查命令、写表达式的烦恼。

  • ARMS上下文关联,通过Trace命令可以看到ARMS的链路TraceID。

前提条件

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

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

  • 该功能目前仅支持Java应用。

  • Arthas诊断功能建议只在排查问题时开启,在日常使用时建议关闭。

  • ARMS Agent版本为v2.7.1.3或以上。

  • 已接入应用监控。具体操作,请参见应用监控概述

  • 应用的编程语言需要为Java。

背景信息

ARMS提供的Arthas诊断功能主要用于补齐ARMS在实时诊断方面的能力。ARMSArthas诊断功能包括以下几种类型:

  • JVM概览:查看当前JVM进程实时的内存使用情况、系统信息、系统变量和环境变量。

  • 线程耗时分析:查看当前JVM进程的线程耗时情况以及指定线程的实时方法栈。

  • 方法执行分析:抓取任意方法(非JDK方法)满足指定条件的一次执行记录,记录该方法的参数、异常、返回值以及方法内部各个方法执行耗时。

  • 对象查看器:查看任意类的某个实例实时的属性取值情况。

  • 实时看板:常见组件的实时看板,例如,Druid连接池的实时看板可以看到连接池的配置、使用情况以及SQL执行耗时情况。

  • Arthas Shell:通过命令行方式使用Arthas诊断。

说明

Arthas性能分析已经全面升级为持续剖析功能,使用更加便捷,功能更加强大,可常态化开启,随时使用。

持续剖析功能可以有效发现Java程序中因CPU、内存和IO导致的瓶颈问题,并且按照方法名称、类名称和行号进行细分统计,最终协助开发者优化程序、降低延迟、增加吞吐量、节约成本。更多信息,请参见接入持续剖析功能

开通Arthas诊断功能

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

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

    说明

    语言列的图标含义如下:

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

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

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

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

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

  4. Arthas监控区域,打开Arthas开关,根据需求选择是否仅对部分IP进行Arthas诊断,并添加目标IP。

  5. 单击保存

查看Arthas诊断信息

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

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

    说明

    语言列的图标含义如下:

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

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

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

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

  3. 在上方导航栏选择应用诊断 > Arthas诊断

  4. Arthas诊断页面顶部下拉列表选择待诊断的应用实例。

    • 若该实例的Agent版本未升级至2.7.1.3或以上,页面会提示您需要先升级Agent。

    • 若该实例的Agent版本已升级至2.7.1.3或以上,页面会显示该实例的Arthas诊断信息。

JVM概览

JVM概览支持查看应用的JVM相关信息,包括JVM内存、操作系统信息、变量信息等,帮助您了解JVM的总体情况。

Arthas诊断页面默认显示JVM概览页签,您可以在JVM概览页签查看以下信息:

  • JVM内存:JVM内存的相关信息,包括堆内存使用情况、非堆内存使用情况、GC情况等。JVM内存

  • 操作系统信息:操作系统的相关信息,包括平均负载情况,操作系统名称、操作系统版本、Java版本等。操作系统信息

  • 变量信息:变量的相关信息,包括系统变量和环境变量。变量信息

线程耗时分析

线程耗时分析支持显示该应用的所有线程和查看线程的堆栈信息,帮助您快速定位耗时较高的线程。

  1. Arthas诊断页面,单击线程耗时分析页签。

    线程耗时分析页签会实时获取当前JVM进程的线程耗时情况,并将相似线程聚合。新版Arthas诊断-线程耗时分析

  2. 单击线程左侧的+图标展开线程明细,可以查看线程的ID、CPU使用率和状态。

  3. 如需查看目标线程的堆栈信息,您可以在目标线程右侧的操作列,单击查看实时堆栈

    堆栈详情

方法执行分析

方法执行分析支持抓取方法的某一次执行的耗时、入参、返回值等信息和钻入,帮助您快速定位导致慢调用的根本原因,以及问题线下无法复现或日志缺失等场景。

  1. Arthas诊断页面,单击方法执行分析页签。

  2. 方法执行分析页签的搜索框中输入类名的关键词,然后单击搜索图标。

  3. 在搜索到的类中选择需要诊断的类,然后在右侧方法选择框选取该类的某个方法,单击确定

    页面将会显示ARMS随机抓取的该方法的某一次执行的信息。新版Arthas诊断-方法执行分析

    • 左侧执行堆栈区域显示诊断方法的内部执行记录。

      • 如需钻入某个内部方法,在其右侧操作列,单击钻入

      • 如需查看方法源码,单击执行堆栈区域顶部的查看方法源码

        如下图所示,每一次内部方法的执行耗时都会以注释的方式显示在源代码中。方法源码

    • 右侧方法执行结果区域显示方法执行的参数值、返回值、异常、成员变量以及此次方法执行的TraceID。

    • 右侧设置执行条件区域执行以下步骤,可以设置方法执行条件来抓取满足条件的方法执行记录。

      1. 选择当前方法中的一个重载方法。

      2. 请选择初始过滤key下拉框选择初始过滤Key的类型,单击向左箭头图标。

        初始过滤Key的类型:

        • params[n]:方法的第n个参数。

        • returnObj:方法的返回值。

        • 方法执行耗时:方法执行的耗时。

        • 是否抛出异常:方法执行时是否抛出异常。

        说明

        如果选取的初始过滤Key为嵌套类型,则还需要继续选择该嵌套类型的内部字段,直到选择字段为基础类型。

      3. 选择过滤条件。

      4. 输入过滤值。

      5. 单击添加

        当前过滤条件区域会显示已添加的过滤条件。

        设置执行条件

      6. 在左侧执行堆栈区域右上角单击刷新图标,系统会按照设置的条件重新抓取一次方法执行。

对象查看器

对象查看器用于查看一些单例对象当前的状态,用于排查应用状态异常问题,例如应用配置、黑白名单、成员变量等。

  1. Arthas诊断页面,单击对象查看器页签。

  2. 对象查看器页签的搜索框中输入类名的关键词,然后单击搜索图标。

  3. 在搜索到的类中选择需要诊断的类,然后在右侧实例选择框选择该类的某个实例,单击确定

    页面则会显示该实例中当前字段的实时取值。Arthas诊断-对象查看器

    • 对于简单类型的字段,在左侧对象字段实时取值区域的详情列会是字段的取值。

    • 对于复制类型的字段,在左侧对象字段实时取值区域的详情列单击点击查看详情,在右侧字段详情区域查看字段取值详情。

      字段详情区域仅支持将复杂类型字段反序列化一层进行展示,如果需要查看更具体的数据,单击点击查看字段更详细的数据。

实时看板

实时看板用于查看系统中用到的关键组件的实时状态,例如查看数据库连接池的使用情况、HTTP连接池的使用情况等,有利于排查资源类型的问题。

  1. Arthas诊断页面,单击实时看板页签。

  2. 实时看板页签的下拉列表中选择一个看板,然后在右侧实例选择框选择该看板的一个实例,单击添加到看板

    页面显示该看板的实时情况。如下图显示为一个Druid连接池的实时状态信息,包括基础配置、连接池状态、执行耗时分布等。Arthas诊断-实时看板

Arthas Shell

通过命令行方式自定义Arthas诊断。

Arthas Shell

常见问题

Arthas打开后无提示无心跳

出现这种情况可能存在以下两个原因:

  • 网络不通。

    检测网络连通性,若公网应用诊断端口(9092)和内网应用诊断端口(9092)同时失败,则需要在网络安全组中打开应用诊断域名的9092端口出方向访问权限以及对应地域的接入点域名。需要开放的域名请参见Java应用监控网络配置,其中应用诊断域名与调用链元数据域名一致。

    image

  • 应用挂载了 SkyWalking 探针。

    目前 ARMS 集成的 Arthas 和 SkyWalking 不兼容,无法同时存在,需要卸载 SkyWalking 探针或者自行挂载高版本 Arthas(3.7.0及以上版本)。

    执行cat ~/logs/arthas/arthas.log命令,在日志结尾处可以看到探针不兼容的异常信息。

    2023-09-11 09:09:47 [arthas-binding-thread] ERROR c.t.a.core.server.ArthasBootstrap -start channel client failure
    java.lang.ExceptionInInitializerError: null
    	at com.alibaba.arthas.channel.proto.ArthasServiceGrpc$ArthasServiceStub.register(ArthasServiceGrpc.java:306)
    	at com.alibaba.arthas.channel.client.ChannelClient.connect(ChannelClient.java:165)
    	at com.alibaba.arthas.channel.client.ChannelClient.start(ChannelClient.java:111)
    	at com.taobao.arthas.core.server.ArthasBootstrap.bind(ArthasBootstrap.java:478)
    	at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:162)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:613)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:601)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:182)
    	at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20)
    	at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:152)
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at io.grpc.stub.ClientCalls.<clinit>(ClientCalls.java:52)
    	... 14 common frames omitted
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:139)
    	... 19 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: Lorg/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter;
    	at java.lang.Class.getDeclaredFields0(Native Method)
    	at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    	at java.lang.Class.getDeclaredField(Class.java:2068)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:163)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:233)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3655)
    	... 24 common frames omitted
    Caused by: java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at com.taobao.arthas.agent.ArthasClassloader.loadClass(ArthasClassloader.java:34)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	... 30 common frames omitted
    

方法执行分析页签转圈一段时间后提示命令执行失败

image

方法执行分析是实时抓取用户当前选择的方法执行情况,如果在等待的时间内,指定的方法并没有执行,就会出现该错误。可以单击右侧刷新图标重试。

Arthas展示的survivor_space空间为实际值的一半

Survivor_space分为fromto两部分,两者各占一半。Arthas只展示了from区的大小。

Arthas诊断额外收费吗

不额外收费。

ARMS控制台开启Arthas后,手动挂载Arthas提示连接拒绝

Arthas默认使用3658端口来接收新的连接客户端,ARMS集成的Arthas为了避免一台机器上的多个进程同时挂载Arthas时出现端口冲突,使用的是随机端口,所以会出现挂载失败的问题,出现这种情况需要在ARMS控制台关闭Arthas功能。

ARMS控制台开启Arthas后,日志里面提示Arthas server already bind.

如果应用之前挂载过开源的Arthas,则ARMS Arthas不支持重复开启,需要先删除开源的Arthas,再开启ARMSArthas。