当前位置:   article > 正文

最强线上监控诊断Arthas工具常用命令使用实例_arthas monitor avg-rt

arthas monitor avg-rt

1.下载并运行arthas

下载:curl -O https://arthas.aliyun.com/arthas-boot.jar

运行:java -jar arthas-boot.jar

发现容器中集成了skywalking之后,不能运行成功。可以使用另一种方式运行。添加进程id

java -jar arthas-boot.jar pid

2.核心变量使用

核心变量是用来配合各个arthas命令使用的,并输出参数的。

params:本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组

target:本次调用类的实例

returnObj: 本次调用返回的对象。当且仅当 isReturn==true 成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void,则值为 null

核心变量使用都要遵循ognl表达式规则,官网如下:

https://commons.apache.org/proper/commons-ognl/language-guide.html

3.dashboard命令

查看该进程下的线程,以及所有堆栈的配置信息,还有运行的环境信息。

参数说明:

ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为秒
TIME: 线程运行总 CPU 时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是 daemon 线程

4.thread 命令

查看当前线程信息,查看线程的堆栈

thread id, 显示指定线程的运行堆栈

thread -b, 找出当前阻塞其他线程的线程,目前只支持找出 synchronized 关键字阻塞住的线程。

thread -n 3 -i 1000 列出 1000ms 内最忙的 3 个线程栈

thread --state WAITING 查看指定状态的线程

5. memory

查看 JVM 内存信息。

6.jad 命令

反编译指定已加载类的源码,在线上可查看代码是否已经部署上去

jad com.zhqc.cloud.frame.core.test.TestController

7.mc命令

Memory Compiler/内存编译器,编译.java文件生成.class。可以结合retransform命令实现热更新代码。

注意,mc 命令有可能失败。如果编译失败可以在本地编译好.class文件,再上传到服务器。具体参考retransform命令说明。

8.retransform命令

加载外部的.class文件,retransform jvm 已加载的类。

retransform 指定的 .class 文件

retransform /tmp/MathGame.class

查看 retransform entry

retransform -l

删除所有 retransform entry

retransform --deleteAll

结合 jad/mc 命令使用

jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

mc /tmp/UserController.java -d /tmp

retransform /tmp/com/example/demo/arthas/user/UserController.class

7.monitor命令

方法执行监控

monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter '#cost>1000'

-c 5 表示每5秒一次

#cost>1000 表示花费时间超过1000毫秒的方法

monitor -c 5 com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'returnObj.code =00000'

returnObj.code =00000 代表结果中返回code为00000的方法。

返回参数:

timestamp            class          method         total  success  fail  avg-rt(ms)  fail-rate
----------------------------------------------------------------------------------------------
 2020-09-02 09:41:57  demo.MathGame  primeFactors    1       0        1      0.10      100.00%

 avg-rt(ms) 为方法平均响应时间

8.stack命令

输出当前方法被调用的调用路径。可以用来找到这个方法,是从哪里被调用的,可以用搭配trace方法一起使用,定位到哪个方法用的耗时比较长。

stack com.zhqc.cloud.frame.core.test.TestController testDubboNetwork -n 3

-n 3 代表只输出3次

stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter  '#cost>1000'

#cost>1000 表示花费时间超过1000毫秒的方法

9.trace命令

方法内部调用路径,并输出方法路径上的每个节点上耗时。trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。虽能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。所以需要定位下一级方法的性能,就得多次定位。

trace com.zhqc.cloud.gateway.filter.TestAuthorizationFilter verifyTokenAndSetHeader -n 1

-n 1 代表只输出1次

trace com.zhqc.cloud.frame.core.test.TestController testDubboNetwork '#cost>1000'

#cost>1000 表示花费时间超过1000毫秒的方法

10.watch命令

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

watch com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter invoke -x 2

-x 2 代表只输出参数的第二层级

stack com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter  "{params,returnObj}" -x 2 -b

params 入参参数

returnObj 返回结果参数

target 类实例

-b 函数调用之前

-e 函数异常之后

-s 函数返回之后

-f 函数结束之后(正常返回和异常返回)

-E 开启正则表达式

#cost 耗时

-v 打印具体的值

--exclude-class-pattern 排除具体的类

11. tt命令

方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。tt 相关功能在使用完之后,需要手动释放内存,否则长时间可能导致OOM。退出 arthas 不会自动清除 tt 的缓存 map。清除所有的 tt 记录,tt --delete-all。

tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter

 记录下当前方法的每次调用环境现场

 INDEX   TIMESTAMP          COST(ms)  IS-RET  IS-EXP   OBJECT         CLASS                          METHOD
-------------------------------------------------------------------------------------------------------------------------------------
 1000    2018-12-04 11:15:38  1.096236  false   true     0x4b67cf4d     TestAuthorizationFilter         filter
 1001    2018-12-04 11:15:39  0.191848  false   true     0x4b67cf4d     TestAuthorizationFilter         filter

参数说明:

INDEX    时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP    方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms)    方法执行的耗时
IS-RET    方法是否以正常返回的形式结束
IS-EXP    方法是否以抛异常的形式结束
OBJECT    执行对象的hashCode(),注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
CLASS    执行的类名
METHOD    执行的方法名

解决方法重载

参数个数

tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params.length==1

参数类型

tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter 'params[1] instanceof Integer'

解决指定参数

tt -t com.zhqc.cloud.gateway.filter.TestAuthorizationFilter filter params[0].code=="abs"

对于具体的调用信息查看

tt -i 1000

重复调用

tt -i 1000 -p --replay-times 10 --replay-interval 1000

-p 重复调用

--replay-times 重复调用次数

--replay-interval 重复调用的间隔时间ms

获取到spring context

拦截请求:RequestMappingHandlerAdapter#invokeHandlerMethod

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

Arthas会拦截到这个调用,index是1000

tt -i 1000 -w  'target.getApplicationContext()'

@AnnotationConfigEmbeddedWebApplicationContext[
    reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@35dc90ec],
    scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@72078a14],
    annotatedClasses=null,
    basePackages=null,
]
Affect(row-cnt:1) cost in 7 ms.

从spring context里获取任意bean,并调用函数

tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'

最后记得使用完, tt -d 1000 删除该命令占用的内存。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/995051
推荐阅读
相关标签
  

闽ICP备14008679号