![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/23405323Q-0.jpg)
文章插图
转载本文需注明出处:微信公众号EAWorld,违者必究 。
什么是Arthas
JAVA 诊断利器 Arthas,是阿里的一款开源工具 。Github-alibaba/arthas 上可以看到它的介绍 。
在日常开发中,当我们发现应用的某个接口响应比较慢,这个时候想想要分析一下原因,找到代码中耗时的部分,比较容易想到的是在接口链路的 IO 操作上下游打印时间日志,再根据几个时间点的日志算出耗时长的 IO 操作 。这种方式没有问题,但是加日志需要发布,既繁琐又低效,这个时候可以引入一些线上 debug 的工具,arthas 就是很好的一种,除了分析耗时,还可以打印调用栈、方法入参及返回,类加载情况,线程池状态,系统参数等等,其实现原理是解析 JVM 在操作系统中的文件,大部分操作是只读的,对服务进程没有侵入性,因此可以放心使用 。
Arthas能解决什么问题?
从我个人的使用经验来看,Arthas至少帮我解决了以下几个问题:
- 监控某方法查看其整个调用链路,从而找出某次调用的性能瓶颈 。
- 反编译某个类,查看线上的代码是否与本地代码一致,避免没有提交代码而导致的问题 。
- 站在全局视角查看整个系统的运行情况,比如观察内存增长、GC的情况 。
- 在微服务架构背景下,通常本地没有完整的环境,此时可以直接在测试环境监控某个方法传入的参数是否正确,返回值是否正确 。
快速开始
下载并启动arthas
输入以下命令启动arthas程序
curl -O https://arthas.aliyun.com/arthas-demo.jarjava -jar arthas-demo.jar
选择需要监控应用的进程编号,回车后Arthas会attach到目标进程上,并输出日志:
![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/23405323J-1.jpg)
文章插图
容器中使用
Docker exec -it arthas-demo /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
甚至我们可以直接把arthas放到容器镜像文件中:
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/2340534016-2.jpg)
文章插图
Arthas常用命令
【线上应用诊断与调试利器——Arthas】
下面简要为大家介绍一下Arthas常用的几个命令 。
dashboard
使用dashboard命令会显示以下信息:
1. 当前最繁忙的一些线程
2. 显示应用当前使用的内存信息,包括堆内存、新生代伊甸区、老年代、非堆内存的使用情况 。
3. 显示程序的GC情况,包括YGC次数、总花费时间,FGC的次数、总花费时间 。
4. 当前程序的一些信息,包括系统版本、JDK版本、程序运行时长等 。
![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/23405361N-3.jpg)
文章插图
Thread
查看当前线程信息,查看线程的堆栈
// 查看 CPU 使用率 top n 的线程的栈,当前最忙的前 n 个线程:thread -n 3// 查看 5 秒内的 CPU 使用率 top n 的线程栈:thread -n 3 -i 5000?// 查看线程是否有阻塞:thread -b
![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/2340533451-4.jpg)
文章插图
watch
有时候我们不太方便进行本地调试,这个时候可以使用watch监控某个方法,然后点击相关的功能,查看该方法的调用情况:
watch com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool "{params,returnObj}" -x 2
执行以上命令后,控制台会hold在被监控的方法上,此时再次点击页面上的按钮,控制台就会打印此次的调用结果 。
![线上应用诊断与调试利器——Arthas](http://img.jiangsulong.com/220422/2340532316-5.jpg)
文章插图
trace
trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路 。通常我们用这个方法可以看到整个调用路径的耗时,从而找出真正的性能瓶颈,帮助解决问题 。
推荐阅读
- 下一代视频编码技术的云视频应用探索
- 腾讯云快直播——超低延迟直播技术方案及应用
- python:栈的理解与应用
- 光纤收发器的应用与讲解
- 教您使用Win10“查看可靠性历史记录”快速诊断电脑故障
- 2020年部署Web应用的4种方式
- 到底什么是Hash?Hash算法的原理和实际应用讲解
- 适用于任何设备的屏幕共享应用程序–Mirroring360
- SpringBoot运行源码分析:Spring应用上下文准备
- ICMP协议及应用