大纲
- 是什么
- 工具定位是啥
- 核心命令以及应对的场景
- 实战场景
注意事项
- 避免一次性
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
OGNL表达式
在watch, trace, monitor, stack等等支持条件表达式的命令都可以用,可以用来进行内容输出的控制(watch)以及 筛选(命中条件的请求,才输出)
1、支持的变量
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