登录 |  注册
首页 >  网站架构 >  阿里技术 >  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 参数最主要是封装了通知节点的所有信息。

上一篇: 阿里开源的27个项目,值得收藏!
下一篇: 为什么阿里巴巴不建议MySQL使用Text类型?
推荐文章
  • 架构师在进行系统设计时,遵循一套复杂且综合的方法论,主要包括以下核心步骤:需求分析:理解并明确业务需求是架构设计的第一步。架构师需要与各利益相关者深入沟通,收集和分析业务需求、性能需求、安全性需求、扩展性需求等。领域建模:基于需求分析,构建抽象的业务模型或数据模型,明确系统的边界、核心实体及其关系。
  • 根据阿里交易型业务的特点,以及在双十一这样业内罕有的需求推动下,我们在官方的MySQL基础上增加了非常多实用的功能、性能补丁。而在使用MySQL的过程中,数据一致性是绕不开的话题之一。本文主要从阿里巴巴“去IOE”的后时代讲起,向大家简单介绍下我们过去几年在MySQL数据一致性上的努力和实践,以及目
  • 随着深度学习在图像、语言、广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用。而在广告CTR预估方面,新模型也是层出不穷:WideandDeep、DeepCrossNetwork、DeepFM、xDeepFM,美团很多篇深度学习博客也做了详细的介绍。但是,当
  • 1.背景搜索优化问题,是个典型的AI应用问题,而AI应用问题首先是个系统问题。经历近10年的技术积累和沉淀,美团搜索系统架构从传统检索引擎升级转变为AI搜索引擎。当前,美团搜索整体架构主要由搜索数据平台、在线检索框架及云搜平台、在线AI服务及实验平台三大体系构成。在AI服务及实验平台中,模型训练平台
  • 行业算法版简介OpenSearch-行业算法版是基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜索业务开发平台,目前为包括淘宝、天猫在内的阿里集团核心业务提供搜索服务支持。通过内置各行业的查询语义理解、机器学习排序算法等能力,提供充分开放的引擎能力,助力开发者快速搭建智能搜索服务。Ope
  • 一.概述我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。当业务发生数据库切换时
学习大纲