简介
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率
常用命令
dashboard
用于显示当前被attach程序的实时数据,包括:线程,内存,系统等实时信息
相关参数有:
i: 时间间隔多久采集一次
n:采集次数
dashboard -i 3000 -n 5
示例如下:
sc
search-class的简写,用于显示被jvm加载的类的详细信息,包括类加载器的hashCode地址(后续多个命令需要用到的-c参数的值)
实例如下:
sc -d com.lyc.test.demo.service.TestService
注意列:class-loader列显示的就是该的类加载器信息
logger
用于显示日志的详细信息和修改日志级别
试想一下如果线上环境某个sql执行报错且无法简单的排查时,如果能打印执行的sql时是不是可以快速的定位?
查看logger的详细信息
此处显示Root的日志级别是info,如果想要修改某个类的日志显示级别
logger -c 685f4c2e --name com.lyc.test.demo.controller.TestController --level debug
其中-c后面跟的参数是该类的类加载器的hashcode值,通过sc -d命令可以查询
jad&mc
反编译和编译
jad用于直接在线上反编译对应的.class为.java文件
使用示例:
jad -c 685f4c2e --source-only com.lyc.test.demo.controller.TestController
如果后面接管道命令可以把反编译后的内容输入到指定的文件
jad -c 685f4c2e --source-only com.lyc.test.demo.controller.TestController > /root/TestController.java
mc -d /root/ /root/TestController.java 可以用于在线编译.java文件为.class文件,后续可以直接用编译好的文件结合redefine或者retransfer命令加载到JVM中,实现热更新
trace&stack&watch
trace命令用于跟踪类|方法的调用栈的耗时情况,在性能调优和问题排查过程中经常使用到
如上图,如下是一次请求的显示内容
stack命令用于跟踪方法的调用栈,在追踪方法调用逻辑时经常使用
watch命令用于观察方法调用的情况,包括请求参数,返回值,是否有异常等
其中命令参数 -x 2表示打印的参数|返回值的层级
tt
时空隧道命令,用于记录下请求的所有信息,一般的:tt -t className method -n 3
其中-t表示打印详细信息,-n表示收集多少次结束
搜集到相关信息之后,可以通过tt -i 查看当时请求的详细信息
redefine&retransfer
redefine用于加载外部的.class文件到jvm中,在以上讲解jad和mc命令时已有过简单介绍
比如在线上出现一个简单的bug,如果线上重新走发版流程会非常麻烦,耗时也长,可以直接通过jad反编译代码,然后修改,再编译,直接使用redefine命令加载即可
详细的命令清单可以查看arthas官网:简介 | arthas
dashboard接入
1 启动 arthas-tunnel-server
从github上下载:Releases · alibaba/arthas · GitHub
或者maven下载:maven-central: v3.7.2
arthas-tunnel-server是一个fatjar,可以直接通过java -jar命令启动,开通了2个端口:8080,7777
其中8080用于页面交互的http端口,其中7777是用于和应用接入端交互的端口,页面如下
2 应用端接入
一个springboot应用要接入arthas,只需做如下操作
1 引入依赖:
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.7.2</version>
</dependency>
2 配置文件
arthas:
agent-id: test-demo-123
tunnel-server: ws://192.168.56.105:7777/ws
telnet-port: -1
http-port: -1
其中arthas.agent-id是用于在dashboard端连接到应用端的唯一标识,每个应用实例要配置得不一样
如此配置,即可以在arthas-tunel-server的页面端连接到应用测做应用诊断
连接上之后,即可使用以上介绍的命令对应用做诊断了
无dashboard使用
如果应用没有做相关的jar依赖,依然可以使用arthas做应用诊断
1 下载arthas-boot.jar
在线下载:curl -O https://arthas.aliyun.com/arthas-boot.jar
或者将下载好的jar包上传到对应的服务器上
2 启动arthas做应用诊断
java -jar arthas-boot.jar
此时会显示该服务器上被检测到的java进程和对应的index,此时只需要选择对应的java进程index即可
这样arthas就已经attach到对应的应用上了,后续可以执行以上提到的相关命令做应用诊断即可
案例分享
线上问题排查,一不小心踩到阿里的 arthas坑了 | HeapDump性能社区