使用arthas排查JVM运行情况
Arthas是什么?
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
为什么选他?
因为容易上手,并且将线程、GC、内存、运行情况等信息都很清晰的展示出来了,并且有插件可以在idea上面使用插件连接到线上,进行线下监控并且调优,而且还是阿里开源工具
Arthas
官方文档地址:https://arthas.aliyun.com/doc/
GitHub地址:https://github.com/alibaba/arthas
简单操作(Linux)
在你的程序系统上面,运行下面的命令,如果是docker则需要到容器里面执行
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
- 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。
- 如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志。
- 如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
- java -jar arthas-boot.jar -h 打印更多参数信息。
执行这个命令以后控制台会输出对应的java进程。例如官网教程:
选择你的java程序,如果是1就输入 1 回车,2就输入2回车
回车以后会自动下载相关监控的jar包,然后会进入到arthas里面
常用命令
官网文档介绍:https://arthas.aliyun.com/doc/commands.html
我用的比较多的就是:
1、dashboard 当前系统的实时数据面板
2、options save-result true 开启日志存储
3、thread 查看线程执行情况
4、jvm 查看jvm信息
还有很多命令可以到上面的文档上面看
程序在Docker里面,怎么监控?
1、确保你的docker容器里面有jdk,而不是jre
官网描述:docker官网教程
很多时候,应用在 docker 里出现 arthas 无法工作的问题,是因为应用没有安装 JDK ,而是安装了 JRE 。
如果只安装了 JRE,则会缺少很多 JAVA 的命令行工具和类库,Arthas 也没办法正常工作。
下面介绍两种常见的在 Docker 里使用 JDK 的方式。
FROM openjdk:8-jdk
或者
FROM openjdk:8-jdk-alpine
第一种
docker exec -it {containerId} /bin/sh -c "wget https://arthas.aliyun.com/arthas-boot.jar"
下载完以后进入容器内部
docker exec -it {containerId} bash
然后 java -jar arthas-boot.jar 就是上面的操作
缺点:重新部署jar就没有了,得重新安装
第二种
将Arthas制作成基础镜像,程序启动的时候使用脚本自动copy进容器内,该方法没有实操过,各位懂哥可以实操后放在评论区。
实操
options save-result true 开启日志永久存储
结果会异步保存在:{user.home}/logs/arthas-cache/result.log,请定期进行清理,以免占据磁盘空间
user.home = 你linux上是哪个用户,我是root,所以我的logs日志在 /root/logs/arthas-cache/
查看 dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
然后就可以结合,thread命令来查看线程
问题
由于是在docker里面运行,这个操作存储的日志会在下一次程序重新部署的时候销毁掉,在需要调优的时候最好是将容器内的log日志
copy到linux上面进行日志排查