【初】Arthas 线上排查问题好帮手
大约 3 分钟
- 视频讲解 https://www.bilibili.com/video/BV1FD4y1j73p
- 官方文档 https://arthas.aliyun.com/doc/
一、安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
curl -L https://arthas.aliyun.com/install.sh | sh
二、场景
2-1、查看当前服务运行的参数 JVM、内存、启动参数等
1、memory
查看当前堆和非堆的内存使用情况
2、thread
# 查看全部的线程状态
thread
# 查看当前最忙的 n个线程
thread -n
# 查看被阻塞的线程
thread -b
3、查看当前类的方法
sm cn.data.process.api.ApiApplication
4、其它
cls
清空控制台history
查看历史的命令pwd
查看当前目录quit
推出 arthasreset
重制所有的 arthas的增强操作stop
关闭 Arthas 服务端,所有 Arthas 客户端全部退出。会重置掉所有做过的增强类,但是用 redefine 重加载的类内容不会被重置。version
查看当前的 arthas 的版本
2-2、查看线上源码
# 查看源码
jad cn.data.process.api.ApiApplication
# 保存反编译的源码
jad --source-only com.example.demo.arthas.user.UserController > /UserController.java
2-3、修改线上源码
修改的原理就是 把 ,生成 class的方式有2种
- 把你本地的 class上传到服务器
- 通过 arthas的
jad
命令来把 class反编译成 java ,mc
命令来把 java 编译成 class retransform
命令把 class加载到 jvm中去
方法一就没什么好说了,来看方式二
# 1、从原class 里面复制出新的 java文件(有可能反编译会有问题,建议先检查下结果)
jad --source-only cn.data.process.api.web.WkDataController > /WkDataController.java
# 2、修改java里面的内容为你想要的内容
# 3、使用 mc 把你的java 编译成 class
mc /WkDataController.java -d /
# 4、把新的class 加载到JVM中去
retransform /cn/data/process/api/web/WkDataController.class
2-4、监控线上代码
- monitor 间隔N秒,统计 某个方法 成功次数、失败次数、平均耗时、失败率
- stack 打印整个栈的信息,太长了感觉没啥用
- trace 监控某个方法各个步骤的耗时
1、monitor
# 每隔 5s 监控一下WkDataController 类的 test 方法
monitor -c 5 cn.data.process.api.web.WkDataController test

2、stack
打印整个栈的信息,太长了感觉没啥用
stack cn.data.process.api.web.WkDataController test2
3、trace (排查慢接口好帮手)
# 监控一下WkDataController 类的 test 方法的执行耗时
trace cn.data.process.api.web.WkDataController test

4、参数过滤
- https://github.com/alibaba/arthas/issues/71
- https://github.com/alibaba/arthas/issues/11
上面的监控虽然很好,但在实际的项目中,我们的访问量很大,我们想要监控某个请求这时候通过参数过滤将会是完美的方案。
4-1、监控某个参数的值
@GetMapping("/test1")
public void test1(@RequestParam String str, @RequestParam Integer age) {
System.out.println(str + " " + age);
}
# 监控 str == zxc
trace cn.data.process.api.web.WkDataController test1 "params[0] == 'zxc'"
# 监控 age >= 1
trace cn.data.process.api.web.WkDataController test1 "params[1] >= 1"
@PostMapping("/test2")
public void test2(@RequestBody TestDTO testDTO) {
System.out.println(testDTO.getName() + " " + testDTO.getAge());
}
# 监控 name == 111
trace cn.data.process.api.web.WkDataController test2 "params[0].name == '111'"
2-5、修改日志的级别
Arthas 支持修改每个类的日志级别,这里只演示修改整个系统的日志级别 https://arthas.aliyun.com/doc/logger.html
# 1、查看日志信息
logger
# 2、修改日志的隔离级别
logger --name ROOT --level debug