Skip to content

Arthas 是一款线上监控诊断产品. 可方便的支持开发人员对程序进行监控、诊断、调试、参数调优以及内存分析。

安装

直接下载以 jar 启动

shell
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
Arthas script version: 3.7.3
[INFO] JAVA_HOME: /path/jdk_Home
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 90598 com.yiidata.proxyserver.ProxyAppServer
  [2]: 89563 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [3]: 88908
1  #选择进程,这里输入编号

从 Github Releases 页下载 https://github.com/alibaba/arthas/releases

解压后,在文件夹里有 as.sh,直接用 ./as.sh 的方式启动:

shell
./as.sh
./as.sh PID

如果没有选择进程 id,则会提示上述进程选择,输入进程编号即可。

ini
wiki       https://arthas.aliyun.com/3.x/doc
tutorials  https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html
version    3.7.3
main_class com.yiidata.proxyserver.ProxyAppServer
pid        90598
time       2025-02-22 09:26:46

arthas 在执行各种监控指令阻塞时,可输入 q 退出阻塞状态。

Arthas Web控制台

无论通过 jar 启动,或是 as.sh 启动,arthas 会启动一个 web console,默认监听 127.0.0.1:8563,通过浏览器访问该地址,可方便的查看一些监控数据。

通过浏览器打开:http://localhost:3658/

arthas-web-terminal

可 web 上调试指令。

arthas 远程连接到 tunnel server

下载部署 arthas tunnel server, 直接 java -jar 启动:

shell
java -jar  arthas-tunnel-server.jar

客户端启动默认启动会生成一个 --agent-id, arthas 客户端通过该 anent-id 连接到目标主机进行分析。

log
Using generated security password: 3937a5a5-e668-424f-9c12-9ff8f25dabe5

在启动 arthas,可以传递 --tunnel-server 参数,默认情况下,arthas tunnel server 的 web 端口是8080,arthas agent 连接的端口是7777。

shell
./as3.sh --target-ip 0.0.0.0
./as3.sh --target-ip 0.0.0.0 --telnet-port 9999
./as3.sh --username admin --password password
./as3.sh --tunnel-server 'ws://192.168.10.11:7777/ws'
./as3.sh --tunnel-server 'ws://172.18.0.100:7777/ws' --agent-id 3937a5a5-e668-424f-9c12-9ff8f25dabe5

退出 arthas

如果只是退出当前的连接,可以用q, quit或者 exit 命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出 arthas,可以执行 stop 命令。

重要的指令

jad 实时反编译类

java
jad com.yiidata.proxyserver.HttpProxyServlet

ClassLoader:
+-sun.misc.Launcher$AppClassLoader@5a01ccaa
  +-sun.misc.Launcher$ExtClassLoader@105fece7

Location:
/path/lib/proxyserver-core-0.5.4.jar
        /*
         * Decompiled with CFR.
         */
        package com.yiidata.proxyserver;

        import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
        import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
        import com.yiidata.proxyserver.AsyncIntgProxyServlet;

watch 监听方法的调用和出入参数

watch 让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。

这在线上无法 debug 的情况下非常好用。

参数说明:

  • class-pattern 类名表达式匹配
  • method-pattern 函数名表达式匹配
  • express 观察表达式,默认值:params, target, returnObj
  • condition-express 条件表达式
  • [b] 在函数调用之前观察
  • [e] 在函数异常之后观察
  • [s] 在函数返回之后观察
  • [f] 在函数结束之后(正常返回和异常返回)观察
  • [E] 开启正则表达式匹配,默认为通配符匹配
  • [x:] 指定输出结果的属性遍历深度,默认为 1,最大值是 4。大白话就是打印输出的对象内的嵌套对象,输出的层数。如果是1,则对象没有实现 toString 方法,直接打印的是 packageName+class+@+hashcode,如果大于1,则打印对象内的属性,如果对象内还有对象,则继续打印,打印到指定的层数为止。
  • [m arg] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch arg]。

使用案例:

shell
watch com.yiidata.proxyserver.HttpProxyServlet getProxyTarget
watch com.yiidata.proxyserver.HttpProxyServlet getProxyTarget -x 2

trace 监控方法的调用路径,慢调用

trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

参数说明:

  • class-pattern 类名表达式匹配
  • method-pattern 方法名表达式匹配
  • condition-express 条件表达式
  • [E] 开启正则表达式匹配,默认为通配符匹配
  • [n:] 命令执行次数,默认值为 100。
  • #cost 方法执行耗时
  • [m arg] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch arg]。
  • 默认情况下,trace 不会包含 jdk 里的函数调用,如果希望 trace jdk 里的函数,需要显式设置--skipJDKMethod false。
  • 使用 --exclude-class-pattern 参数可以排除掉指定的类

使用案例:

shell
trace com.yiidata.proxyserver.HttpProxyServlet getProxyTarget
trace demo.MathGame run -m 1
trace demo.MathGame run -n 1
trace --skipJDKMethod false demo.MathGame run
trace demo.MathGame run '#cost > 10'

monitor 对匹配的类、方法的调用进行监控、度量

monitor 命令是一个非实时返回命令.

实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。

监控的维度说明

  • timestamp 时间戳
  • class Java 类
  • method 方法(构造方法、普通方法)
  • total 调用次数
  • success 成功次数
  • fail 失败次数
  • rt 平均 RT
  • fail-rate 失败率

参数说明

方法拥有一个命名参数 [c:],意思是统计周期(cycle of output),拥有一个整型的参数值

  • class-pattern 类名表达式匹配
  • method-pattern 方法名表达式匹配
  • condition-express 条件表达式
  • [E] 开启正则表达式匹配,默认为通配符匹配
  • [c:] 统计周期,默认值为 120 秒
  • [b] 在方法调用之前计算 condition-express
  • [m arg] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch arg]。

大白话:monitor 再固定的时间周期内,统计某个方法的执行次数,成功以及失败的次数,输出一些统计信息。

shell
monitor -c 5 demo.MathGame primeFactors
Affect(class-cnt:1 , method-cnt:1) cost in 94 ms.
 timestamp            class          method        total  success  fail  avg-rt(ms)  fail-rate
-----------------------------------------------------------------------------------------------
 2018-12-03 19:06:38  demo.MathGame  primeFactors  5      1        4     1.15        80.00%

 timestamp            class          method        total  success  fail  avg-rt(ms)  fail-rate
-----------------------------------------------------------------------------------------------
 2018-12-03 19:06:43  demo.MathGame  primeFactors  5      3        2     42.29       40.00%

 timestamp            class          method        total  success  fail  avg-rt(ms)  fail-rate
monitor -c 1 -m 1 demo.MathGame primeFactors
monitor -c 5 demo.MathGame primeFactors "params[0] <= 2"

vmoption 查看和设定 JVM 参数

vmoption 用于动态查看和设定 JVM 相关参数。

shell
vmoption #查看输出所有的 jvm 参数
vmoption PrintGC  # 查看输出指定的 jvm 参数
vmoption PrintGC true # 设置指定的 jvm 参数

thread 查看当前线程信息

参数说明:

  • id 线程 id
  • [n:] 指定最忙的前 N 个线程并打印堆栈
  • [b] 找出当前阻塞其他线程的线程
  • [i value] 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
  • [--all] 显示所有匹配的线程

使用案例:

shell
thread # 输出所有线程
thread id  # 显示指定线程的运行堆栈
thread -n 3  #展示当前最忙的前 N 个线程并打印堆栈
thread -i 1000 #统计最近 1000ms 内的线程 CPU 时间。
thread -n 3 -i 1000 #列出 1000ms 内最忙的 3 个线程栈
thread -b  #找出当前阻塞其他线程的线程
thread --state WAITING #查看指定状态的线程

其他 arthas 指令

cls : 清屏,类似 clear

jvm : 打印当前 jvm 上下文信息

dashboard : 当前系统的实时数据面板

pwd :输出当前路径

echo :输出打印字符串

grep :使用管道

session: 当前连接的 pid 进程信息

heapdump: 输出当前 jvm 内存堆栈到 dump.hprof 文件

memory: 输出 JVM 内存信息

sysenv:输出 JVM 环境变量,环境变量无法修改

sysprop: 输出 JVM 系统属性,系统属性可修改

vmoption: 输出 JVM 参数,JVM 参数可修改

vmtool : 强制 GC vmtool --action forceGc

参考