在线诊断工具Arthas使用简介

Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

下载安装

## 下载
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
## 启动
java -jar arthas-boot.jar

启动过程中需要手动选择一个jvm进程

使用 as.sh

curl -L https://alibaba.github.io/arthas/install.sh | sh

下载后直接./as.sh启动

常用命令

1、dashborad

当前系统的实时数据面板

$ dashboard
ID         NAME                              GROUP                  PRIORITY   STATE       %CPU       TIME       INTERRUPTED DAEMON
889        RMI TCP Connection(15)-30.10.166. RMI Runtime            9          RUNNABLE    48         0:5        false       true
1077       Timer-for-arthas-dashboard-0      system                 9          RUNNABLE    24         0:0        false       true
1074       as-selector-daemon                system                 9          RUNNABLE    12         0:0        false       true
284        JMX server connection timeout 284 RMI Runtime            9          TIMED_WAITI 8          0:3        false       true
16         Timer-1                           main                   5          TIMED_WAITI 5          0:9        false       true
47         Pandora pandora-qos-reporter Pool main                   5          TIMED_WAITI 0          0:0        false       true

数据说明:

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

2、thread

查看当前 JVM 的线程堆栈信息

1) thread -b

找出当前阻塞其他线程的线程

2)thread -n 3

找出当前最忙的前3个线程并打印堆栈

3)thread -n 3 -i 1000

指定采样时间间隔1秒

4)thread id

显示指定线程的运行堆栈

3、jvm

查看当前JVM信息

4、watch

方法执行数据观测

让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。

特别说明:

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
  • 4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
  • 这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

观察方法参数和返回值:

$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
    @Object[][
        @Integer[535629513],
    ],
    @ArrayList[
        @Integer[3],
        @Integer[19],
        @Integer[191],
        @Integer[49199],
    ],
]

watch命令参数比较多,详细参考官网

执行结果日志

1)方式一:

默认情况下,日志是不存储的,可以通过以下指令开启

options save-result true

结果会异步保存在:{user.home}/logs/arthas-cache/result.log,请定期进行清理,以免占据磁盘空间

  • 注意:这种改动只对本次链接有效

2)方式二:

使用异步后台任务将结果存日志文件(在执行命令后面增加>> &)

$ thread -n 3 >> &
job id  : 6
cache location  : /root/logs/arthas-cache/8688/6

此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/ P I D / {PID}/ PID/{JobId})中;

  • 此时任务的执行不受session断开的影响;任务默认超时时间是1天,可以通过全局 options 命令修改默认超时时间;
  • 此命令的结果将异步输出到文件中;此时不管 save-result 是否为true,都不会再往~/logs/arthas-cache/result.log 中异步写结果

Arthas 基础命令

  • help——查看命令帮助信息
  • cls——清空当前屏幕区域
  • session——查看当前会话的信息
  • reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version——输出当前目标 Java 进程所加载的 Arthas 版本号
  • history——打印命令历史
  • quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
  • stop——和shutdown命令一致(推荐使用,避免误操作)
  • shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
  • keymap——Arthas快捷键列表及自定义快捷键

参考

https://alibaba.github.io/arthas/

你可能感兴趣的:(运维,arthas,运维,线上)