文章目录
arthas诊断神器-初探
一、安装
arthas提供多种安装方式,包括rpm包、shell脚本、独立可执行jar、maven等方式;控制台主要包括本地终端、Web Console、arthas tunnel server三种方式。
1.安装方式
- 独立可执行jar(线上)
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
- shell脚本(线上)
curl -L https://arthas.aliyun.com/install.sh | sh
- maven (本地调试)
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2.控制台
- 本地终端
通过
as.sh
或java -jar arthas-boot.jar
执行完毕后,自动进入本地终端。
- Web Console
webconsole默认绑定127.0.0.1:8563,服务器之外的浏览器无法访问,可使用
java -jar arthas-boot.jar --target-ip '192.168.1.200'
方式启动,这样就可以在浏览器中访问http://192.168.1.200:8563/
。不建议直接暴露到公网,建议使用arthas tunnel server
代理。
- arthas tunnel server
arthas tunnel server下载地址
arthas tunnel server提供统一管理agent的功能,界面和Web Console基本一致;默认web端口8080,连接端口7777,可通过-Dserver.port=8080启动时指定端口;管理密码后台随机生成,通过控制台日志查看;更多信息查看 arthas-tunnel-server配置
java -jar -Dserver.port=8080 arthas-tunnel-server-3.5.0-fatjar.jar
二、入门
1.启动(以jar方式启动)
java -jar arthas-boot.jar
2.停止
stop
提示:tab键
3.dashboard面板
dashboard
4.线程
# 死锁线程
thread -b
# 繁忙线程
thread -n 10
# 没隔1000毫秒打印占用cpu前3的线程
thread -i 1000 -n 3
# 指定线程堆栈
thread 12
线上CPU资源占用过高排查示例(jstack+top)
man top
# 进程下的所有线程情况
top -p 15124 -H
# 转换16进制线程号(例如15125对应3b15)
printf '%x\n' 15125
# 线程dump
jstack -l 15124 >stack.txt
# 对应位置为nid=0x3b15,内容如下,可以定位到具体的java方法位置
"DestroyJavaVM" #71 prio=5 os_prio=0 tid=0x00007fa328009800 nid=0x3b15 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
prio 优先级
os_prio 操作系统级别优先级
tid java线程ID
nid 操作系统级别线程ID
其它命令
yum --disablerepo=\* --enablerepo=c7-media provides pstree
yum --disablerepo=\* --enablerepo=c7-media provides pstack
yum --disablerepo=\* --enablerepo=c7-media install psmisc gbd
pstree -p 15124
pstack 15124
三、常用操作
建议结合arthas-idea插件使用
1.获取Spring容器
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod -n 3
访问controller,以下是示例输出
1003 2021-03-25 11:46:59 1.74 true false 0x61cdad31 RequestMappingHandlerAdapter invokeHandlerMethod
tt -i 1003 -w 'target.getApplicatonContext()'
2.获取Spring bean
# 获取Bean对象
tt -i 1003 -w 'target.getApplicatonContext().getBean("dateService")'
# 获取AOP代理后的对象
tt -i 1003 -w 'target.getApplicationContext().getBean("serviceBTRelationServiceImpl").getTargetSource().target'
3.调用Spring bean方法
tt -i 1003 -w 'target.getApplicatonContext().getBean("dateService").monthList(5)'
tt -i 1003 -w 'target.getApplicationContext().getBean("masterDataSource").getActiveCount()';
4.方法耗时分析-trace命令
trace com.ruoyi.framework.web.service.DateService monthList -v -n 5 --skipJDKMethod true '1==1'
调用该方法时,会自动统计耗时
5.查询指定class对应的classloader-sc命令
sc -d com.example.demo.SpringUtils
输出结果
[arthas@12672]$ sc -d com.example.demo.SpringUtils
class-info com.example.demo.SpringUtils
code-source /D:/IDEA/jsch/target/classes/
name com.example.demo.SpringUtils
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name SpringUtils
modifier final,public
annotation org.springframework.stereotype.Component
interfaces org.springframework.beans.factory.config.BeanFactoryPostProcessor,org.springframework.context.Appli
cationContextAware
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@18b4aac2
+-sun.misc.Launcher$ExtClassLoader@5ea434c8
classLoaderHash 18b4aac2
6.调用静态方法
ognl '@com.example.demo.SpringUtils@getBean("demoApplication")'
指定classloader
ognl -c 18b4aac2
,其中(18b4aac2为对应classloader的hash值,可通过classloader -l
查看)
7.修改线上系统日志级别
logger
logger --name com.example.demo.SpringUtils --level trace
官网地址:
arthas诊断神器