arthas诊断神器-初探

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.shjava -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提供统一管理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

actuator查看

二、入门

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诊断神器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山境KL攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值