3

线上诊断神器-arthas基本应用 - 阿辉ya

 1 year ago
source link: https://www.cnblogs.com/curryAhui/p/17336897.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Arthas基本应用

一、Arthas作用

什么是Arthas呢?

​ Arthas 是一款阿里推出的线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

那我们为什么要使用Arthas?

​ 当我们定位线上bug时,无法定位到具体位置时,我们就可以使用Arthas来查看方法的出入参、方法的调用链路、以及内部方法报错、反编译class文件等等方式来精确定位到问题的位置。

二、安装Arthas

windows下载

windows最新版本安装地址

安装目录

2153645-20230420145313880-729887836.png

Linux下载

curl -O https://arthas.aliyun.com/arthas-boot.jar

启动Arthas客户端

java -jar arthas-boot.jar

选择对应的监听服务

2153645-20230420145330148-2047277515.png

三、基本命令

3.1 dashboard命令

2153645-20230420145342532-385822835.png
  • ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。
  • NAME: 线程名
  • GROUP: 线程组名
  • PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
  • STATE: 线程的状态
  • CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
  • DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为
  • TIME: 线程运行总 CPU 时间,数据格式为分:秒
  • INTERRUPTED: 线程当前的中断位状态
  • DAEMON: 是否是 daemon 线程

3.2 watch命令

watch [类全路径名] [方法名] [参数列表....]

栗子:

watch com.sefonsoft.cloud.govern.operation.biz.protal.controller.SearchController searchResource {'params, returnObj'} -x 3

2153645-20230420145359339-658324452.png
参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 函数名表达式匹配
express 观察表达式,默认值:{params, target, returnObj}
condition-express 条件表达式
[b] 函数调用之前观察
[e] 函数异常之后观察
[s] 函数返回之后观察
[f] 函数结束之后(正常返回和异常返回)观察
[E] 开启正则表达式匹配,默认为通配符匹配
[x:] 指定输出结果的属性遍历深度,默认为 1,最大值是 4

3.3 tt命令

watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。

这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。

于是乎,TimeTunnel 命令就诞生了。

tt -t com.sefonsoft.cloud.govern.operation.biz.protal.controller.SearchController searchResource

2153645-20230420145412728-1828949248.png
tt -i 1000

2153645-20230420145421815-420558626.png
  • 表格字段说明
表格字段 字段解释
INDEX 时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。
TIMESTAMP 方法执行的本机时间,记录了这个时间片段所发生的本机时间
COST(ms) 方法执行的耗时
IS-RET 方法是否以正常返回的形式结束
IS-EXP 方法是否以抛异常的形式结束
OBJECT 执行对象的hashCode(),注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体
CLASS 执行的类名
METHOD 执行的方法名

3.4 trace命令

trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路,也就是对监控的方法和方法内部的调用链路进行耗时统计。

# 命令格式
trace [参数] [类全路径名] [方法名]
trace --skipJDKMethod false com.sefonsoft.cloud.govern.operation.biz.protal.controller.SearchController searchResource

2153645-20230420145437372-1853549779.png

参数说明

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式
[E] 开启正则表达式匹配,默认为通配符匹配
[n:] 命令执行次数
#cost 方法执行耗时
[m <arg>] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>]

3.5 jad命令

jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;

# 命令格式
jad [参数] [类全路径名] [方法名]
jad --source-only com.sefonsoft.cloud.govern.operation.biz.protal.controller.SearchController searchResource

参数说明

参数名称 参数说明
class-pattern 类名表达式匹配
[c:] 类所属 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[E] 开启正则表达式匹配,默认为通配符匹配

2153645-20230420145517536-983373846.png

参考博客:

arthas官网

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK