简介
Arthas 是一款开源的 Java 诊断工具,它可以帮助开发人员进行 Java 应用的实时诊断和故障排查。它提供了丰富的命令和功能,可以用于监控应用程序的运行状态、查看线程堆栈、跟踪方法调用、修改变量值等。在日常性能测试过程中,用来排查性能耗时问题必不可少。
使用方式
1、下载arthas工具
wget https://github.com/hengyunabc/katacoda-scenarios/raw/master/demo-arthas-spring-boot.jar
2、启动arthas
本身就是一个java程序,使用下述命令启动:
java -jar arthas-boot.jar
在启动界面选择自己要定位的服务,我这个是在本机上执行,有多个项目。这里提一个Pod的场景,现在一般都是运行在k8s环境中,我们服务是运行在Pod的容器里,所以如果要定位对应的服务需要把arthas拷贝到对应的Pod容器里,然后开启:
//复制文件
kubectl cp {本地文件路径} -c {容器名} {Pod命名空间}/{Pod名称}:{拷贝到容器的路径}
//进入Pod
kubectl exec -it {Pod名称} -n {Pod命令空间} -- /bin/bash
3、常用命令
下面介绍一些arthas的常用命令:
dashboard -i 3000
查看实时数据面板,-i代表数据刷新的时间间隔,单位毫秒,默认值5000
thread -n 3
查看当前最忙的三个线程
thread --state [state]
查看指定状态的线程
thread [id]
查看指定线程的堆栈信息
monitor -c 1 [类名] [方法名]
查看方法耗时
monitor -c 1 com.qt.wisteria.detect.v2.ids.eventflow.handler.WebshellCheckResultHandler handle
trace [类名] [方法名] -n 10000 --skipJDKMethod false
追踪方法重点耗时区域,相比monitor,这里会打印整个发放执行的时间以及方法里面的子方法的执行耗时
jad [类名全路径]
反编译代码,可以在线查看部署的包代码是否正确
heapdump
生成dump文件
实际案例
平时arthas使用最多的地方就是定位性能问题,一般在进行性能测试的时候都会通过脚本的方式进行大量的请求上报,这个时候如果发现接口慢短时间内是很难定位到到底是哪里耗时长,特别是针对那些业务逻辑复杂的,方法嵌套方法这种,今天就用一个实际案例看下如何用arthas定位性能问题,其实主要用到的是trace方法。
在介绍之前有些注意点我们需要知道,arthas是实时定位的,也就是程序在跑的时候,我们才可以定位到,比如我们用trace定位某个方法,只有这个方法有访问才可以,所以一般是开启工具,然后进行压测,实时监控情况。
测试性能发现incidents接口慢,用trace定位第一级接口耗时:
从耗时中可以看到这个方法里面的一些操作耗时,最耗时的是page方法,那么接着用trace定位page方法:
page方法显示是在一个mongo的stream查询里耗时最长,接着往下定位mongo的streamIncludes方法:
最终发现这里里面的操作都是很快的,但是mongo的streamIncludes是一个循环遍历的操作,这里遍历的数据量太大,导致整体耗时较长。
上述这个是一个比较简单的示例,实际使用中可能有更复杂的场景,但是方法是一样的,trace方法可以连续使用,只要我们的性能测试程序一直在跑。