1. 简介
arthas是阿里巴巴一款开源的java诊断工具,arthas本身也是通过java进行开发的。arthas能实现在应用程序服务不停止的场景下,将arthas的jar包动态的加载到应用的jvm中,从而实现动态修改应用程序中在jvm上运行的字节码,达到对应用程序增强的效果。
在日常测试或线上运行应用程序的时候,遇到如下场景的时候,可使用arthas协助进行问题排查。
- 应用程序无法进行debug,日志打印不完善。
- 需排查接口耗时位置。
- 需查看接口入参参数,接口未打印入参数据的情况下。
- 需排查阻塞线程。
- 需要查看某个变量的值。
上述场景只是在我们项目中用的比较多的场景,arthas本身支持的功能是非常强大的,需要的小伙伴可查看更详细的资料进行学习,这里仅介绍我们业务中的一些使用场景。
2. arthas安装与启动
arthas由于是基于java开发的,因此使用环境上需提前安装好jdk,arthas依赖的jdk版本最低为1.6。
arthas的安装可通过源地址进行下载,也可以通过安装包直接进行解压使用。我们环境中使用的是第二种方式,下载arthas-packaging-3.6.9-bin.zip包,拷贝到环境指定目录下,执行如下命令进行解压:
unzip arthas-packaging-3.6.9-bin.zip
得到解压后的目录如下:
linux中直接使用如下命令进行启动即可:
sh as.sh
启动后,arthas会扫描环境中所有的java应用程序,如上图所示,arthas启动时扫描到jar包为detections-1.0.jar、进程号为9476的应用程序,指定需操作的应用程序时,只需指定进程号前面的序号即可,上图中指定的序号为1。指定完成后,arthas会启动完成,并进入到命令行交互界面。此时arthas就可以正常的使用了。
3. 测试使用场景分析
3.1 trace命令
在测试接口性能时,尤其关注接口的并发能力和执行正确率,而接口的并发能力又与接口单次执行时间相关,通过trace命令可打印出接口内部操作时间,时间单位为毫秒,可以通过打印清楚的看出接口中每个方法的耗时时间及耗时占比,耗时较高的方法还会高亮将时间标出。
trace命令格式:
trace class method
举例:
trace com.ctcc.kk.test.TestController testGetInfo
可通过-n命令指定对方法的追踪次数
trace class method -n count
举例:
trace com.ctcc.kk.test.TestController testGetInfo -n 1
可通过#cost命令指定只追踪大于指定时间的接口调用,时间单位为毫秒。
trace class method #cost>time
举例:
trace com.ctcc.kk.test.TestController testGetInfo #cost>100
3.2 watch命令
watch命令能够追踪方法的返回值、执行异常、入参等,由于异常通常能在日志中打印,所以在项目中日志不完善的情况下,问题排查中用的较多的时查看方法入参和方法返回值。
watch命令格式:
watch class method 表达式
举例:
watch com.ctcc.kk.test.TestController testGetInfo "{params,returnObj}" -x 2
其中表达式使用的是ognl表达式,可通过表达式指定查看入参、返回值或属性,并可指定入参条件,如只追踪某个入参大于某个值的调用。watch命令默认追踪的是方法调用后,也可通过命令指定方法调用之前、方法异常之后、方法返回之后。
3.3 monitor命令
monitor命令用来追踪指定时间段内指定方法的执行次数、成功次数、失败次数、平均耗时时间等。通常在压力测试中可用来观察指标。
monitor命令格式:
monitor class method -c time
举例:
monitor com.ctcc.kk.test.TestController testGetInfo -c 10
-c命令为指定统计周期,单位为秒,不指定时默认为120秒。
3.4 jad命令
在排查问题时,有时会发现日志中打印的记录与代码中的匹配不上,此时可通过jad命令反编译指定类或指定方法来查看使用的版本是否正确。
jad命令格式:
jad class [method]
举例:
jad com.ctcc.kk.test.TestController
此处代码不进行详细展示,只进行示例展示。
3.5 thread命令
测试过程中,有时候会遇到线程阻塞的问题,通过thread命令可查询到阻塞的线程,进而找到相对应的代码。
thread命令格式:
thread
此命令可列出所有线程及其状态。
通过指定线程号,可查看具体信息
thread thread-id
通过如下命令可查看阻塞线程:
thread -b
4. 总结
arthas在排查问题上功能非常强大,上述也只是列举了项目中比较常用的一些功能和命令,需要其他功能的小伙伴可查看更详细的官网文档。另外,arthas需要占用一定的资源,对于应用程序部署的服务器资源较小的,会有一定影响,在使用时需进行权衡。