监控诊断利器-arthas 使用

72 阅读3分钟

前言

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

1、安装

curl -O https://arthas.aliyun.com/arthas-boot.jar

2、启动

java -jar arthas-boot.jar

执行选择java进程

我选择了第2个进程,输入2,然后按enter 键进入

3、常见命令

dashboard

输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

可以结合thread使用,检查占用cpu高的线程。

thread

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

sm

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。

sm java.lang.String

SC

“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]、[E]、[f] 和 [x:]。

如:打印类的详细信息

sc -d demo.MathGame
class-info        demo.MathGame
code-source       /private/tmp/math-game.jar
name              demo.MathGame
isInterface       false
isAnnotation      false
isEnum            false
isAnonymousClass  false
isArray           false
isLocalClass      false
isMemberClass     false
isPrimitive       false
isSynthetic       false
simple-name       MathGame
modifier          public
annotation
interfaces
super-class       +-java.lang.Object
class-loader      +-sun.misc.Launcher$AppClassLoader@3d4eac69
                    +-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash   3d4eac69

Affect(row-cnt:1) cost in 875 ms.

monitor

方法监控,可以查看方法执行次数以及平均耗时

以下为监控HelloController 的hello方法, 每30s输出一次结果


monitor com.tlk.controller.HelloController hello -c 30

jad

jad反编译指定已加载类的源码,可以查看代码是否最新的。

heapdump

dump java heap, 类似 jmap 命令的 heap dump 功能。

生成文件在arthas-output目录,可以通过浏览器下载: http://localhost:8563/arthas-output/

history

历史指令会通过一个名叫 history 的文件持久化,所以 history 指令可以查看当前 arthas 服务器的所有历史命令,而不仅只是当前次会话使用过的命令。 当用的次数多了,常用命令还是挺有用的。

logger

查看 logger 信息,更新 logger level

查询日志级别

指定 classloader 更新 logger level

默认情况下,logger 命令会在 SystemClassloader 下执行,如果应用是传统的 war 应用,或者 spring boot fat jar 启动的应用,那么需要指定 classloader

可以先用 sc -d yourClassName 来查看具体的 classloader hashcode,然后在更新 level 时指定 classloader:

更新logger level

logger -c 21b8d17c --name ROOT --level debug

memory

查看进程内容使用情况

trace

方法内部调用路径,并输出方法路径上的每个节点上耗时

这个demo比较有意思,日志级别配置的info,但是实际还是会执行debug的,所以debug不要随便打,如果需要的话,加上isDebugEnabled的判断

//条件判断
if(logger.isDebugEnabled){
    logger.debug("server info , id : " + id + ", user : " + user);
}

stack

输出当前方法被调用的调用路径

vmoption

查看,更新 VM 诊断相关的参数

查询vm参数

更改vm参数

案例

案例1: cpu 100%

thread 查看线程CPU占比,查看其中cpu使用占比过高的数据

thread pid查看线程堆栈

案例2: 某个接口耗时比较高

使用trace去查看具体的耗时,trace demo.MathGame *

案例3:查询内存过高

输入deashboard 或者 memory 命令查看内容情况

heapdump 出内存快照

导出后就使用jvisualvm或mat进行分析。