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+cq可以中断执行。

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 就可以反编译指定ClassLoader加载的那个类了。

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下面的.arthaslogs/arthas目录。

【参考】
Arthas用户Case
JVM调优—04—-dump文件分析 、arthas在线排查工具

posted @ 2024-06-15 23:46  nuccch  阅读(101)  评论(0编辑  收藏  举报