阿里-Arthas 常用指南(快速排查服务)
摘要:本文主要介绍如何快速使用Arthas排查生产环境中的问题,还包括一些基础设施的建设,比如封装包含Arthas的Docker基础镜像,离线环境如何使用。
简介
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
常用命令
dashboard 数据面板
当前系统实时数据面板,作为每次进入系统查看的首项指标

trace 调用时长统计
方法内部调用路径,并输出方法路径上的每个节点上耗时;运行
trace com.github.huzhihui.statics.controller.TestController listByIds;命令拼装trace 类全路径 方法名。
常用参数如下
-m 10定 Class 最大匹配数量,默认值为 50-n 1参数指定捕捉结果的次数

监听一次长时间的
trace com.github.huzhihui.statics.controller.TestController getById -n 1

jad 反编译类
jad命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑。
获取我们的TestService类
运行
jad com.github.huzhihui.statics.service.TestService;命令拼接规则jad 类全路径名。

watch 函数执行数据观测
用来检测函数的返回值,当我们要看接口返回数据是否正确需要这样操作。
参数说明
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
| 参数名称 | 参数说明 |
|---|---|
| class-pattern | 类名表达式匹配 |
| method-pattern | 函数名表达式匹配 |
| express | 观察表达式,默认值:{params, target, returnObj} |
| condition-express | 条件表达式 |
| [b] | 在函数调用之前观察 |
| [e] | 在函数异常之后观察 |
| [s] | 在函数返回之后观察 |
| [f] | 在函数结束之后(正常返回和异常返回)观察 |
| [E] | 开启正则表达式匹配,默认为通配符匹配 |
| [x:] | 指定输出结果的属性遍历深度,默认为 1,最大值是 4 |
[m <arg>] | 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>] |
案例
查看方法的输入输出
watch com.github.huzhihui.statics.service.TestService listByIds -x 4;打印参数的值

如果方法执行失败了,会提示

thread 查看当前线程信息,查看线程的堆栈
该方法主要用来排查线程繁忙的情况
查看最繁忙的线程
thread

查询繁忙线程的详情调用
thread 32

heapdump 内存对象分析
大多数用于分析
OOM场景,
导出对象分析文件
heapdump arthas-output/dump.hprof
下载MAT分析工具
使用工具分析
导入
dump.hprof文件后,这里就会显示出来问题原因,

- 如果想自己看详细的分析,就在这里

- 我的案例是创建对象太多,内存不足,导致


总结
OOM 常用分析指南
jps查看服务的pid

jmap查看内存中的大对象
jmap -histo:live 9 | head -n 100

再配合arthas使用
按照上面
thread和heapdump来分析
arthas的docker镜像封装
一般都封装离线版本,我是基于
3.7.2版本封装的,
基础镜像Dockerfile
FROM eclipse-temurin:8u402-b06-jdk
LABEL org.opencontainers.image.authors="huzhihui_c@qq.com"
ADD arthas-boot.jar /arthas-boot.jar
ADD archas /root/.arthas/lib/3.7.2/arthas
构建命令
#!/bin/bash
docker rmi huzhihui/jdk:8u402-b06-jdk-arthas
docker build -t huzhihui/jdk:8u402-b06-jdk-arthas .
SpringBoot使用Dockerfile
基于基础镜像构建服务镜像
FROM huzhihui/jdk:8u402-b06-jdk-arthas
LABEL org.opencontainers.image.authors="huzhihui_c@qq.com"
ADD app.jar /app.jar
ENTRYPOINT ["/bin/bash", "-c", "java $JAVA_OPTS -jar app.jar"]
构建命令
#!/bin/bash
docker rmi springboot-env:v1
docker build -t springboot-env:v1 .
docker-compose部署
docker-compose.yml,我指定了最大的内存使用和OOM的时候自动保存hprof文件
version: "3"
services:
springboot-env:
image: springboot-env:v1
environment:
- JAVA_OPTS=-Xmx800m -Xms800m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jvm/heapdump.hprof
networks:
- huzhihui
ports:
- "8080:8080"
deploy:
resources:
limits:
cpus: '0.50'
memory: 1024M
networks:
huzhihui:
external: true
或者使用我的快速镜像
docker pull huzhihui/jdk:8u402-b06-jdk-arthasdocker pull huzhihui/jdk:8u402-b06-jdk-alpine-arthasdocker pull huzhihui/jdk:17.0.10_7-jdk-arthasdocker pull huzhihui/jdk:17.0.10_7-jdk-alpine-arthas
转载自:https://juejin.cn/post/7352550110188404746