目录
一、概述
本文将总结Arthas中monitor、watch、trace相关监控指令,请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。
二、Arthas之monitor指令
- monitor :方法执行监控,调用次数、执行时间、失败率。monitor对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。
monitor 命令是一个非实时返回命令。实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。
服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变。
monitor监控维度:
监控项 |
说明 |
timestamp |
时间戳 |
class |
Java类 |
method |
方法(构造方法、普通方法) |
total |
调用次数 |
success |
成功次数 |
fail |
失败次数 |
rt |
平均RT |
fail-rate |
失败率 |
-c :统计周期,默认值为120秒
[arthas@11896]$ monitor -c 5 com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 262 ms, listenerId: 1
timestamp class method total success fail avg-rt( fail-ra
ms) te
------------------------------------------------------------------------------------------------------------------
2021-09-18 08:40 com.wsh.Stu <init> 10 10 0 0.27 0.00%
:55
timestamp class method total success fail avg-rt( fail-ra
ms) te
------------------------------------------------------------------------------------------------------------------
2021-09-18 08:41 com.wsh.Stu <init> 9 9 0 0.05 0.00%
三、Arthas之watch 指令
- watch :方法执行观测,让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
参数说明:
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象。
参数名称 |
参数说明 |
class-pattern |
类名表达式匹配 |
method-pattern |
方法名表达式匹配 |
express |
观察表达式,默认值:{params, target, returnObj} |
condition-express |
条件表达式 |
[b] |
在方法调用之前观察 |
[e] |
在方法异常之后观察 |
[s] |
在方法返回之后观察 |
[f] |
在方法结束之后(正常返回和异常返回)观察 |
[E] |
开启正则表达式匹配,默认为通配符匹配 |
[x:] |
指定输出结果的属性遍历深度,默认为 1 |
[arthas@11896]$ watch com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 42 ms, listenerId: 2
method=com.wsh.Stu.<init> location=AtExit
ts=2021-09-18 08:43:39; [cost=0.2545ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
@Stu[com.wsh.Stu@6d21714c],
null,
]
method=com.wsh.Stu.<init> location=AtExit
ts=2021-09-18 08:43:40; [cost=0.0565ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
@Stu[com.wsh.Stu@108c4c35],
null,
]
-x :指定输岀结果的属性遍历深度,默认为0
//通过watch查看init方法的参数、返回值
[arthas@11896]$ watch com.wsh.Stu <init> "{params,returnObj}" -x 2
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 33 ms, listenerId: 4
method=com.wsh.Stu.<init> location=AtExit
ts=2021-09-18 08:45:06; [cost=0.1594ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
null,
]
method=com.wsh.Stu.<init> location=AtExit
ts=2021-09-18 08:45:07; [cost=0.0213ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
null,
]
method=com.wsh.Stu.<init> location=AtExit
ts=2021-09-18 08:45:07; [cost=0.0223ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
null,
]
更多watch使用案例可参考watch — Arthas 3.5.4 文档
四、Arthas之trace指令
- trace:方法内部调用路径,并输出方法路径上的每个节点上耗时。trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
参数说明:
参数名称 |
参数说明 |
class-pattern |
类名表达式匹配 |
method-pattern |
方法名表达式匹配 |
condition-express |
条件表达式 |
[E] |
开启正则表达式匹配,默认为通配符匹配 |
[n:] |
命令执行次数 |
#cost |
方法执行耗时 |
[arthas@11896]$ trace com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 92 ms, listenerId: 5
`---ts=2021-09-18 08:46:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[0.1465ms] com.wsh.Stu:<init>()
`---ts=2021-09-18 08:46:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[0.0227ms] com.wsh.Stu:<init>()
`---ts=2021-09-18 08:46:54;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[0.0286ms] com.wsh.Stu:<init>()
-n :执行次数限制
[arthas@11896]$ trace -n 2 com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 6
`---ts=2021-09-18 08:47:46;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[0.1139ms] com.wsh.Stu:<init>()
`---ts=2021-09-18 08:47:47;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[0.0186ms] com.wsh.Stu:<init>()
Command execution times exceed limit: 2, so command will exit. You can set it with -n option.
更多trace命令使用可参考trace — Arthas 3.5.4 文档
五、Arthas之stack指令
- stack:输出当前方法被调用的调用路径。很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
[arthas@11896]$ stack com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 38 ms, listenerId: 7
ts=2021-09-18 08:48:45;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
@com.wsh.Stu.<init>()
at com.wsh.GCTest.main(GCTest.java:10)
ts=2021-09-18 08:48:45;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
@com.wsh.Stu.<init>()
at com.wsh.GCTest.main(GCTest.java:10)
ts=2021-09-18 08:48:46;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
@com.wsh.Stu.<init>()
at com.wsh.GCTest.main(GCTest.java:10)
六、Arthas之tt指令
- tt :方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测(TimeTunnel )。
[arthas@11896]$ tt -t -n 3 com.wsh.Stu <init>
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 39 ms, listenerId: 8
INDEX TIMESTAMP COST(ms IS-RE IS-EX OBJECT CLASS METHOD
) T P
------------------------------------------------------------------------------------------------------------------
1000 2021-09-18 08:50 0.1658 true false 0x17d10166 Stu <init>
:36
1001 2021-09-18 08:50 0.0155 true false 0x4f8e5cde Stu <init>
:37
1002 2021-09-18 08:50 0.0149 true false 0x504bae78 Stu <init>
:37
Command execution times exceed limit: 3, so command will exit. You can set it with -n option.
更多tt命令使用可参考tt — Arthas 3.5.4 文档。