100

在线分析诊断工具Arthas简介及使用

 5 years ago
source link: http://tech.dianwoda.com/2018/09/28/zai-xian-fen-xi-zhen-duan-gong-ju-arthasjian-jie-ji-shi-yong/?amp%3Butm_medium=referral
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.

开发的同学偶尔会用到一些命令对线上的应用进行一些诊断,以便分析排查遇到的问题。因为我们的系统都是部署在Linux系统上的,所以经常会用到一些Linux的命令或者一些小工具进行分析诊断,有时候分析一个问题要使用很多命令或者辅助工具,相对不是很方便。大家在分析线上一些问题的时候,也可能用过Btrace,Greys,Jvisualvm这些工具,在遇到一些难定位或JVM异常等疑难问题时,也可能会用上IBM HeapAnalyzer,JProfiler等工具。前不久阿里开源了一个在线诊断分析工具,Arthas,阿尔萨斯,一个非常小巧灵活的在线分析诊断工具,为我们分析定位java应用问题提供一个非常好的选择。八卦一下,为什么起名字叫阿尔萨斯,个人推测开发这工具的哥们或者团队里面有很多war3的粉丝?war3的粉丝都知道,洛丹伦的堕落王子阿尔萨斯手里的大杀器霜之忧伤,一把强大的邪恶利剑,相当之厉害,Arthas就是这样一把分析、诊断、定位java应用问题的利剑。

上面废话一堆,下面就一起来看看这个工具能干些啥吧。这里先说明下,因为官方文档写得已经很详细了,很多工具的命令或者用法,我这里简单做下分类和提炼,方便大家快速了解这个工具。 Arthas能做什么?Arthas官方文档里面是这样说的:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?

除了官方文档里面提到的这几点,它还能对方法的入参、出参进行监控,记录方法内部调用路径,并输出方法路径上的每个节点上耗时,方法watch条件很难触发时可以后台异步执行监控,还有死锁、jar包冲突、占用CUP过大的线程分析等问题。

Arthas安装

curl -L https://alibaba.github.io/arthas/install.sh | sh

也可以直接下载Jar包进行安装

Arthas启动

./as.sh NFbaAnB.jpg!web 以rober为例,这里选择3回车 zUrQJzZ.jpg!web

Arthas命令一览

基础命令

help——查看命令帮助信息

cls——清空当前屏幕区域

session——查看当前会话的信息

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

version——输出当前目标 Java 进程所加载的 Arthas 版本号

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

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

keymap——Arthas快捷键列表及自定义快捷键

jvm相关


dashboard——当前系统的实时数据面板
thread——查看当前 JVM 的线程堆栈信息(非常有用的一个命令)
jvm——查看当前 JVM 的信息
sysprop——查看和修改JVM的系统属性
getstatic——查看类的静态属性

class/classloader相关


sc——查看JVM已加载的类信息(可以查看类是哪个jar包中加载的)
sm——查看已加载类的方法信息
dump——dump 已加载类的 byte code 到特定目录
redefine——加载外部的.class文件,redefine到JVM里
jad——反编译指定已加载类的源码
classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件, 诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。

monitor——方法执行监控

watch——方法执行数据观测

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

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

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

options

options——查看或设置Arthas全局开关

Arthas简单案例

dashboard

yABriy3.jpg!web

thread 命令

YnmYZzU.jpg!web

查询当前进程中最忙的3个线程,是不是很方便 thread -n 52

nEVRj2B.jpg!web

JVM命令

FnuMbqj.jpg!web

一目了然

26B3AjF.jpg!web

getstatic 获取类的静态属性,支持ongl表达式

UZnMN3i.jpg!web

watch

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

monitor

方法执行监控 对匹配 class-pattern/method-pattern的类、方法的调用进行监控。 可以非常方便的用于统计某个方法的执行时间、平均RT eMrYJf6.jpg!web

trace

方法内部调用路径,并输出方法路径上的每个节点上耗时 可以看到简单的调用链,各个方法执行的时间,短小精悍,排除方法耗时好帮手,不过需要注意的是这里的耗时有点点不精确,trace执行本身也有点性能开销,这里没有减掉这个时间 7VvyUv3.jpg!webNJ3mAbB.jpg!web

支持ongl,可以对方法参数长度、值进行过滤

总结下

一般来说,对于线上出现的耗时、因为参数条件本地无法满足调试、没有打点记录耗时但是又需要及时知道耗时等的问题,可以使用track,watch,monitor相对快速的进行诊断。对于JVM相关的分析和诊断,可以使用dashboard,thread,jvm命令。对于平日没留意jar包依赖冲突的应用造成的线上各种问题,可以使用sc,sm去分析,一般系统用Dependency Analyzer分析下,就能避免这类jar包冲突问题。这个工具使用还是挺简单的,有些分析命令,需要对ONGL有一定的了解才能更好的使用它,用好它。详细参数等可以直接看官方文档,我这里只是结合robert这个项目举了写列子。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK