写点什么

☕【JVM 监控实战】教会你使用 Arthas(监控 ElasticSearch 服务)

发布于: 2 小时前
☕【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 包。

curl -O https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar
复制代码

启动 arthas 的 jar 包是 arthas-boot.jar

安装 Arthas(2)

还有一种方法进行监控,Arthas 非常小巧,官方有一个可直接执行的 sh 脚本供我们使用,可以通过以下

指令下载

curl -L https://alibaba.github.io/arthas/install.sh | sh
复制代码

启动 Arthas

./as.sh
复制代码

安装 ElasticSearch

Arthas 启动需要存在至少一个及以上的 Java 进程,这里我们为了方便测试,直接安装 ElasticSearch。和安装 JDK 的方式类似,我们去官方下载一个 tar.gz 的压缩包,然后解压

[nico@VM_0_17_centos elasticsearch]$ lltotal 95612drwxr-xr-x 9 nico root     4096 Sep 19 09:03 elasticsearch-6.4.0-rw-r--r-- 1 nico root 97901357 Aug 23 23:21 elasticsearch-6.4.0.tar.gz1234
复制代码

ElasticSearch 的不允许 root 用户启动,所以笔者用的是 nico 账号,创建账号过程如下

adduser nicopasswd nico#输入密码#将as.sh和elasticsearch的目录权限赋予nico账户chown nico as.shchown -R nico elasticsearchsu nico1234567
复制代码

以上指令请分开到对应的目录执行,执行完毕之后我们进入 elasticsearch 目录下的 bin 目录中,启动 elasticsearch

./elasticsearch1
复制代码

监控 ElasticSearch

进入as.sh所在目录,启动 Arthas

./as.sh或者 java -jar arthas-boot.jar pid
复制代码


[nico@VM_0_17_centos arthas]$ ./as.shArthas script version: 3.0.4Found existing java process, please choose one and hit RETURN.* [1]: 19670 org.elasticsearch.bootstrap.Elasticsearch
复制代码

我们看到,当前只有 ElasticSearch 一个进程,输入 1 监控 ElasticSearch,选择 attach 的进程绑定

[nico@VM_0_17_centos arthas]$ ./as.shArthas script version: 3.0.4Found existing java process, please choose one and hit RETURN.* [1]: 19670 org.elasticsearch.bootstrap.Elasticsearch1Calculating attach execution time...Attaching to 19670 using version 3.0.4...
real 0m0.227suser 0m0.177ssys 0m0.035sAttach success.Connecting to arthas server... current timestamp is 1537320967Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'. ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki: https://alibaba.github.io/arthasversion: 3.0.4pid: 19670timestamp: 1537320967728
复制代码

启动成功,Arthas 提供一个 shell 的操作模式来供我们去监控 Java 进程,具体指令可以看下官方的Wiki

安装过程可能遇到的问题

(1) 遇到报错 java.security.AccessControlException: Access Denied

官方解决办法

Add the permission in client.policy (for the application client), or in server.policy (for EJB/web modules) for the application that needs to set the property. By default, applications only have “read” permission for properties.For example, to grant read/write permission for all the files in the codebase directory, add or append the following to client.policy or server.policy:grant codeBase "file:/.../build/sparc_SunOS/sec/-" {   permission java.util.PropertyPermission "*", "read,write"; };
复制代码

java.policy 所在的目录为 JDK 所在目录下的相对目录jre/lib/security

vim java.policy
复制代码

尾部增加一行即可

permission java.security.AllPermission;
复制代码

常用命令

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

查看入参和出参

$ watch cn.enjoyedu.demo.controller.DemoController test '{params[0],returnObj}'
复制代码





Arthas 命令汇总



发布于: 2 小时前阅读数: 3
用户头像

我们始于迷惘,终于更高水平的迷惘。 2020.03.25 加入

🏆 【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 🤝未来我们希望可以共同进步🤝

评论

发布
暂无评论
☕【JVM监控实战】教会你使用Arthas(监控ElasticSearch服务)