Arthas是诊断Java领域线上问题的利器,利用字节码增强技术,可以在不重启JVM进程的情况下,查看程序的运行情况。EDAS白屏化支持Arthas的常用功能,包括JVM概览、线程耗时分析、方法执行分析和性能分析。

前提条件

要使用Arthas诊断的应用必须满足以下条件:
  • 部署环境为EDAS K8s环境。
    说明 本文以容器服务Kubernetes版为例。
  • 编程语言为Java。
  • 3658端口和8563端口未被占用。

背景信息

Arthas是一款开源Java诊断工具,深受开发者欢迎。关于Arthas的更多信息,请参见Arthas官网

升级arms-pilot并重启应用

在使用Arthas诊断前,您需要先升级arms-pilot并重启应用。
重要 升级arms-pilot不会对您的应用产生任何影响。但需要注意的是,在升级arms-pilot的过程中,请不要进行应用发布、应用重启、应用回滚等操作。

为容器服务Kubernetes版升级arms-pilot并重启应用的操作步骤如下:

  1. 升级arms-pilot。
    1. 登录容器服务管理控制台
    2. 在左侧导航栏,单击集群
    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在左侧导航栏,选择工作负载 > 无状态
    5. 无状态页面,从命名空间下拉列表中选择arms-pilot-system或arms-pilot。
    6. 找到名称为arms-pilot-ack-arms-pilot的无状态应用(Deployment),在其右侧操作列,选择更多 > 重新部署
    7. 重新部署对话框,单击确定
  2. 如果您的集群同时安装了mse-pilot, 您需要在升级arms-pilot后升级mse-pilot。
    1. 在当前的无状态页面下,从命名空间下拉列表中选择mse-pilot。
    2. 找到名称为arms-pilot-ack-arms-pilot的无状态应用(Deployment),在其右侧操作列,单击编辑
    3. 编辑页面,设置镜像Tag为v1.29,然后单击更新
    重要 升级mse-pilot不会对您的应用产生任何影响。但需要注意的是,在升级mse-pilot的过程中,请不要进行应用发布、应用重启、应用回滚等操作。
  3. 如果被监控的应用的PID为1,您需要修改应用的YAML配置文件。
    1. 无状态页面,从命名空间下拉列表,选择应用所在命名空间,找到应用的Deployment,在其右侧操作列,选择更多 > 查看Yaml
    2. 编辑YAML对话框,在spec>template>metadata>annotations下添加ArthasEnable: 'on',然后单击确定
      说明 如果没有metadata下没有annotations,您需要先添加annotations:,然后添加ArthasEnable: 'on'
      编辑YAML
  4. 重启应用。
    1. 无状态页面,从命名空间下拉列表,选择应用所在命名空间,找到应用的Deployment,在其右侧操作列,选择更多 > 重新部署
    2. 重新部署对话框,单击确定

功能入口

  1. 登录EDAS控制台
  2. 按需执行以下任一操作来进入应用的详情页面:
    • 在左侧导航栏选择资源管理 > 容器服务K8s集群(或资源管理 > Serverless K8s集群),在顶部菜单栏选择地域并在页面上方选择微服务空间,在容器服务K8s集群Serverless K8s集群页面单击集群ID,然后在集群详情页面的应用列表区域单击具体应用名称。
    • 在左侧导航栏单击应用列表,在顶部菜单栏选择地域并在页面上方选择微服务空间,在集群类型下拉列表中选择容器服务/Serverless K8s集群,然后单击目标应用名称。
  3. 在应用详情的左边导航栏中选择监控 > 应用诊断-Arthas诊断
  4. 在Arthas诊断页面,选择应用的Pod。
    • 如果检测未下载Arthas,您需要重新部署探针以下载Arthas。具体操作,请参见步骤1
    • 如果检测未挂载Arthas,EDAS会为您重新部署应用以挂载Arthas。如何手动部署应用,请参见步骤4
    • 如果尝试挂载Arthas失败,您需要检查应用的PID:
      • PID为1:您需要修改应用的YAML配置文件。具体操作,请参见步骤3
      • PID不为1:请联系EDAS技术支持

JVM概览

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

Arthas诊断页面默认显示JVM概览页签,您可以在JVM概览页签下查看以下信息:
  • JVM内存:JVM内存的相关信息,包括堆内存使用情况、非堆内存使用情况、GC情况等。
  • 操作系统信息:操作系统的相关信息,包括平均负载情况,操作系统名称、操作系统版本、Java版本等。
  • 变量信息:变量的相关信息,包括系统变量和环境变量。
  • 可选:线程Top-10:CPU使用率排名前10的线程的相关信息,包括名称、ID、CPU使用率、状态。

    如需查看某个线程的堆栈信息,您可以在某个线程右侧的操作列,单击查看

线程耗时分析

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

  1. 在Arthas诊断页面,单击线程耗时分析页签。
    线程耗时分析页签下按照CPU使用率降序显示该应用的所有线程的相关信息,包括线程的名称、ID、CPU使用率、状态。
  2. 如需查看某个线程的堆栈信息,您可以在某个线程右侧的操作列,单击查看

方法执行分析

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

  1. 在Arthas诊断页面,单击方法执行分析页签。
  2. 方法执行分析页签下,选择服务,单击确定
    重要 选择服务后,EDAS将自动推断该服务对应到代码的类和方法,为您自动填写对应的类和方法。如果推断失败,您需要手动填写该服务对应到代码的类和方法。
    方法页签下显示EDAS随机抓取的该方法的某一次执行的信息,包括方法名、执行耗时、入参、返回值、异常以及该方法的内部方法的信息。该方法的内部方法中执行耗时最高的方法的时间轴标红显示。
  3. 可选:如需钻入某个内部方法,在其右侧操作列,单击钻入
    方法页签下显示该方法的该次执行信息,包括方法名、执行耗时、入参、返回值、异常以及该方法的内部方法的信息。该方法的内部方法中执行耗时最高的方法的时间轴标红显示。
  4. 如需指定抓取方法的执行的满足条件,执行以下操作:
    1. 在方法页签下,单击修改诊断参数
    2. 诊断参数设置对话框,设置以下参数,然后单击确认
      参数描述示例值
      仅当抛出异常是否仅当方法的执行抛出异常时才抓取。取值:
      • :仅当方法的执行抛出异常时才抓取。
      • :方法的执行不抛出异常时也抓取。
      耗时大于方法的执行耗时大于该耗时才被抓取。单位为ms。30
      对象反序列化层级方法的执行的参数和返回值为复杂对象时的反序列化深度。取值越大,反序列化深度越深,能看到的复杂对象的内部字段越多。5
      添加参数方法的执行的参数的取值满足该条件时才被抓取。示例:
      • 示例方法:方法createOrder的源代码片段如下:
        class User {
            private int userId;
            private String userName;
            private boolean isVIP;
            }
            public void createOrder(User user, String productId, double price)
      • 抓取条件:userId为8753的方法执行。
      • 参数设置:params[0].userId ; = ; 8753
      params[0].userId ; = ; 8753
    3. 单击刷新图标。
      方法页签下显示满足该抓取条件的某一次方法的执行信息。
  5. 可选:如需查看方法源码,在方法页签下,单击查看方法源码

性能分析

性能分析支持对CPU耗时、内存分配等对象进行一定时间的采样并生成相应的火焰图,帮助您快速定位应用的性能瓶颈。

  1. 在Arthas诊断页面,单击性能分析页签。
  2. 性能分析页签下方,单击新建火焰图
  3. 新建火焰图对话框,选择火焰图类型,输入采样时间,输入备注信息,然后单击确认
    参数描述示例值
    火焰图类型采样对象的类型。取值:
    • cpu耗时
    • 内存分配
    • 锁耗时
    • itimer
    cpu耗时
    输入采样时间(单位:秒)采样的时长。取值:10~1800。30
    性能分析页签下方显示新建火焰图的任务信息,包括开始时间、采样时间、任务执行Pod等。性能分析
  4. 性能分析页签下方,找到任务记录,在其右侧任务状态,单击查看火焰图,根据页面提示下载SVG格式的火焰图文件,然后在浏览器中打开。
    火焰图