tags: java, troubleshooting, monitor,arthas
一句话概括: Arthas 是 Alibaba 开源的 Java 诊断工具, 适合在线分析诊断 java 应用, 它算是 java 监控工具的集大成者, 本文将对它进行介绍.
上一篇文章《 java 应用监测(7)- 在线动态诊断神器 BTrace 》我们提到, 如果需要不停服务情况下对线上应用进行监测, 需要使用动态追踪技术, BTrace 是很好动态追踪工具, 但是使用起来还是有点复杂(需要写脚本), 那么有没有更简单一点的工具, 那就是 Arthas 了, 它是阿里开源的 Java 诊断工具, 进一步简化了动态追踪技术, 有了它, 可以直接查看类加载信息, JVM 信息, 线程堆栈信息, 追踪方法执行情况, 反编译类文件等, 基本涵盖了前面提到的 java 命令行工具的功能和 BTrace 的功能. 无需太多额外工作, 只需熟悉 Arthas 提供的命令即可, 很方便. 其实 Arthas 底层跟 BTrace 一样, 是基于 jvmAgent 方式, 使用 Instrumentation 方式修改字节码方式然后执行, 输出. 本文将对 Arthas 的使用进行介绍, 鉴于官方文档已经写得很详细, 建议大家直接阅读官方文档来学习, 本文只作抛砖引玉便可. 官网地址: https://alibaba.github.io/arthas
2 Arthas 安装与运行
2.1 下载 Arthas
官方推荐直接下载 jar 运行
2.2 运行 Arthas
把下载好的 arthas-boot.jar 包放到想要监测的 java 应用所在服务器, 跟 SpringBoot 应用一样, 直接使用 java 命令运行即可.
注意:
第一次运行, 下载慢可以使用 --repo-mirror aliyun--use-http
启动后, 会列出当前的 java 应用列表(有点像 jps-l ), 输出序号选择想要监测的应用即可.
启动后即进行 Arthas 的命令行界面, 可以使用 Arthas 提供的命令来实现需要监测的功能. 如下图, 需要监测的 java 应用是示例 java-monitor-example .
2.3 退出
如果只是退出当前的连接, 可以用 quit 或者 exit 命令. Attach 到目标进程上的 arthas 还会继续运行, 端口会保持开放, 下次连接时可以直接连接上.
如果想完全退出 arthas, 可以执行 shutdown 命令.
3 Arthas 使用
Arthas 的使用就是需要学会使用它提供的命令功能, 主要分为几大类:
基本命令: help , cat , pwd , history , quit 等等, 跟 Linux 的命令差不多.
jvm 相关: dashboard , thread , jvm , sysenv 等等, 主要是对 JVM 信息的监测, 跟之前学习 java 命令行工具 jinfo , jmap , jstack 等有异曲同工之妙.
class/classloader 相关: sc , sm , jad , dump , classloader 等等.
monitor/watch/trace 相关: monitor , watch , trace , stack 等等, 这些功能基本涵盖了 BTrace 中所实现的功能, 包括定时检测, 方法参数, 返回值, 调用时长等.
下面对常用的几个命令进行说明, 详细的命令列表请查阅官方文档.
3.1 概览: dashboard
启动 Arthas 后, -h 查看使用帮助:
相当于概览, 在一个界面中显示线程, 内存, gc 情况, vm 情况和 tomcat 信息. 如下图(官方文档的示例图):
这个概览的信息默认 5 秒刷新一次, 对于内存变化, 线程占用情况, GC 次数, 一目了然. 使用 ctrl+c 退出.
3.2 线程信息: thread
还记得 jstack 吗, 我们需要先找出线程 ID, 使用它导出线程堆栈, 然后使用线程 ID 查看. 在 Arthas 中就方便多了, 像上面 dashboard 中, 已经有 ID, 直接使用 thread id 即可. -h 查看帮助文档:
如上面所示的 EXAMPLES , 使用 thread 命令, 可以找出占用 CPU 最高前 N 个线程( -n ), 可以打印指定线程的运行堆栈( id ), 找出当前阻塞其他线程的线程( -b ), 由此来分析线程问题很方便.
3.3 JVM 信息: jvm
jvm 命令很简单, 没有参数, 它输出的信息包括运行参数, 类加载信息, 内存情况, 系统信息, 线程数信息, 文件描述符等. 有点像 jvisualvm 的中 概述 , 但比它更详细.
3.4 反编译: jad
有时需要检测线上运行的应用中, 新的代码是否有使用或者是否有更新到, 可以把加载的类反编译出来, 查看源码是否为最新的, 这时 jad 就很有用. -h 打印使用帮助:
如上面所示的 EXAMPLES ,jad 可以反编译类( class-pattern ), 反编译类的某个方法( method-name ), 如果有多个 classLoader , 还可以使用 -c 来选择显示哪个等.
3.5 方法执行监控: monitor
monitor 可以定时输出方法的执行情况进行监控, 包括调用次数, 成功次数, 失败次数, 平均时长, 失败率等, 有点像 BTrace 中的 @Timer , 但是更方便. -h 查看使用帮助:
如上面所示的 EXAMPLES , 可以监测方法执行情况, 默认是 60s 输出一次, 可以使用 -c 来修改输出间隔时间.
3.6 方法执行数据监测: watch
类似于 BTrace 的 @OnMethod , 若想在线上的应用中把执行方法时的参数, 返回值, 异常信息, watch 命令就非常合适. -h 使用帮助:
如上面所示的 EXAMPLES , 监测时机分别是方法执行前 ( -b ), 方法执行结束( -f , 默认值), 方法执行成功( -s ). 监测内容包括: 参数( params ), 返回值( returnObj ), 异常( throwExp ) 等.
4 总结
Arthas 的强大功能, 基本可以对 java 应用进行全面的监测, 是线上应用监测的好帮手, 本文相对比较简单地对 Arthas 的安装和使用进行入门讲解, 抛砖引玉, 希望大家能上 Arthas 官方网站进一步学习, 里面已经对各命令都有详细的讲解和示例, 从而让自己的 java 监测技术更扎实.
参数资料
Arthas 官网:
https://alibaba.github.io/arthas/
来源: http://www.tuicool.com/articles/amAna23