目录
arthas简介
提到arthas就不得不提一下arthas的前身greys, 我最早研究查看的版本就是这个版本。在github的README中可以看到如下几句话:
-
线上系统为何经常出错?
-
数据库为何屡遭黑手?
-
业务调用为何频频失败?
-
连环异常堆栈案,究竟是哪次调用所为?
-
数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧?
当时看到上述的几句话让我对这个组件产生了深刻的印象,后来由于当时想做一个增强一个java客户端的时候,便针对该组件做了一些源码分析,针对阅读的内容对arthas做一系列简单的介绍。
个人觉得,最重要的是arthas提供了一项不需要重启服务就可以完成的一些业务特性:
1、动态增强字节码增强后在方法前后进行额外的增强
2、调用Mbean接口实现信息获取
3、通过执行本地命令实现部分额外的功能,如火焰图功能。
arthas的使用
在github项目上README.md中推荐的两种方式 + 个人推荐的方式:
1、下载arthas-boot .jar,之后启动java进程
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
2、现在as.sh脚本,并执行启动as.sh脚本(linux/unix/mac)注明,改种方式执行需要系统中安装了telnet,curl, grep, awk, unzip命令。
curl -L https://arthas.aliyun.com/install.sh | sh
3、个人觉得,在实际的环境中可能代操作的机器是不能访问外网的,很难执行上述两种方式。个人更加推荐将arthas的完整包下载下来, 下载解压后,执行as.sh/as.bat即可(注意启动的脚本的用户与java进程启动的用户是否一致),下载方式有如下两种:
-
从github的release中获取:https://github.com/alibaba/arthas/releases
-
从arthas.aliyun.com中获取:https://arthas.aliyun.com/download/{version},将version替换为对应的版本号即可
使用注意点
无论执行jar -jar arthas-boot.jar 或者执行as.sh均可以增加-h查看 arthas支持的参数列表。如当前我使用的是arthas的3.5的版本,执行后可以看到支持如下参数:
从上图上看参数比较多的,我们核心只需要关注如下几个参数:
-
--target-ip: 调整默认监听的ip地址, 默认监听地址是127.0.0.1,启动后在其它机器上只能通过ssh隧道之类的方式访问,可以调整为0.0.0.0,方便其它机器访问。
-
--telnet-port/--http-port: 该配置用于调整默认的telnet-port端口,如果想同时attach多个jvm进程/或3658端口被占用,就需要调整对应的端口值。
-
<pid> pid是指定要attach的进程,平时执行命令的过程中可以不用指定,在执行后会arthas会使用jps命令获取到当前机器上的当前用户启动的java进程。
常用命令
就个人平时使用而言,比较常用的命令有如下几个(本文针对arthas的使用仅仅做简单介绍,后续的文章对命令进行分组进行详细介绍):
-
sm, search method,简而言之,就是查找方法, 快速确定
-
sc, search class,就是查找类的信息,可以使用-d查看到classloader,源文件等信息,可以快速确定是否存在类加载冲突问题
-
tt, TimeTunnel, 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
-
trace, 方法内部调用路径,并输出方法路径上的每个节点上耗时,可以通过该命令定位方法调用耗时统计
-
watch,方法执行的信息获取,可以获取到方法执行的入参,出参,是否异常信息。
-
reset, 由于tt, trace, watch等命令会对字节码进行增强,使用reset可以将增强对信息会滚
-
options, options主要用于配置系统参数,例如unsafe, dump之类的配置信息,具体作用后续文档介绍
-
stack,之前版本tt命令中包含了stack的作用,可以查看调用到当前方法的调用栈信息。
其实arthas还包含很多其它命令,可以查看https://arthas.aliyun.com/doc/commands.html更加详细的介绍。
后续规划
本章节文档就简单介绍了arthas的一些基本信息,个人常用命令。 后续会针对命令从源码层面进行解释说明。让大家尽可能深入的的了解arthas这款工具,以便清晰其功能集。