通过Arthas在线诊断Docker容器应用业务问题

Arthas

https://arthas.aliyun.com/

Java 应用诊断利器

简介

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

背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。

如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

Arthas(阿尔萨斯)能为你做什么?

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

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

docker容器实例里安装jar

进入应用容器实例

// 查看应用容器实例id
$ docker ps | grep insurance
b4126d9b72a6        hub.uban360.com/basic-x86/jar:202112201122              "sh run-java.sh"         2 hours ago         Up 2 hours                              access_insurance-content_1

// 通过命令行进入应用容器实例
$ docker exec -it b4126d9b72a6 bash

安装Arthas

快速安装Arthas

// 1.解压arthas集合归档包
unzip ~/arthas-packaging-3.5.0-bin.zip

// 2.下载arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

Arthas命令列表

Arthas命令列表

基础命令

  • help - 查看命令帮助信息

jvm 相关

  • dashboard - 当前系统的实时数据面板
  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
  • jvm - 查看当前 JVM 的信息
  • memory - 查看 JVM 的内存信息
  • thread - 查看当前 JVM 的线程堆栈信息
  • sysenv - 查看 JVM 的环境变量
  • sysprop - 查看和修改 JVM 的系统属性
  • getstatic - 查看类的静态属性
  • ognl - 执行 ognl 表达式
  • vmtool - 从 jvm 里查询对象,执行 forceGc

class/classloader 相关

  • classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
  • jad - 反编译指定已加载类的源码
  • sc - 查看 JVM 已加载的类信息
  • sm - 查看已加载类的方法信息

monitor/watch/trace 相关

注意:请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测。因此,在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

  • monitor - 方法执行监控
  • stack - 输出当前方法被调用的调用路径
  • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
  • tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
  • watch - 方法执行数据观测

profiler/火焰图

  • profiler - 使用async-profiler对应用采样,生成火焰图
  • jfr - 动态开启关闭 JFR 记录

配置选项

  • options - 查看或设置 Arthas 全局开关

示例

// 查看方法调用的出入参、异常
watch java.lang.String toString '{params, returnObj}' -x 2

你可能感兴趣的:(Spring-Boot,Java,Spring,docker,java,spring,boot)