Arthas诊断工具实践
Arthas是一款线上监控诊断产品,通过全局视角实时查看应用负载、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
安装
如下阐述的是全量安装方式,这样就可以以离线方式使用Arthas,其他安装方式参考Arthas Install。
从Maven仓库下载
最新版本,点击下载 。
从Github Releases页下载
https://github.com/alibaba/arthas/releases
下载后解压到指定目录即可。
启动
用as.sh启动
解压后,在文件夹里有as.sh
,直接用./as.sh
的方式启动:
$ ./as.sh
打印帮助信息:
$ ./as.sh -h
用arthas-boot启动
解压后,在文件夹里有arthas-boot.jar
,直接用java -jar
的方式启动:
$ java -jar arthas-boot.jar
打印帮助信息:
$ java -jar arthas-boot.jar -h
启动arthas成功后,就可以看到当前所有的Java进程列表,选择进程ID前面的编号,即可attach
到指定进程然后执行相关arthas命令操作。
如下示例:
$ /as.sh
Arthas script version: 3.7.2
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 15440
[2]: 33881 sentinel-dashboard-1.8.0.jar
[3]: 1117
2 # 输入进程前面的编号
Arthas home: /Users/zhangsan/opt/arthas-packaging-3.7.2-bin
Calculating attach execution time...
Attaching to 33881 using version /Users/zhangsan/opt/arthas-packaging-3.7.2-bin...
real 0m1.730s
user 0m0.257s
sys 0m0.041s
Attach success.
telnet connecting to arthas server... current timestamp is 1718292072
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.7.2
main_class org.springframework.boot.loader.JarLauncher
pid 33881
time 2024-06-13 23:21:12
# 到这里就说明已经成功attach到Java进程
[arthas@33881]$
常用命令
dashboard
通过dashboard
命令查看进程概要,输入dashboard
命令,会展示当前进程的信息,如:线程列表(按CPU执行时间降序排列),堆内存信息,操作系统信息。
当线上环境出现CPU占用高的问题时,通过dashboard
命令可以找到CPU占用高的线程ID信息。
按ctrl+c
或q
可以中断执行。
heapdump
使用heapdump
命令将Java进程当前的堆内存状态dump到指定文件中,类似jmap
命令的heap dump功能。
$ heapdump /tmp/heapdum.hprof
memory
查看JVM内存信息,该命令没有参数。
jad
通过jad
命令来反编译Class:
$ jad org.chench.extra.java.mock.impl.EmbeddedTomcatMock
执行jad
命令将JVM中实际运行的class的字节码反编译成可阅读的java源码,便于确认发布到线上环境的代码是不是正确的。
- 在Arthas控制台上,反编译出来的源码是带语法高亮的,阅读更方便
- 反编译出来的java源码可能会存在语法错误,但不影响阅读理解
当有多个ClassLoader都加载了这个类时,jad
命令会输出对应ClassLoader实例的hashcode,然后只需要重新执行jad
命令,并使用参数-c
sc
使用sc
命令搜索所有已经加载到JVM中的Class信息:
# 模糊搜索
$ sc demo.*
# 打印类的详细信息
$ sc -d demo.MathGame
# 打印出类的 Field 信息
$ sc -d -f demo.MathGame
thread
使用thread
命令可以查看线程的堆栈,主要的应用场景有:
-
显示第一页线程的信息
当thread
命令没参数时,显示第一页线程的信息。默认按照CPU增量时间降序排列,只显示第一页数据,从这里也就可以知道当前占用CPU最高的线程ID。 -
查看当前最忙的前N个线程并打印堆栈
执行thread -n N
可以查看当前最忙的前N个线程并打印堆栈。 -
显示指定线程的运行堆栈
执行thread 线程ID
显示指定线程的运行堆栈。 -
获取进程的Main Class
执行thread 1
命令会打印线程ID为“1”的栈,通常是main函数的线程。
$ thread 1 | grep 'main('
at org.chench.extra.java.mock.impl.EmbeddedTomcatMock.main(EmbeddedTomcatMock.java:24)
-
找出当前阻塞其他线程的线程
有时候我们发现应用卡住了,通常是由于某个线程拿住了某个锁,并且其他线程都在等待这把锁造成的。为了排查这类问题,Arthas提供了thread -b
一键找出那个罪魁祸首。 -
查看指定状态的线程
执行thread --state 状态
查看执行状态的线程列比,线程状态值有:NEW
:线程还为启动RUNNABLE
:线程运行中BLOCKED
:线程被阻塞WAITING
:线程处于永久等待状态TIMED_WAITING
:线程处于超时等待状态TERMINATED
:线程处于终止状态
watch
通过watch
命令查看函数返回值,如下通过watch
命令来查看demo.MathGame#primeFactors
函数的返回值:
$ watch demo.MathGame primeFactors returnObj
退出
如果只是退出当前的连接,可以用quit
或者exit
命令,此时Attach到目标进程上的arthas
还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出Arthas,可以执行stop
命令。
卸载
在Linux/Unix/Mac平台,删除下面文件:
$ rm -rf ~/.arthas/
$ rm -rf ~/logs/arthas
在Windows平台直接删除user.home下面的.arthas
和logs/arthas
目录。
作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。