1、背景
公司最近针对一些反应慢的接口进行梳理,着重要求处理一些耗时代码段(中间穿插第三方调用),针对这些痛点,原始方法为打log日志进行日志分析,逐个排查后统一修复,这种做法的缺点是:耗时、效率低,故使用阿里开源Arthas进行分析,大大提高效率
2、什么是 Arthas
Arthas 是阿里巴巴开源java诊断工具,他能帮你解决一些棘手问题:
1、这个类是从哪个jar包加载,为什么会抛出Exception
2、我的代码到底有没有发布成功,总是和运维扯皮
3、如何进行jvm实时监控
4、一些线上bug是否只能通过发包的形式解决
5、线上遇到一些用户问题,线上无法debug,现在无法复现,是否能够全局的审视此类问题
3、下载并启动
1、curl -O https://arthas.aliyun.com/arthas-boot.jar
2、java -jar arthas-boot.jar
### 如果端口被占用 修改启动命令
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
### 也可以指定目标ip
java -jar arthas-boot.jar telnet-port 9998 --http-port -1 --target-ip 127.0.0.1
1、arthas 启动会自动扫描可监控j进程
2、输入需要监控的序号
浏览器控制
3、打开日志保存
### 由于生产监控日志量比较大,建议打开日志保存,以便进行分析
options save-result true
### 日志保存位置
find . -name "arthas-cache"
4、常用命令
4.1、dashboard
###要标明次数 否则一直会滚动显示
dashboard -n 1
4.2 thread 命令
### 查询所有线程
thread -all
### 查询阻塞线程
thread -b
### 查询前3cpu最耗时线程
thread -n 3
### 查询线程id
thread 线程id
### 查询状态线程
thread state runable/block/time_await
4.3 常用系统命令
参数 | 参数描述 |
---|---|
jvm | THREAD相关 COUNT: JVM当前活跃的线程数 DAEMON-COUNT: JVM当前活跃的守护线程数 PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数 STARTED-COUNT: 从JVM启动开始总共启动过的线程次数 DEADLOCK-COUNT: JVM当前死锁的线程数 文件描述符相关 MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数 OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数 |
sysprop | 查看系统属性 |
sysenv | 查看当前JVM的环境属性(System Environment Variables) |
vmoption | 查看,更新VM诊断相关的参数 |
getstatic | 查看静态类属性 |
ognl | 可替代getstatic |
4.4、其他参数
5、实际案例
5.1 创建空循环线程,此时该线程会一直占用cpu
5.2 dashboard -n 3 查询jvm详情
从中发现,有一个cpu使用率异常
输入 thread 72 定位 异常位置
输入 jad 及异常代码位置 jad com.tm.provider.service.impl.LoginServiceImpl
当服务执行时,想要知道某一函数执行效率问题
trace 类地址 类函数
可以匹配出最耗时函数,同时也可以去除jdk函数
trace 类路径 函数名 -skipJDKMethod true
watch 函数
### 让你能方便的观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
watch 类名 函数 -x 2 --打印指定深度
tt 函数
### 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t 类名 函数名
参考地址: https://www.cnblogs.com/wwjj4811/p/16588261.html