介绍
程序员的日常,总是离不开“调优”和“排查”。尤其当线上环境出现问题,性能瓶颈把人逼疯。这时候,你就需要一款像 Arthas 这样的神器来救场。
什么是 Arthas?
简单来说,Arthas
是阿里巴巴开源的 Java
诊断工具,号称“线上问题终结者”。通过它,我们可以在线上环境下实时监控和分析 Java
应用的性能问题。无论是耗时长的接口,还是奇怪的 CPU
使用率,都能一网打尽。
github
地址
- https://github.com/alibaba/arthas
官网文档地址:
- https://arthas.aliyun.com/doc/
如何使用 Arthas?
Arthas的功能有什么?
你可以通过 Arthas 实现线程分析、内存泄漏检测、CPU 分析、类加载信息查看等一系列高级功能。
这里的说明引用官方文档,有不懂的可以自己去看官方文档,但本文今天要介绍的重点是他的线上接口耗时分析。
首先,确保你的环境满足要求,然后按照如下步骤操作:
1.下载 Arthas:从官方 GitHub 仓库下载 Arthas 的 zip 包并解压。
2.启动 Arthas:进入解压目录,运行 java -jar arthas-boot.jar
。Arthas 会自动找到当前运行的 Java
进程,并提示你选择要诊断的进程。
3.开始诊断:选择相应的进程后,你可以输入各种命令来分析问题。比如:
查看线程状态:thread -n 3
,显示当前消耗 CPU 最多的 3 个线程。
分析方法调用:trace <class-name> <method-name>
,跟踪指定方法的调用链,找出瓶颈。
- 比如我要分析类FileDownloadTaskApi
中的fileDownload
方法的耗时,我们使用如下命令
trace com.dekeinfo.personnel.controller.filedownloadtask.web.FileDownloadTaskApi fileDownload -n 1
如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如上面的例子里,捕捉到一次调用就退出命令
到这里就是等待方法被调用。然后我们调用接口,让接口调用该方法,之后Arthas
就会自动记录所有方法的调用时间了
可以看到listPackageByCondition()
这个方法是比较耗时的
默认情况下,trace
不会包含jdk
里的函数调用,如果希望trace jdk
里的函数,需要显式设置--skipJDKMethod false
上面的命令就变成如下方式了
trace --skipJDKMethod false com.test.query.OrderApplicationQueryService listPackage -n 1
其次也可以使用时间筛选命令,比如我们只展示方法调用耗时为>10ms的,则上面的命令变成如下方式
trace com.test.query.OrderApplicationQueryService listPackage '#cost > 10' -n 1
使用#cost > 10'
即可
希望这篇文章能帮到你,祝你早日成为调优达人!