前言:

最近团队在研究线上问题排查方式,对于大流量高QPS的系统,传统的通过日志排查问题的思路已经不可行,因为流量太高,每个请求都打日志,会对服务本身造成较大的影响比如磁盘写入较高,cpu消耗高,线程阻塞等等。那么此时即使打日志,也会部分打或者不打日志。

排查利器

Arthas,阿里巴巴的产品,开源的Java诊断工具,个人喜欢玩儿魔兽,这个名字还是很有魔力的。

功效:

那么Arthas能帮我们做什么事情呢?详细的用法大家可以查官方文档,这里带大家实践:

1.可以监控到JVM的实时的运行状态
2.可以实时查看系统的运行状况
3.遇到线上高流量系统,没有打日志,同时不能debug,线下却又不能重现,可以无须重启在线查看类方法输入输出,如同日志一般。
4.怀疑代码没有commit就发布了,它帮你在线查看。
......

安装启动

这里推荐快速简单的安装方法,大家也可下载包安装。

curl -O https://arthas.aliyun.com/arthas-boot.jar --下载jar包
java -jar arthas-boot.jar  --启动
java -jar arthas-boot.jar -h  --查看帮助

如下图,显示arthas启动成功,并链接到服务。
安装启动

系统dashboard

可以查看系统的整体情况如下图:线程、内存、系统运行时信息等
在这里插入图片描述

jvm全景报表

帮助你分析现有系统情况,类加载情况,线程情况,系统内存情况等等
如下图:笔者并未截取全部
在这里插入图片描述

在这里插入图片描述

thread 命令

thread 查看当前线程
thread id 查看指定线程id 的堆栈
thread -n 2 查看cpu最忙的前2个线程
thread -b, 找出当前阻塞其他线程的线程
thread -n 2 -i 1000 列出1000ms内最忙的2个线程堆栈

在这里插入图片描述
在这里插入图片描述
thread -b, 找出当前阻塞其他线程的线程
有时候我们发现服务卡住了, 一般情况是:
某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成阻塞。
这个命令可以解决。

watch命令,执行数据监测

线上没有打日志,同时不能debug,线下却又不能重现,watch命令可以无须重启在线查看类方法输入输出,如同日志一般。
能观察到的方法监测的数据范围:返回值、抛出异常、入参。

watch demo.MathGame primeFactors "{params,returnObj}" -x 4 
观察 demo.MathGame.primeFactors 的入参 和 返回值 遍历深度4

在这里插入图片描述

看下这个方法的源码,你会更理解
在这里插入图片描述

jad命令,反编译指定已加载类的源码。

你有时候有这样的疑惑,现在运行的代码是我提交的代码吗?虽然master有,但是线上运行的包是这个master打的吗?它可以直接在线反编译。

jad demo.MathGame  反编译demo.MathGame
jad --source-only demo.MathGame 反编译demo.MathGame只展示源码
jad demo.MathGame main 反编译demo.MathGame main函数
jad demo.MathGame --classLoaderClass sun.misc.Launcher$AppClassLoader 指定classloader,用于多个classloader加载的情况

在这里插入图片描述

trace命令

跟踪方法内部调用路径,并输出方法路径上的每个节点上耗时

trace demo.MathGame run 追踪demo.MathGame run 方法
trace demo.MathGame run -n 1  追踪demo.MathGame run 方法只1次即退出
trace demo.MathGame run '#cost > 10' 追踪大于10ms的

在这里插入图片描述

sc 命令

查看JVM已加载的类信息

sc demo.*  模糊搜索demo包下所有类
sc -d demo.MathGame 打印demo.MathGame的详细信息

在这里插入图片描述

官方文档

Github: https://github.com/alibaba/arthas
文档: https://arthas.aliyun.com/doc/

总结

Arthas功能庞大,是线上排查问题,性能分析的利器,建议大家使用,其实还有一些火焰图等等篇幅有限没有介绍,大家可以看看官方文档,自己摸索。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐