Arthas生产性能测试工具

简介

  • Alibaba开源的Java诊断工具
  • 生产中对类、方法性能评估
  • 查询classloader关系
  • 查看异常信息
  • jvm、线程池和堆栈等运行状态
  • 代码修改和热加载

    安装

    下载arthas-boot.jar,然后用java -jar的方式启动:
1
2
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

打印帮助信息:

1
java -jar arthas-boot.jar -h

如果下载速度比较慢,可以使用aliyun的镜像:

1
java -jar arthas-boot.jar --repo-mirror aliyun --use-http

如果从github下载有问题,可以使用gitee镜像

1
curl -O https://arthas.gitee.io/arthas-boot.jar

使用as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车 执行即可:

1
curl -L https://alibaba.github.io/arthas/install.sh | sh

常用命令

help——查看命令帮助信息

cat——打印文件内容,和linux里的cat命令类似

echo–打印参数,和linux里的echo命令类似

grep——匹配查找,和linux里的grep命令类似

tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似

pwd——返回当前的工作目录,和linux命令类似

cls——清空当前屏幕区域

session——查看当前会话的信息

reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

version——输出当前目标 Java 进程所加载的 Arthas 版本号

history——打印命令历史

quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出

keymap——Arthas快捷键列表及自定义快捷键

jvm相关命令

dashboard——当前系统的实时数据面板

thread——查看当前 JVM 的线程堆栈信息

jvm——查看当前 JVM 的信息

sysprop——查看和修改JVM的系统属性

sysenv——查看JVM的环境变量

vmoption——查看和修改JVM里诊断相关的option

perfcounter——查看当前 JVM 的Perf Counter信息

logger——查看和修改logger

getstatic——查看类的静态属性

ognl——执行ognl表达式

mbean——查看 Mbean 的信息

heapdump——dump java heap, 类似jmap命令的heap dump功能

使用

以Java Agent的方式启动

通常Arthas是以动态attach的方式来诊断应用,但从3.2.0版本起,Arthas支持直接以 java agent的方式启动。

比如下载全量的arthas zip包,解压之后以 -javaagent 的参数指定arthas-agent.jar来启动:

java -javaagent:/tmp/test/arthas-agent.jar -jar arthas-demo.jar
默认的配置项在解压目录里的arthas.properties文件里。

退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

选择应用java进程:

1
2
3
$ $ java -jar arthas-boot.jar
* [1]: 35542
[2]: 71560 arthas-demo.jar

Demo进程是第2个,则输入2,再输入回车/enter。Arthas会attach到目标进程上,并输出日志.

查看dashboard

输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行.

class/classloader相关

sc——查看JVM已加载的类信息

sm——查看已加载类的方法信息

jad——反编译指定已加载类的源码

mc——内存编译器,内存编译.java文件为.class文件

redefine——加载外部的.class文件,redefine到JVM里

dump——dump 已加载类的 byte code 到特定目录

classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

monitor——方法执行监控

watch——方法执行数据观测

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

stack——输出当前方法被调用的调用路径

tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

常用命令

thread

通过thread命令来获取到arthas-demo进程的Main Class
thread id,查看线程堆栈

1
2
$ thread 1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)

thread -n 3

命令打印出CPU占比最高的前三个线程,这差不多是top -Hp & printf & jstack 三令合一的效果了

通过jad来反编译Main Class

1
jad demo.MathGame

通过watch命令来查看demo.MathGame#primeFactors函数的返回值

1
2
3
watch demo.MathGame primeFactors returnObj

watch -n 100 -b com.xx method1 params

观察当前对象中的属性
如果想查看方法运行前后,当前对象中的属性,可以使用target关键字,代表当前对象

1
2
3
4
5
$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]

trace

包含jdk的函数
–skipJDKMethod skip jdk method trace, default value true.

默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置–skipJDKMethod false。

1
$ trace --skipJDKMethod false demo.MathGame run

trace次数限制
如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令。

1
$ trace demo.MathGame run -n 1

据调用耗时过滤

1
$ trace demo.MathGame run '#cost > 10'

trace多个类或者多个函数
trace命令只会trace匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。

可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。

1
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

tt

tt 命令会记录方法调用时的所有入参和返回值、抛出的异常、对象本身等数据。INDEX字段代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作。

1
2
3
4
5
6
7
8
9
[arthas@384]$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod -n 10 '#cost > 10'
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 622 ms.

INDEX COST(ms) OBJECT CLASS METHOD
------------------------------------------------------------------------------------
1000 481.203383 0x481eb705 RequestMappingHandlerAdapter invokeHandlerMethod
1001 3.432024 0x481eb705 RequestMappingHandlerAdapter invokeHandlerMethod
...

-t,表明希望记录下类方法的每次执行情况。
-n 3,指定需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。

解决方法重载
tt -t *Test print params.length==1

通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写
tt -t *Test print ‘params[1] instanceof Integer’

解决指定参数
tt -t *Test print params[0].mobile==”xxxxx”

查看调用信息
tt -i 1003 |tee ~/a.txt

------ 本文结束------

本文标题:Arthas生产性能测试工具

文章作者:Perkins

发布时间:2020年08月17日

原始链接:https://perkins4j2.github.io/posts/62389/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。