开源java诊断工具,阿里开源Java 线上诊断工具 Arthas 实践

摘要

排查一些生产环境问题,确实蛮好用的。

功能

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

参考文档

使用示例

环境安装

trace命令(追踪某个方法的执行耗时情况,支持多方法,时间过滤)

这个命令用来追踪方法的执行性能,支持按照时间过滤,更详细的参考官方文档 trace命令

正常单层跟踪调用链路

命令:

trace com.zero.secret.web.controller.AlbumController home

效果:

26446007923ed46ee205e8a96df2444f.png

结果里面,第一列是该方法的耗时,第二列是具体的方法,第三列是 代码所在的行号

筛选时间

有时候方法内的方法太多,可以根据时间过滤,筛选出超哥某个时间的方法。命令如下:

trace com.zero.secret.web.controller.AlbumController home '#cost > 10'

带上时间过滤测试的没有效果,下次再试试。

深层次跟踪调用链路

trace命令只能跟踪一层,如果想要跟踪更深层的方法,可以用多方法。

trace -E com.zero.secret.web.controller.AlbumController|com.zero.secret.dal.mapper.AlbumMapper home|selectByPrimaryKey

71914dea2942ca33454cf8f5b6cad607.png

注意:

trace本身是有耗时的,这里面显示的耗时没有减去trace本身的耗时

watch命令(支持在线查看变量的值)

详细的watch命令查看官方文档。watch命令

命令:

watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2

3d2c431d0945df9a26662b0e43635941.png

这里 -x 2 表示参数深度显示2层,默认只显示一层。下面是一层的返回结果,比对看看

03fd0c403e313398faea9988ac5872d0.png

这里入参的值就没有显示出来。

有时候要比对 参数在进入方法之前跟执行方法之后的值,比较着看 参数的值的变化,可以添加参数 -b -s 。命令如下:

watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2 -b -s

结果如下:

a113fb1a68af0d95992a08f38b3f5bb0.png

这里返回的有两组值。第一组值是进入方法时的入参和返回值,第二组是方法执行结束时的入参和返回值。

stack(查看方法调用链路)

详细stack命令参考官方文档 stack命令。

在一些复杂业务中,如果不知道某一个方法的调用链路,可以用这个命令查看调用链路。或者 不同的业务场景调用链路不一样时,也可以使用这个命令确定某个业务数据的调用链路。

命令如下:

stack com.zero.secret.service.AlbumService getAlbum

效果如下:

d232f4486bba998a9ebd0a12e3c16804.png

monitor (监控某个方法在一段时间内容的执行次数、成功的次数,失败的次数,平均耗时)

该命令的官方文档 monitor

命令如下:

monitor -c 10 com.zero.secret.web.controller.AlbumController home

上面是10s 统计一次。

结果如下:

72ea87dea926c706ed267b4edf61745e.png

dashboard(查看JVM 资源占用及垃圾回收情况)

thread(可以查看CPU资源占用靠前的几个线程详情,阻塞线程)

详情参考 thread 命令 这个命令可以查看当前CPU资源占用比较靠前的几个线程详情,能直观的看到比较耗资源的几个线程在干什么,方便排查问题。不用dump出堆栈,直接可以看,使用比较轻量级。

查看CPU占用靠前的几个线程

命令如下:

thread -n 3

结果如下:

23e08f560260288a36b392ea9b8fb7c3.png

找当前阻塞其它线程的线程

这个命令目前只能支持找出找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。实用性不够。 命令如下:

thread -b

结果看一下官方给的例子

7b63f750e0412edc6f6664b850b3b1b7.png

logger(可以动态的修改 logger的级别,可以指定 package 的级别)

这个命令也比较实用。以上就是关于 阿里开源Java 线上诊断工具 Arthas 实践 的全部内容了,喜欢的小伙伴别忘了点赞分享一下哦,关注优讯网,优讯有你更精彩!

转载自: https://my.oschina.net/liangxiao/blog/3122810

版权归原作者所有,如有侵权请联系我们删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值