3分钟学会用Arthas排查java服务各种问题

简介

arthas 是阿里开源的一个java问题排查工具,可以在不重启,无代码侵入的情况下做很多事情,有了arthas,很多平时排查起来很麻烦的问题都可以迅速定位,下面给大家介绍几个常用的操作以及场景
(官网地址:https://arthas.aliyun.com/doc/index.html

前置操作:attach 进程

使用arthas需要首先attach进程

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

下载arthas的jar包后直接启动,(需要注意操作的账号需要和启动attach目标的用户是一样的,要不然会有权限问题)
启动arthas后直接选择进程号,然后回车即可


image.png

如上图所示,直接按3然后回车,就能attach进程号为11843的进程


image.png

出现上图情况,就说明成功了

dashboard查看java进程总体情况

dashboard是最基础的命令,可以直接查看当前attach的进程的一些基础情况,下图是截图的上半部分,上半部分主要可以看进程里面的一些线程状态


image.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线程

下半部分如下,可以看到jvm堆内存和非堆内存的使用情况,堆内存可以看到eden,survivor,old区的内存情况,可以做个简单分析,这是一个活动项目,所以临时请求比较多,大部分对象都处于年轻代新生区,可以看出这个项目新生代使用了ParNew,老年代使用了CMS,gc.parnew.count字段记录了minor gc的次数,通过dashboard的几次刷新,可以看到年轻代gc次数较多。结合启动参数-Xms1024m -Xmx3500m -Xmn512m ,可以看出年轻代设置的有点小,老年代只用了200m,有点空虚。可以适当调大年轻代的大小。tomcat的信息并没有显示,因为只有用Ali-tomcat才会显示


image.png

thread命令

dashboard可以查看大概的进程面板,如果需要进一步排查线程方面的问题,则可以使用thread命令

  • 输入thread会显示所有线程的状态信息

  • 输入thread -n 3会显示当前最忙的3个线程,可以用来排查线程CPU消耗

  • 输入thread -b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题

  • thread id, 显示指定线程的运行堆栈
    -thread --state ,查看指定状态的线程,如thread --state WAITING

jvm命令

输入jvm回车可以看到jvm面板,比dashboard稍微详细一些,没什么好说的


image.png

函数耗时监控trace

排查一个接口耗时,可以使用trace去排查,这个命令是性能优化神技。执行trace 类路径+类名 方法名,如 trace com.ss.ss.testController login ,然后会显示下图


image.png

稍微耐心等待后,就会有该类的该方法的内部具体耗时。如图


image.png

可以看到该次请求耗时363.747871ms,并且下面调动的好几个方法耗时较长,看了下是数据库操作,总体看这个接口其实是没有问题的。如果线上或者压测的时候发现性能有问题,可以通过这个命令去逐个方法排查。

监控某方法monitor

上个命令trace可以监控具体的方法调用路径耗时,但是监控的是一次一次的请求,如果怀疑线上某个方法有可能有问题耗时慢,可以使用monitor命令。
使用monitor -c 60 com.ss.ss.testController login 可以统计60秒为周期的方法监控面板


image.png
监控项 说明
timestamp 时间戳
class Java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均RT
fail-rate 失败率

watch命令观察指定方法

使用watch命令可以观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
  • 4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
  • 这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

示例:watch com.ss.ss.testController login "{params,returnObj}" -x 3 表示查看testController 类的login方法的入参和返回,-x 3表示入参和返回值的深度
返回:


image.png

可以看到深度为3的时候hashMap会显示里面的内容

如果把深度改为4 ,则会有如下内容
image.png

可以看出,比3的深度要更加详细。

在生产问题排查中,经常也会有程序抛了异常中断没有日志的情况,也可以通过watch命令来查看异常堆栈。
例: watch com.ss.ss.testController login "{params[0],throwExp}" -e -x 2
如果有异常抛出,就能看见堆栈。
"{params[0],throwExp}"为OGNL表达式。
总体来说watch命令还是非常强大的,本文仅抛砖引玉介绍一种排查的手段,具体参数命令可以查看arthas官网。

黑科技redefine/retransform

使用redefine/retransform命令可以重新加载外部的class, edefine/retransform class文件在机器的路径 ,就可以把类热加载。限制如下

  • 不允许新增加field/method
  • 正在跑的函数,没有退出不能生效,比如下面新增加的System.out.println,只有run()函数里的会生效

使用示例:redefine /usr/home/xxxx/HelloWorld.class或者retransform /usr/home/xxxx/HelloWorld.class
成功了会显示


image.png

当线上有点小问题的时候,或者是漏了重要的东西又不方便发版本的时候,可以使用这个命令来做一个小的补丁。不过需要注意的是如果进程重启,redefine/retransform的类会恢复成以前的。

总之,慎用这个功能,不要依赖。附带一个官网介绍的小技巧


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容