☕【JVM 监控实战】教会你使用 Arthas(监控 ElasticSearch 服务)
Arthas 简介
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱,当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。使用说明可以看下官方文档
Arthas 支持 JDK6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
安装 Arthas(1)
本身并不需要安装,就是一个 jar 包。
启动 arthas 的 jar 包是 arthas-boot.jar
安装 Arthas(2)
还有一种方法进行监控,Arthas 非常小巧,官方有一个可直接执行的 sh 脚本供我们使用,可以通过以下
指令下载
启动 Arthas
安装 ElasticSearch
Arthas 启动需要存在至少一个及以上的 Java 进程,这里我们为了方便测试,直接安装 ElasticSearch。和安装 JDK 的方式类似,我们去官方下载一个 tar.gz 的压缩包,然后解压
ElasticSearch 的不允许 root 用户启动,所以笔者用的是 nico 账号,创建账号过程如下
以上指令请分开到对应的目录执行,执行完毕之后我们进入 elasticsearch 目录下的 bin 目录中,启动 elasticsearch
监控 ElasticSearch
进入as.sh
所在目录,启动 Arthas
我们看到,当前只有 ElasticSearch 一个进程,输入 1 监控 ElasticSearch,选择 attach 的进程绑定
启动成功,Arthas 提供一个 shell 的操作模式来供我们去监控 Java 进程,具体指令可以看下官方的Wiki
安装过程可能遇到的问题
(1) 遇到报错 java.security.AccessControlException: Access Denied
官方解决办法
java.policy 所在的目录为 JDK 所在目录下的相对目录jre/lib/security
尾部增加一行即可
常用命令
Dashboard
注意在 arthas 中,有 tab 键填充功能,所以比较好用。但是这个界面是实时刷新的,一般 5s 刷新一次,使用 q 键退出刷新(没有退出 arthasq)。
Thread
这个命令和 jstack 很相似,但是功能更加强大,主要是查看当前 JVM 的线程堆栈信息,同时可以结合使用 thread –b 来进行死锁的排查死锁。
参数解释:
-n 指定最忙的前 n 个线程并打印堆栈
-b 找出阻塞当前线程的线程
-i 指定 cpu 占比统计的采样间隔,单位为毫秒
实战演示
thread –h 显示帮助
thread –b 找出阻塞当前线程的线程
如果有死锁,会有红色的字提醒着,这个阻塞的线程已经被另外一个线程阻塞:
`thread -i 1000 -n 3` 每过 1000 毫秒进行采样,显示最占 CPU 时间的前 3 个线程
thread --state WAITING 查看处于等待状态的线程
jvm
jad
反编译指定已加载类的源码
trace
使用 trace 命令可以跟踪统计方法耗时。继续跟踪耗时高的方法,然后再次访问。
比如使用一个 Springboot 项目,控制层 getUser 方法调用了 userService.get(uid);,这个方法中分别进行 check、service、redis、mysql 等操作操作。就可以根据这个命令跟踪出来哪里的耗时最长。
monitor
每 5 秒统计一次 cn.enjoyedu.demo.controller.DemoController 类的 test 方法执行情况:
watch
查看入参和出参
Arthas 命令汇总
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/c75fdb55b13a6ef7e2abe1e69】。文章转载请联系作者。
评论