当前位置:首页 > > 架构师社区
[导读]arthas中文直译过来叫阿尔萨斯,是阿里巴巴开源的java应用诊断工具,在线排查问题,无需重启服务,实时监控jvm状态。支持JDK6以上版本,支持Linux/Mac/Window操作系统。


arthas中文直译过来叫阿尔萨斯,是阿里巴巴开源的java应用诊断工具,在线排查问题,无需重启服务,实时监控jvm状态。支持JDK6以上版本,支持Linux/Mac/Window操作系统。



采用命令行交换方式,tab键命令自动补全,而且兼容linux系统部分命令,如:grep,ctrl+i清屏,ctrl+a跳到行首,ctrl+c终止命令等



如果你还在使用jdk原生jstat、jmap等命令排查问题,那么,强烈建议你使用arthas。本文介绍arthas的下载安装、启动、常用命令、退出、卸载以及常见问题的调试步骤



下载安装

arthas安装分为快速安装和全量安装,快速安装只下载arthas-boot.jar。全量安装是下载一个压缩包,压缩包中包含arthas-boot.jar、测试demo和封装好的启动脚本等文件,一般我们使用快速安装就可以了



快速安装

linux系统中安装可以用curl命令从阿里云官方网站下载

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


windows系统中安装用浏览器打开如下地址会提示下载

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


全量安装

linux全量安装需要先下载执行脚本

curl -L https://arthas.aliyun.com/install.sh | sh

下载完成后会在当前目录生成as.sh脚本,执行脚本 ./as.sh 后会自动下载全量安装包,默认保存在~/.arthas/lib目录下。修改as.sh脚本可以更改默认保存路径

用它调试线上bug,真得劲!



windows全量安装只需要用浏览器打开下载地址就会提示下载

https://arthas.aliyun.com/download/latest_version?mirror=aliyun 



全量安装包的文件夹名称为arthas,目录结构如下

用它调试线上bug,真得劲!



启动

启动之前需要明确要监听哪个java程序,并找到这个java程序的进程id。当前登录用户必须对要监听的进程有可操作权限,否则会报错



linux中使用ps或jps命令可以找到java程序的进程id

ps -ef | grep java 
jps -mlv



windows中打开任务管理器可以找到对应程序的进程id

用它调试线上bug,真得劲!



执行命令启动arthas

java -jar arthas-boot.jar



启动后会提示选择监听哪个进程id,输入对应的序号即可。我要监听的进程id是19646,也就是序号2

用它调试线上bug,真得劲!



输入2之后敲回车,启动成功如下图

用它调试线上bug,真得劲!



启动时可以直接指定pid,就不用在启动过程中再输入序号了

java -jar arthas-boot.jar 19646



如果安装时选择了全量安装,那么也可以通过脚本启动,linux系统使用as.sh脚本,windows系统使用as.bat脚本



查看dashboard

dashboard命令可以查看cpu、线程状态,内存信息、GC情况和jdk版本等信息

用它调试线上bug,真得劲!

图中字段解读

ID: Java中的线程ID,注意这个ID不能跟jstack中的nativeID一一对应  NAME: 线程名称  GROUP: 线程组名称  PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高  STATE: 线程的状态  CPU%: 线程消耗的cpu占比,采样间隔100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。 TIME: 线程运行总时间,格式为 分:秒  INTERRUPTED: 线程当前的中断状态  DAEMON: 是否是守护线程 


监控页面会实时刷新,默认每5000毫秒(5秒)刷新一次。可以通过 - i 参数指定刷新频率,-n 参数指定刷新次数。这个统计会有一定的开销,从截图中也可以看到arthas的cpu占比较大,所以刷新频率不要太高,建议5秒以上,刷新次数建议10次以内

// 每10秒刷新一次,3次后停止  dashboard -i 10000 -n 3 



查看线程

使用thread命令可以查看线程的状态,显示的结果实际就是dashboard结果的第一栏

用它调试线上bug,真得劲!



thread命令可以追加参数

id:可以查看指定线程id的堆栈信息 
-n value:找出最忙的value个线程,并打印堆栈信息 
-b:找出当前正在阻塞其他线程的线程 
-i value:指定采样cpu占比的时间间隔,默认为100ms。



打印线程id=24的堆栈信息

用它调试线上bug,真得劲!



打印当前最忙的3个线程的堆栈信息

用它调试线上bug,真得劲!



打印正在阻塞其他线程的线程

用它调试线上bug,真得劲!



指定统计线程cpu占比的时间间隔,单位:毫秒。因为统计cpu占比会有一定的资源消耗,所以时间间隔不要太小,建议100毫秒以上

thead -i 200 



反编译

使用jad可以对代码进行反编译,反编译过来的代码可能会有语法错误,但不影响阅读。比较贴心的是,反编译过来的代码语法高亮,方便阅读

用它调试线上bug,真得劲!



类名支持全路径,同时也支持模糊匹配,下面两个命令可以达到相同的效果

jad com.helianxiaowu.demo.ThreadBlock jad *ThreadBlock 


也可以对类中的某一个方法进行反编译,只需要在类名后面加上方法名即可

用它调试线上bug,真得劲!



反编译过来的代码默认携带ClassLoader信息,使用 --source-only 选项可以去除ClassLoader信息

用它调试线上bug,真得劲!



退出

使用quit或exit会退出arthas操作界面,但arthas进程还在,这时当你想监听别的java进程时会报错。因为arthas默认使用的是3658端口,所以这时会报错3658端口被别的进程占用。

用它调试线上bug,真得劲!



使用shutdown或stop可以结束arthas,结束后可以监听别的进程id



出现端口被占用报错时,可以再次启动进入刚才监听的进程或者使用telnet进入刚才监听的arthas进程界面,执行shutdown或stop结束监听

telnet localhost 3658 



卸载

linu系统中执行如下命令进行卸载

rm -rf ~/.arthas/ rm -rf ~/logs/arthas



window下需要进入C盘当前用户的目录,找到 .arthas目录和logs/arthas目录进行删除



CPU飙升的问题调试

java程序中,频繁GC、链接没有释放、线程数量过多导致频繁的进行切换、线程被阻塞、死循环等原因是造成cpu飙升的主要原因。



通过arthas的dashboard命令可以看到GC的回收次数和时间,现在大部分程序都是使用spring进行对象管理,不会出现创建大量实例对象的情况。数据库链接、IO、HTTP链接都使用的链接池,也很少出现链接没有释放的问题。所以,JVM频繁进行GC操作,很有可能是内存设置不合理,可以使用如下参数指定内存

JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m" 



线程数量过多导致频繁进行线程切换,基本可以断定当前服务支撑不了现有的并发了,需要增加服务器资源或者增加负载



现在来模拟一个cpu飙升的问题排查过程



首先启动测试程序,模拟cpu升高的情况

用它调试线上bug,真得劲!



然后启动arthas,选择测试程序对应的进程进行监控。输入dashboard命令,可以看到id=10的这个线程占用cpu过高

用它调试线上bug,真得劲!



打印id=10的线程堆栈信息,可以看到这个线程正在执行high()方法

用它调试线上bug,真得劲!



反编译high方法,查看源码,可以看到进行了死循环,所以cpu会飙升

用它调试线上bug,真得劲!



方法响应速度慢的问题调试

一个接口调用,好长时间才能收到响应,接口逻辑复杂,排查起来特别困难,不知从何下手?下面带你一步步找到问题



找到调用耗时较长的接口,这里测试使用的是MethodDemo类中的slow()方法。



启动测试程序,调用slow方法,可以看到该方法耗时足足10秒,确实很慢

用它调试线上bug,真得劲!



在arthas监控页面输入如下命令对这个方法进行耗时统计

trace *MethodDemo slow



在统计结果中,能看到每个方法的调用时长

用它调试线上bug,真得劲!



反编译slow方法,发现代码进行了sleep操作,所以耗时较长

用它调试线上bug,真得劲!



trace命令是统计方法的内部调用路径,并为每个调用路径统计耗时。trace命令需要指定类名和方法名,支持模糊匹配



线程阻塞的调试

线程阻塞会导致并发量上不去、cpu占用过高,降低系统整体性能,严重时会导致系统崩溃



启动测试程序,调用演示线程阻塞的方法

用它调试线上bug,真得劲!



进入arthas监控页面,找到目前正在阻塞其他线程的线程,可以看到loop方法中正在锁定一个字符串,阻塞了其他线程

用它调试线上bug,真得劲!



反编译loop方法,可以看到使用了synchronized进行了同步操作,阻塞了其他线程

用它调试线上bug,真得劲!



由于篇幅有限,本文只讲一些arthas常用操作,后期会再出一篇高级操作,包括webconsole远程监控服务器、ognl表达式、封装docker镜像等。


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭