Silentdoer

导航

初识阿里开源的本地Java进程监控调试工具arthas(阿尔萨斯)

转载自:https://www.cnblogs.com/linhui0705/p/9795417.html

先说使用步骤:

1.将arthas-bin.zip 解压到arthas-bin目录里,可以看到这个目录里会有arthas-boot.jar

2.java -jar arthas-boot.jar,然后它能自动识别本机上所有的java进程(除了arthas自己),要你选择一个java进程来诊断/监控

3.选择一个正在运行的java进程序号,比如选择了第一个java进程则输入1按回车

4.arthas会自动初始化好,进入arthas命令行状态;

5.输入arthas命令,如dashboard/thread来看诊断的java进程的一些运行信息;

 

参数解析:

内存heap栏的used、total、max是指当前java进程使用了多少堆内存;当前总共申请了多少堆内存;最大可以申请多少堆内存的意思;

GC应用申请内存是会一次性申请较多内存,而不是用到多少就申请多少,所以分为了三种情况;

 

火焰图:用profiler start开启火焰图采集(默认是cpu火焰图采集,可以用--event来执行采集其他指标),然后过一段时间用profiler stop停止采集并生成火焰图html;

然后用浏览器打开火焰图html文件,可以看到Y轴越高则说明调用链路越长,最上面的则是正在执行的方法(底层方法),往下是调用方;

而X轴越宽代表耗时越久或调用次数最多(消耗越多)【X轴没有时序性,右边的方法不代表它比左边的方法晚执行】,所以如果一个方法所在的区间越宽则说明可能存在性能问题;

绿色和蓝色表示是java代码;黄色是JVM的C++代码;橙色是内核态的C语言代码;红色是用户态的C语言代码;

 

 

 

上个月,阿里开源了一个名为Arthas的监控工具。恰逢近期自己在写多线程处理业务,由此想到了一个问题。

如果在本机开发调试,IDE可以看到当前的活动线程,例如IntelliJ IDEA,线程是运行还是休眠,在Debugger→Threads可以看到。倘若代码写完提交,到测试环境上构建,要怎样才能看到测试服务器上的线程运行情况呢?

前面客套完了,教程GitHub上面也有,这里主要讲下个人在部署的过程和踩到的坑。仅供参考。

GitHub: https://github.com/alibaba/arthas

Docs: https://alibaba.github.io/arthas/index.html

 

笔者用的是CentOS7裸机。看过教程,按照步骤执行命令:

1
curl -L https://alibaba.github.io/arthas/install.sh | sh

下载了个名称为as.sh的脚本,执行脚本,发现:

1
2
3
[root@bogon arthas]# ./as.sh 
Arthas script version: 3.0.4
illegal ENV, please set $JAVA_HOME to JDK6+

既然是Java监控,没有Java运行环境是不可能跑得起来的(这不是废话吗)。马上安装JDK配置环境变量……这里笔者装的是JDK8u181

JDK: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

解压到/usr/java,执行vi /etc/profile配置环境变量

1
2
3
export JAVA_HOME=/usr/java/jdk1.8.0_181
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin

:wq保存退出,再执行命令使配置的变量生效

1
source /etc/profile

回到刚才的目录,启动arthas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@bogon ~]# cd /usr/local/arthas/
[root@bogon arthas]# ./as.sh 
Arthas script version: 3.0.4
Error: no available java process to attach.
 
Usage:
    ./as.sh [-b [-f SCRIPT_FILE]] [debug] [--use-version VERSION] [--attach-only] <PID>[@IP:TELNET_PORT:HTTP_PORT]
    [debug]         : start the agent in debug mode
    <PID>           : the target Java Process ID
    [IP]            : the target's IP
    [TELNET_PORT]   : the target's PORT for telnet
    [HTTP_PORT]     : the target's PORT for http
    [-b]            : batch mode, which will disable interactive process selection.
    [-f]            : specify the path to batch script file.
    [--attach-only] : only attach the arthas agent to target jvm.
    [--use-version] : use the specified arthas version to attach.
 
Example:
    ./as.sh <PID>
    ./as.sh <PID>@[IP]
    ./as.sh <PID>@[IP:PORT]
    ./as.sh debug <PID>
    ./as.sh -b <PID>
    ./as.sh -b -f /path/to/script
    ./as.sh --attach-only <PID>
    ./as.sh --use-version 2.0.20161221142407 <PID>
 
Here is the list of possible java process(es) to attatch:

结果发现,无可用Java进程。那就启动一个咯(挖鼻屎),继续……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@bogon arthas]# ./as.sh 
Arthas script version: 3.0.4
Found existing java process, please choose one and hit RETURN.
* [1]: 1244 test.jar
 
updating version 3.0.4 ...
######################################################################## 100.0%
./as.sh: line 182: unzip: command not found
mv: cannot stat ‘/tmp/temp_3.0.4_1265’: No such file or directory
update fail, ignore this update.
Calculating attach execution time...
Attaching to 1244 using version 3.0.4...
Error: Unable to access jarfile /root/.arthas/lib/3.0.4/arthas/arthas-core.jar
attach to target jvm (1244) failed, check /root/logs/arthas/arthas.log or stderr of target jvm for any exceptions.

然而,程序没有如期运行成功。

……

通过度娘Google各种途径,看了FAQ,作者建议是手动安装+手动拼接命令行启动。但是,有些麻烦,不喜欢(任性)

后面,看到了这个Issue: Error: Unable to access jarfile /root/.arthas/lib/3.0.4/arthas/arthas-core.jar。咦这不就是我共患难的兄弟吗?马上点进去。看到大神ralf0131的回答,顿时茅厕塞顿开:

1
First, please ensure /root/.arthas/lib/3.0.4/arthas/arthas-core.jar does exist.

cd到/root/.arthas/lib/3.0.4,发现目录下没有jar包。尝不到这瓜有点不甘心,只好手动安装了(真香~)

当前最新的包是3.0.4。下载,解压:

1
2
3
4
[root@bogon 3.0.4]# wget https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.0.4/arthas-packaging-3.0.4-bin.zip
......
[root@bogon 3.0.4]# unzip arthas-packaging-3.0.4-bin.zip 
-bash: unzip: command not found

好吧,我装,我解压……

1
2
[root@bogon 3.0.4]# yum -y install unzip
[root@bogon 3.0.4]# unzip arthas-packaging-3.0.4-bin.zip

顿时发现,刚才不是说/root/.arthas/lib/3.0.4/arthas路径下木有jar包吗,刚刚我把jar包解压到/root/.arthas/lib/3.0.4,只要再新建个arthas目录,再把4个jar包移进去就OK了。

1
2
3
[root@bogon 3.0.4]# mkdir arthas
[root@bogon 3.0.4]# mv *.jar arthas/
[root@bogon arthas]# ./as.sh

大功告……你以为这样就结束了?还有问题呢……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Arthas script version: 3.0.4
Found existing java process, please choose one and hit RETURN.
* [1]: 1244 test.jar
 
Calculating attach execution time...
Attaching to 1244 using version 3.0.4...
 
real    0m0.620s
user    0m0.148s
sys 0m0.043s
Attach success.
Connecting to arthas server... current timestamp is 1539615611
./as.sh: line 423: type: telnet: not found
'telnet' is required.

还要装telnet-client……

1
[root@bogon 3.0.4]yum -y install telnet.x86_64

最后再启动,回车,大功告成!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@bogon arthas]# ./as.sh 
Arthas script version: 3.0.4
Found existing java process, please choose one and hit RETURN.
* [1]: 1244 test.jar
 
Calculating attach execution time...
Attaching to 1244 using version 3.0.4...
 
real    0m0.132s
user    0m0.050s
sys 0m0.113s
Attach success.
Connecting to arthas server... current timestamp is 1539615853
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'  
 
 
wiki: https://alibaba.github.io/arthas
version: 3.0.4
pid: 1244
timestamp: 1539615854095
 
$

接下来就可以各种命令各种姿势各种把弄了……

 

总结:

  1. 安装arthas前需要装JDK,配置好JAVA_HOME等环境变量,以及telnet。unzip看情况,如果你解压完再上传到服务器,也行……

  2. 不知道是bug还是神马情况,按照文档的步骤再一次装在测试的服务器上,程序正常运行,没有报Error: Unable to access jarfile /root/.arthas/lib/3.0.4/arthas/arthas-core.jar的错误,4个jar包都在预期的路径。简单来说,有的机器运行./as.sh是会因少jar包报错的,有的是会正常运行的,具体情况具体分析。后期继续关注arthas的GitHub动态,看项目的最新进展。

 

就酱。睡觉……

posted on 2019-12-04 21:16  Silentdoer  阅读(2964)  评论(0编辑  收藏  举报