Arthas 是一款线上监控诊断产品. 可方便的支持开发人员对程序进行监控、诊断、调试、参数调优以及内存分析。
安装
直接下载以 jar 启动
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
的方式启动:
./as.sh
./as.sh PID
如果没有选择进程 id,则会提示上述进程选择,输入进程编号即可。
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/
可 web 上调试指令。
arthas 远程连接到 tunnel server
下载部署 arthas tunnel server, 直接 java -jar
启动:
java -jar arthas-tunnel-server.jar
客户端启动默认启动会生成一个 --agent-id, arthas 客户端通过该 anent-id 连接到目标主机进行分析。
Using generated security password: 3937a5a5-e668-424f-9c12-9ff8f25dabe5
在启动 arthas,可以传递 --tunnel-server
参数,默认情况下,arthas tunnel server 的 web 端口是8080,arthas agent 连接的端口是7777。
./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 实时反编译类
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]。
使用案例:
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
参数可以排除掉指定的类
使用案例:
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 再固定的时间周期内,统计某个方法的执行次数,成功以及失败的次数,输出一些统计信息。
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 相关参数。
vmoption #查看输出所有的 jvm 参数
vmoption PrintGC # 查看输出指定的 jvm 参数
vmoption PrintGC true # 设置指定的 jvm 参数
thread 查看当前线程信息
参数说明:
- id 线程 id
- [n:] 指定最忙的前 N 个线程并打印堆栈
- [b] 找出当前阻塞其他线程的线程
- [i value] 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
- [--all] 显示所有匹配的线程
使用案例:
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