阿里-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-arthas
docker pull huzhihui/jdk:8u402-b06-jdk-alpine-arthas
docker pull huzhihui/jdk:17.0.10_7-jdk-arthas
docker pull huzhihui/jdk:17.0.10_7-jdk-alpine-arthas
转载自:https://juejin.cn/post/7352550110188404746