[工具使用]使用arthas 定位线上问题

大纲

  • 是什么
  • 工具定位是啥
  • 核心命令以及应对的场景
  • 实战场景

注意事项

  • 避免一次性trace/watch大量的类
  • trace/watch/tt等指令 增加 -n 参数,控制输出的范围

实战场景

1、logger命令

现象:预发布环境某个框架层的日志没有输出, 这个不就是logger的使用场景么

原因: 预发布环境logback里面的应用名配错了

2、thread

(1)对dubbo线程池进行分组进行线程隔离,分组之后,验证是否按照对应的比例进行分配.(也可以使用jstack)

thread -all | grep 'DubboServerHandler'

(2)cpu负载较高的情况下,查看最忙的几个线程

thread -n 3

结合dashboard查看cpu占用

(3) 查看阻塞的线程

thread -b

3、dashboard

从全局查看整体的cpu还有内存情况

4、ognl

(1)使用dubbo框架情况下,查看spring管理的变量值

sc -d com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
ognl -c ${sc命令得出的值} '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("bean名称")'

5、watch命令

使用场景:除了日常的debug查看参数之外,还可以用来验证,某个方法是否有调用到。eg: 查看线程jstack的堆栈,线程的状态一直是blocked,可以用命令看下是否真的一点调用都没有.

watch com.xxx.StrategyExecutor solve '{params[0]}' "params[0].level>1" -n 5 -x 3

6、monitor

使用场景: 在一定周期内统计接口耗时。eg: 在没有线上日志的情况下,排查某个接口为啥会出现周期性波动

monitor com.fxxx.StrategyExecutor solve "params[0].level==1"

7、docker里面使用arthas

如何在Docker中使用Arthas - 技术人的一亩田
这是一个技术人分享和吐槽的一亩地~

OGNL表达式

在watch, trace, monitor, stack等等支持条件表达式的命令都可以用,可以用来进行内容输出的控制(watch)以及 筛选(命中条件的请求,才输出)

1、支持的变量

Arthas
Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas

2、一些语法: https://www.rongcloud.cn/blog/?p=5884

3、例子

(1)查看方法第一个参数的变量level的值大于1的调用

watch com.xxx.StrategyExecutor solve '{params[0]}' "params[0].level>1" -n 5 -x 3

(2)查看第一个参数的变量level的值大于1 并且 变量id的值为 xyz 的调用

watch c com.xxx.StrategyExecutor solve '{params[0]}' "params[0].level>1 and params[0].id!='xyz'" -n 15 -x 3

​参考

Arthas
Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas
arthas idea plugin 配置 · 语雀
配置为什么有配置项?第一个原因是spring stat…
Arthas | 定位线上 Dubbo 线程池满异常
前言本文是 Arthas 系列文章的第二篇。 Dubbo 线程池满异常应该是大多数 Dubbo 用户都遇到过的一个问题,本文以 Arthas 3.1.7 版本为例,介绍如何针对该异常进行诊断,主要使用到 dashboard/thread 两个指令。