目录
7、tt 命令(TimeTunnel重点) 方法调用时空隧道
7.1 tt -t demo.MathGame primeFactors
7.2 tt -t -n 3 demo.MathGame primeFactors
7.3 tt -i 1000 可以用来找出之前方法请求的信息。
8.1 trace demo.MathGame run -n 1
8.2 trace demo.MathGame run '#cost>1' -n 1
1. Arthas是什么
Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。
Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux、Mac、Windows 操作系统,命令还支持使用 tab 键对各种信息的自动补全,诊断起来非常方便。
这是它的官方网站:
Github地址:
2. Arthas能解决什么问题
看下Arthas的官方说明
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
1、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5、是否有一个全局视角来查看系统的运行状况?
6、有什么办法可以监控到JVM的实时运行状态?
看完是不是觉得太牛逼了?特别是它可以在线反编译类,可以不用加日志在线调试跟踪问题代码。
3. 快速安装
官方推荐使用 arthas-boot
进行安装,非常方便,以下是基于 Linux 系统环境进行演示,一般解决线上问题也是基于 Linux 环境。
第一步:下载
在任何目录下载 arthas-boot
这个包。
wget https://alibaba.github.io/arthas/arthas-boot.jar
[root@izbp14hdjlwscja93xb3ovz home]# wget https://alibaba.github.io/arthas/arthas-boot.jar
-bash: wget https://alibaba.github.io/arthas/arthas-boot.jar: No such file or directory
[root@izbp14hdjlwscja93xb3ovz home]# https://alibaba.github.io/arthas/arthas-boot.jar
-bash: https://alibaba.github.io/arthas/arthas-boot.jar: No such file or directory
[root@izbp14hdjlwscja93xb3ovz home]# wget https://alibaba.github.io/arthas/arthas-boot.jar
--2020-04-05 12:44:58-- https://alibaba.github.io/arthas/arthas-boot.jar
Resolving alibaba.github.io (alibaba.github.io)... 185.199.111.153, 185.199.110.153, 185.199.109.153, ...
Connecting to alibaba.github.io (alibaba.github.io)|185.199.111.153|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 112269 (110K) [application/java-archive]
Saving to: ‘arthas-boot.jar’
100%[=============================================================================================>] 112,269 36.0KB/s in 3.0s
2020-04-05 12:45:03 (36.0 KB/s) - ‘arthas-boot.jar’ saved [112269/112269]
第二步:运行
使用 java -jar
命令执行 arthas-boot
包。(如果运行失败,建议进行全量安装arthas,参考文档中的全量安装章节)
java -jar arthas-boot.jar
[root@izbp14hdjlwscja93xb3ovz arthas]# java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 1308 arthas-demo.jar
说明:这个java程序是 arthas 提供的测试程序。
第三步:选择进程
运行 arthas-boot
后,控制台会显示所有 Java 进程,选择一个你需要诊断的进程。
如第二步所示,这里有只有一个 Java 进程,输入序号1,回车,Arthas会附到目标进程上,并输出日志:
至此,安装、启动完成。
更多其他安装方式见:https://alibaba.github.io/arthas/install-detail.html
4. 实战使用
启动完成后,当前光标会进入 arthas 的控制台,接受各种操作命令。
下面,栈长会做几个常用命令的演示,让大家对它有一个基本的认识和快速上手的能力。
基础命令
help——查看命令帮助信息
cat——打印文件内容,和linux里的cat命令类似
pwd——返回当前的工作目录,和linux命令类似
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键
1、dashboard
显示当前系统的实时数据面板,按 ctrl+c 即可退出。
常用的参数:
dashboard -i 400ms 每次执行间隔时间
dashboard -n 2 执行多少次dashboard,不指定的话会一直刷新
2、查看线程监控 thread
常用参数:
-b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题
-i 5000 单位:ms 查看在接下来的多长时间内 统计cpu利用率
-n 5 查看cpu占用率前5的线程的堆栈信息
<thread_id> 直接跟着线程id,可以看到thread的堆栈信息
thread -i 5000ms 查看在接下来的多长时间内 统计cpu利用率
thread -n 2 查看cpu占用率前2的线程的堆栈信息
thread 1 查看线程1的堆栈信息
3、输出 jvm 相关信息
包括加载类的路径,启动类路径,加载类个数等等,好多,就不截图了
4、sc 命令 查看JVM已加载的类信息
命令介绍:该命令是 Search-Class 英文的缩写,用于查看JVM已加载的类信息。
常用参数详情
-d 参数用于输出详细的类相关信息(类全限定名,存放路径,接口,注解,继承父类,类加载器等),支持模糊查询-f 参数需要配合 -d 命令一起使用, 在上述类信息中加入字段信息,包括权限、类型、名字。
-e 开启正则表达式匹配,默认为通配符匹配
-c 类名表达式匹配
例如: sc -d -f demo.MathGame
5 、sm 用于查看已加载类的方法信息
命令介绍:该命令是 Search-Method 英文的缩写,用于查看已加载类的方法信息.
常用参数 : -d 方法详情
-E 开启正则表达式匹配,默认为通配符匹配
示例:sm -d demo.MathGame print
6、jad 反编译出已加载类的源代码
命令介绍:该命令可以反编译出已加载类的源代码,如果没有线下环境,我们可以在线上查看到底哪行代码出问题。
示例:jad demo.MathGame
7、tt 命令(TimeTunnel重点) 方法调用时空隧道
使用 tt 命令记录方法执行的详细情况。
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
常用参数:
-t 开启方法监听,记录下中方法的调用情况-i i 是指 index 索引的意思,可以用来找出之前请求的信息。
-l 找出列表所有请求
示例:
7.1 tt -t demo.MathGame primeFactors
开启方法监听,记录下 MathGame 中方法 primeFactors 的调用情况
接下来我们按 Q 或者 Ctrl+C 退出监听。
7.2 tt -t -n 3 demo.MathGame primeFactors
当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C
中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。
此时你可以通过 -n
参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。
-
表格字段说明
表格字段 | 字段解释 |
---|---|
INDEX | 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。 |
TIMESTAMP | 方法执行的本机时间,记录了这个时间片段所发生的本机时间 |
COST(ms) | 方法执行的耗时 |
IS-RET | 方法是否以正常返回的形式结束 |
IS-EXP | 方法是否以抛异常的形式结束 |
OBJECT | 执行对象的hashCode() ,注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 |
CLASS | 执行的类名 |
METHOD | 执行的方法名 |
-
条件表达式
不知道大家是否有在使用过程中遇到以下困惑
-
Arthas 似乎很难区分出重载的方法
-
我只需要观察特定参数,但是 tt 却全部都给我记录了下来
条件表达式也是用
OGNL
来编写,核心的判断对象依然是Advice
对象。除了tt
命令之外,watch
、trace
、stack
命令也都支持条件表达式。 -
-
解决方法重载
tt -t *Test print params.length==1
通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写
tt -t *Test print 'params[1] instanceof Integer'
-
解决指定参数
tt -t *Test print params[0].mobile=="13989838402"
-
构成条件表达式的
Advice
对象前边看到了很多条件表达式中,都使用了
params[0]
,有关这个变量的介绍,请参考表达式核心变量
7.3 tt -i 1000 可以用来找出之前方法请求的信息。
如下图:查看1000 中索引方法调用详情
7.4 tt -i 1000 -p 重做一次调用
tt
命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX
编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p
参数。通过 --replay-times
指定 调用次数,通过 --replay-interval
指定多次调用间隔(单位ms, 默认1000ms)
8、trace(线上调优重点)
方法内部调用路径,并输出方法路径上的每个节点上耗时。可以用作性能调优。
常用参数:
-n 有时候请求量太大,我们不需要每个请求调用时间,那么可以使用这个参数,指定次数调用后结束。
8.1 trace demo.MathGame run -n 1
8.2 trace demo.MathGame run '#cost>1' -n 1
查看 '#cost>1'方法大约1ms的调用
9 、stack 输出当前方法被调用的调用路径
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
主要使用-n 命令,用于控制执行次数
stack demo.MathGame primeFactors -n 3
10 、monitor 对某个方法的调用进行定时监控
monitor -c 5 demo.MathGame primeFactors
monitor
命令是一个非实时返回命令.
实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C
为止。
服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变。
监控的维度说明
监控项 | 说明 |
---|---|
timestamp | 时间戳 |
class | Java类 |
method | 方法(构造方法、普通方法) |
total | 调用次数 |
success | 成功次数 |
fail | 失败次数 |
rt | 平均RT |
fail-rate | 失败率 |
11 、watch 命令 方法执行数据观测
让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值
、抛出异常
、入参
,通过编写 OGNL 表达式进行对应变量的查看。
常用参数:
-b 在调用方法前观察这个方法,可以看到传入的参数值。-e 观察抛出异常时传入参数
-f 方法调用完成,返回对象是观察具体数据。
1、watch -b -n 3 demo.MathGame primeFactors params
其他使用官方文档 : https://alibaba.github.io/arthas/watch.html
12、quit/exit
退出当前 Arthas。
这个命令仅退出当前连接的客户端,附到目标进程上的 Arthas 会继续运行,端口不会关闭,下次连接时可以直接连接使用。
13、shutdown
关闭 Arthas 服务端,退出所有 Arthas 客户端。
以上演示了 10 个命令的基本使用,各种命令的使用详情可以在命令带 --help
进行查阅。
更多其他命令请参考:
https://alibaba.github.io/arthas/commands.html
参考文档:https://blog.csdn.net/u013735734/article/details/102930307