登录 |  注册
首页 >  网站架构 >  阿里技术 >  Arthas使用指南( 在线诊断神器)

Arthas使用指南( 在线诊断神器)

Arthas 能为你做什么?

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

遇到问题无法在预发 debug 一下,难道只能通过加日志再重新预发布吗?

线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现,怎么办?

是否有一个全局视角来查看系统的运行状况?

有什么办法可以监控到容器和中间件的实时运行状态?

Arthas 是基于 Greys 进行二次开发的全新在线诊断工具,利用Java6的Instrumentation特性,动态增强你所指定的类,获取你想要到的信息,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,让你在定位、分析诊断问题时看每一个操作都看起来是那么的 666。

Arthas安装及使用

下载压缩包,上传到需要被诊断的机器, 解压缩

安装: 执行 ./install.sh
启动: 执行 ./as.sh pid

常用命令

dashboard:当前系统的实时数据面板

thread查看当前 JVM 的线程堆栈信息

jvm:查看当前 JVM 的信息

sc查看JVM已加载的类信息

sm查看已加载类的方法信息

jad反编译指定已加载类的源码

classloader查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor方法执行监控

watch方法执行数据观测

trace方法内部调用路径,并输出方法路径上的每个节点上耗时

stack输出当前方法被调用的调用路径

tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

reset重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

quit退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

shutdown关闭 Arthas 服务端,所有 Arthas 客户端全部退出

dashboard参数解释

ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应

NAME: 线程名

GROUP: 线程组名

PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高

STATE: 线程的状态

CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。

TIME: 线程运行总时间

INTERRUPTE: 线程当前的中断位状态

DAEMON: 是否是daemon线程

640 (1).jpg

thread

参数说明

id

线程id

-n

指定最忙的前N个线程并打印堆栈

b

找出当前阻塞其他线程的线程

-i

指定cpu占比统计的采样间隔,单位为毫秒

PS: 这里的cpu统计的是,一段采样间隔内,当前JVM里各个线程所占用的cpu时间占总cpu时间的百分比。其计算方法为: 首先进行一次采样,获得所有线程的cpu的使用时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime这个接口),然后睡眠一段时间,默认100ms,可以通过-i参数指定,然后再采样一次,最后得出这段时间内各个线程消耗的cpu时间情况,最后算出百分比。注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。

640 (1).jpg

sc用法

参数说明

class-pattern

类名表达式匹配

-d

输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次

-E

开启正则表达式匹配,默认为通配符匹配

-f

输出当前类的成员变量信息(需要配合参数-d一起使用)

-x

指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出

PS: class-pattern支持全限定名,如com.test.AAA,也支持com/test/AAA这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把/替换为.啦,

sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关

640 (1).jpg

sm用法

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

-d 

展示每个方法的详细信息

-E 

开启正则表达式匹配,默认为通配符匹配

PS:查看已加载类的方法信息, “Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到

monitor用法

monitor 命令是一个非实时返回命令,实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而被不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何 Arthas 的命令也不会引起任何原有业务逻辑的改变

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

-c 

统计周期,默认值为120秒

监控项

  • timestamp 时间戳

  • class java类

  • method 方法(构造方法、普通方法)

  • total 调用次数

  • success 成功次数

  • fail 失败次数

  • rt 平均rt

  • fail-rate 失败率

PS:方法执行监控, 对匹配 class-pattern/method-pattern的类、方法的调用进行监控。

trace用法

方法内部调用路径,并输出方法路径上的每个节点上耗时, trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路

trace 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准,渲染路径上调用的类、方法越多,性能偏差越大。但还是能让你看清一些事情的。

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

condition-express

条件表达式

-n

命令执行次数

#cost

方法执行耗时

PS: 很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,例如trace *StringUtils isBlank '$cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果

stack用法

输出当前方法被调用的调用路径, 很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

condition-express

条件表达式

-n

执行次数限制

watch用法

方法执行数据观测, 让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 groovy 表达式进行对应变量的查看。

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

express

观察表达式

condition-express

条件表达式

-b 

在方法调用之前观察(默认关闭)

-e 

在方法异常之后观察(默认关闭)

-s 

在方法返回之后观察(默认关闭)

-f 

在方法结束之后(正常返回和异常返回)观察 (默认开启)

-x 

指定输出结果的属性遍历深度,默认为0

PS:这里重点要说明的是观察表达式,观察表达式的构成主要由 groovy 表达式组成,只要是一个合法的 groovy 表达式,都能被正常支持。

观察的维度也比较多,主要体现在参数 advice 的数据结构上。Advice 参数最主要是封装了通知节点的所有信息。

原文链接: https://www.yukx.com/alitec/article/details/1890.html 优科学习网Arthas使用指南( 在线诊断神器)

<<上一课程
下一课程>>
推荐文章
  • 如何看到老年代、新生代的对象有哪些呢?MAT是分析dump的神器(顺便吐槽:当然也是吃内存卡机器的怪兽)。通常我们会在出现fullGC时dump下堆内存,然后分析FullGC的原因。那如何获知整个堆内存里,有哪些对象在新生代、哪些在老年代呢?一个典型的应用场景是:出现了耗时超预期的YoungGC,我
  • 面向服务的架构(SOA)是一种软件开发方法,它使用称为服务的软件组件来创建业务应用程序。每项服务提供一种业务能力,并且服务也可以跨平台和语言相互通信。开发人员使用SOA来重用不同系统中的服务,或者组合几个独立的服务来执行复杂的任务。例如,一个组织中的多个业务流程需要用户身份验证功能。您可以创建一项身
  • 1.背景1.1什么是交互式推荐?交互式推荐是一种互动式实时推荐产品模块,主要通过理解用户需求、以互动的方式进行推荐。交互式推荐由Youtube在2018年提出,主要用于解决推荐系统的延迟和与用户互动偏弱的问题。从2021年下半年开始,美团外卖推荐技术团队在外卖首页Feed上持续进行探索,2022上半
  • 导读:老是出现堆内存不足,大量FullGC深知出现内存溢出应该怎么办,怎样通过排查找到源头分析来解决问题?正文:我们有个新服务上线运行一段时间后,老是出现堆内存不足,大量出现FullGC,有些实例甚至出现内存溢出错误:java.lang.OutOfMemoryError:Javaheapspace但
  • 其实强引用、软引用、弱引用、虚引用这四个概念非常简单好记。在开头先总结一下这四个引用的特点吧。强引用:gc时不会回收软引用:只有在内存不够用时,gc才会回收弱引用:只要gc就会回收虚引用:是否回收都找不到引用的对象,仅用于管理直接内存接下来详细看看这四种引用,结合代码,深刻的体会一下。强引用即我们平
  • 在Linux中,CPU主要用于中断、内核以及用户进程的任务处理,优先级为中断内核用户进程,在学习如何分析CPU消耗状况前。先要掌握三个重要的概念1、上下文切换每个CPU在同一时间只能执行一个线程,Linux采用的是抢占式调度,即为每个线程分配一定的执行时间,当到达执行时间、线程中有IO阻塞或高级优先
学习大纲