likes
comments
collection
share

阿里-Arthas 常用指南(快速排查服务)

作者站长头像
站长
· 阅读数 15

摘要:本文主要介绍如何快速使用Arthas排查生产环境中的问题,还包括一些基础设施的建设,比如封装包含ArthasDocker基础镜像,离线环境如何使用。

简介

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

官网地址 arthas.aliyun.com/doc/

常用命令

dashboard 数据面板

当前系统实时数据面板,作为每次进入系统查看的首项指标

阿里-Arthas 常用指南(快速排查服务)

trace 调用时长统计

方法内部调用路径,并输出方法路径上的每个节点上耗时;运行trace com.github.huzhihui.statics.controller.TestController listByIds;命令拼装 trace 类全路径 方法名

常用参数如下

  • -m 10 定 Class 最大匹配数量,默认值为 50
  • -n 1 参数指定捕捉结果的次数

阿里-Arthas 常用指南(快速排查服务)

监听一次长时间的

trace com.github.huzhihui.statics.controller.TestController getById -n 1

阿里-Arthas 常用指南(快速排查服务)

jad 反编译类

jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑。

获取我们的TestService

运行jad com.github.huzhihui.statics.service.TestService;命令拼接规则jad 类全路径名

阿里-Arthas 常用指南(快速排查服务)

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;打印参数的值

阿里-Arthas 常用指南(快速排查服务)

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

阿里-Arthas 常用指南(快速排查服务)

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

该方法主要用来排查线程繁忙的情况

查看最繁忙的线程

thread

阿里-Arthas 常用指南(快速排查服务)

查询繁忙线程的详情调用

thread 32

阿里-Arthas 常用指南(快速排查服务)

heapdump 内存对象分析

大多数用于分析OOM场景,

导出对象分析文件

heapdump arthas-output/dump.hprof

下载MAT分析工具

下载地址:eclipse.dev/mat/previou…

使用工具分析

导入dump.hprof文件后,这里就会显示出来问题原因,

阿里-Arthas 常用指南(快速排查服务)

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

阿里-Arthas 常用指南(快速排查服务)

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

阿里-Arthas 常用指南(快速排查服务)

阿里-Arthas 常用指南(快速排查服务)

总结

OOM 常用分析指南

jps查看服务的pid

阿里-Arthas 常用指南(快速排查服务)

jmap查看内存中的大对象

jmap -histo:live 9 | head -n 100

阿里-Arthas 常用指南(快速排查服务)

再配合arthas使用

按照上面threadheapdump来分析

arthasdocker镜像封装

一般都封装离线版本,我是基于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

或者使用我的快速镜像

仓库地址:hub.docker.com/r/huzhihui/…

  • 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