JVM监控及诊断工具GUI篇之Arthas(四):monitor、watch、trace相关指令

目录

一、概述

二、Arthas之monitor指令

三、Arthas之watch 指令

四、Arthas之trace指令

五、Arthas之stack指令

六、Arthas之tt指令


一、概述

本文将总结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 文档

上一篇:C# SQLite


下一篇:反射通过私有方法来构架对象