阿里开源神器之Arthas进阶
# 帮助及监控面板
# 1.help
查看帮助
# 2.dashboard
功能
监控面板,可查看cpu,线程,jvm内存,GC,系统等信息
用法
dashboard -i 5000 -n 5
- i :刷新频率,默认5000ms
- n :刷新次数
案例
# 方法执行监控
主要介绍trace,watch,montor,stack这几个命令的使用。
提示
这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时, 请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。
# 1.trace
功能
跟踪方法执行耗时,方法内部调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路,并输出方法路径上的每个节点上耗时。
用法
trace com.fire.arthas.demo.web.ArthasTestController method -n 5 --skipJDKMethod false
- n :执行追踪次数
- skipJDKMethod:包含jdk里面的函数
很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如:
trace *StringUtils isBlank '#cost>100' 只展示执行耗时大于100ms的
- #cost:方法执行耗时
表示当执行时间超过100ms的时候,才会输出trace的结果。
案例
执行如下命令
trace com.fire.arthas.demo.web.ArthasTestController traceMethod -n 5 --skipJDKMethod false
从图中可以看到方法调用栈执行耗时,从而分析具体哪块有性能问题。
# 2.watch
功能
让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,支持OGNL表达式
OGNL表达式官网:https://commons.apache.org/proper/commons-ognl/language-guide.html (opens new window)
特别说明:
watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后, -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
在watch命令的结果里,会打印出location信息。location有三种可能值:AtEnter,AtExit,AtExceptionExit。对应方法入口,方法正常return,方法抛出异常。
用法
watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}' -n 2 -x 3 -s
参数说明:
- express : 观察表达式,默认值:{params, target, returnObj} ,分别代表参数,目标,返回值
- n :监控次数
- x :指定输出结果的属性遍历深度,默认为 1,最大值是4
- b :观察方法调用前
- e :观察方法异常后
- s :观察方法返回后
- f :观察方法结束后
案例
watch com.fire.arthas.demo.web.ArthasTestController watchMethod '{params,returnObj,throwExp}' -n 2 -x 3
1)异常的情况
2)正常输出
3)调整输出遍历深度,观察参数的属性值,当前对象中的属性
执行如下命令
watch com.fire.arthas.demo.web.ArthasTestController watchMethod -x 4
可以看到当前对象中TestService内部的cahce这map的值,如果x设置为4的话则只能看到上一层。
# 3.monitor
功能 对方法执行监控,可监控方法执行的成功失败次数,平均RT,失败率等。非实时返回命令。
监控维度:
- timestamp : 时间戳
- class : Java类
- method : 方法(构造方法、普通方法)
- total : 调用次数
- success : 成功次数
- fail : 失败次数
- rt : 平均RT
- fail-rate : 失败率
用法
monitor com.fire.arthas.demo.service.TestService montorMethod -n 10 --cycle 10
参数说明:
- n :监控次数
- cycle 监控周期,单位为秒,10代表10秒,也可简写为-c
案例
本案例demo中montorMethod方法代码:
@GetMapping("/monitor")
public void monitorMethod(){
int index=0;
while(index<15){
try {
testService.montorMethod(index);
index++;
}catch (Exception e){
index++;
logger.error("调用失败!");
}
}
}
public void montorMethod(int i){
if(i%5==0){
throw new RuntimeException();
}
System.out.println(i);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
执行如下命令
monitor com.fire.arthas.demo.service.TestService montorMethod -n 10 --cycle 10
从图中可开出方法montorMethod执行15次,成功12次,失败3次,失败比例20%,平均RT为0.04ms。
# 4.stack
功能 输出当前方法被调用的调用路径,找到调用根源。
用法
stack com.fire.arthas.demo.service.TestService traceMethod4 -n 5
参数说明:
- n :执行次数
案例
执行如下命令
stack com.fire.arthas.demo.service.TestService traceMethod4 -n 5
输出TestService.traceMethod4方法的调用栈
# JVM相关
# 1. thread
功能
查看当前线程信息,查看堆栈
用法
thread -n 2 -i 100
- id :工具id查看线程
- n :指定最忙的前n个线程并打印堆栈
- b :找到阻塞其他线程的线程
- i :cpu使用率的采样间隔,默认200ms
案例
1)查看最忙的线程
2)查看死锁
注意
目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。
3)根据线程状态过滤
# 2.jvm
功能 查看当前JVM信息,主要包括虚拟机相关信息、加载类数量、垃圾回收、内存、操作系统、线程等信息
用法
jvm
案例
# 3.heapdump
功能
转存储堆dump,类似jmap命令的heap dump功能。
jmap使用:
jmap -dump:format=b,file=dump.txt pid
用法
heapdump /tmp/arthas/arthas-demo.hprof
案例
执行如下命令
heapdump f:/arthas/arthas-demo.hprof
# 4.logger
功能
查看logger信息,更新日志级别
用法
查看
logger
更新
logger --name ROOT --level debug
- name :日志名称,对应Loggers里面的loggerName
- level :日志级别
案例
本案例demo中的的logger配置
...
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
<Logger level="info" name="com.fire.arthas.demo">
<AppenderRef ref="Console"/>
</Logger>
...
2
3
4
5
6
7
8
@GetMapping("/logger")
public String loggerMethod(String name){
logger.debug("进入logger方法!,参数name:"+name);
if (StringUtils.hasLength(name)){
logger.debug("获取到参数name");
return name.concat("_sutifix");
}
logger.debug("获取到参数为空,返回错误!");
return "error";
}
2
3
4
5
6
7
8
9
10
11
此时访问localhost:8081/test/logger 无日志输出
- 查看logger信息
执行如下命令
logger
- 修改日志级别
logger --name com.fire.arthas.demo --level debug
再次请求,控制台输出了日志信息
# 字节码反编译相关
# 1.sc
功能
查看JVM已加载的类信息
用法
sc -d -f com.fire.arthas.demo.ArthasDemeApplication -x 3
参数说明:
- d :输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 如果一个类被多个ClassLoader所加载,则会出现多次
- f :输出该类的所有成员变量
- x :输出静态变量时的深度,默认为0
案例
sc -d -f com.fire.arthas.service.TestService -x 3
# 2.sm
功能 查看已加载类的方法信息
用法
sm -d com.fire.arthas.demo.service.TestService *
参数说明:
- d :展示方法详细详细
# 3.jad
功能
反编译指定已加载类的源码
用法
jad --source-only com.fire.arthas.demo.ArthasDemeApplication -c 5556b35d
参数说明:
- source-only:不带classLoader信息
- c :指定classLoader,当类被多个类加载的时候需要指定
案例
# 4.mc
功能
内存编译器,编译java代码
用法
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
参数说明:
- d :指定输出目录
案例
比如线上有个问题,始终没找到问题出在哪,这个时候我想打印一些日志来协助排查问题
jad --source-only com.fire.arthas.demo.web.ArthasTestController > /usr/local/arthas/ArthasTestController.java
修改完成之后,用mc编译,但是不一定成功
mc /usr/local/arthas/ArthasTestController.java -d /usr/local/arthas/
# 5.retransform
功能
加载外部的.class文件,retransform jvm已加载的类。
- 不允许新增加field/method
- 正在跑的函数,没有退出不能生效
用法
retransform ArthasTestController.class
案例
- jad命令反编译,修改代码
jad --source-only com.fire.arthas.demo.web.ArthasTestController > /usr/local/software/arthas/jad/ArthasTestController.java
- mc命令来内存编译修改过的代码
mc /usr/local/software/arthas/jad/ArthasTestController.java -d /usr/local/software/arthas/jad/
- 用retransform命令加载新的字节码
retransform /usr/local/software/arthas/jad/ArthasTestController.class
# 6.redefine
功能
加载外部的.class文件,redefine jvm已加载的类。
- 不能修改、添加、删除类的field和method
- 和watch/trace/jad/tt等命令冲突
- reset命令对redefine的类无效
- 正在跑的函数,没有退出不能生效
注意
redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field),参考jdk本身的文档。
用法
redefine ArthasTestController.class
案例
和retransform类似
# 火焰图
1.profiler
功能
生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
用法 启动
profiler start --event cpu -d 500
参数说明:
- event : 采样事件 ,支持cpu 、alloc 、lock 、wall 、itimer等
- d : 采样时间 采样并输出
profiler stop --format html
或者
profiler stop --file /usr/local/profiler.html
参数说明:
- format : 输出格式
- file :输出文件
案例
默认情况下采样后访问 http://localhost:3658/arthas-output/ (opens new window) 可以看到采样结果
参考:https://arthas.aliyun.com/doc/ (opens new window)
案例源码:https://gitee.com/firegitspace/arthas-demo.git (opens new window)
在线教程:https://start.aliyun.com/handson-lab?category=arthas (opens new window)