arthas 使用教程

本贴最后更新于 1095 天前,其中的信息可能已经时移世改

arthas 使用教程

Arthas 是 Alibaba 开源的 Java 诊断工具,通过这个工具我们可以快速并准确的定位问题。

这里会简单介绍使用 arthas 进行 Troube Shooting,详细安装流程与深入的操作命令参数请自行查阅官方文档学习。🙏

官方文档: https://arthas.aliyun.com/doc/index.html

资源监控

arthas 提供了 CPU,内存,运行环境等资源信息面板,并且可以设置刷新时间

命令

dashboard

image.png

heapdump

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

查看 java 堆内存的对象实例情况

heapdump /arthas-output/nap.hprof 将堆的使用情况 dump 到 /arthas-output/nap.hprof 文件

可以使用 jdk 自带的 VisualVM 来查看

image.png

也可以使用 IntelliJ IDEA 自带的 HPROF 内存查看器 查看 输入 Action Open profiler Snapshot

image.png

Profiler

arthas 支持监控一段时间的火焰图来统计性能热点。

profiler start 启动搜集 CPU 的使用情况

profiler stop 从 start 到 stop 这个时间段的 CPU 火焰图

image.png

火焰图里,X 轴越长,代表使用的越多,Y 轴是调用堆栈信息。当前收集的是什么类型的数据,比如 cpu 那么 x 轴长度越大,占用的 cpu 资源就越多。

thread

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

参数名称 参数说明
id 线程 id
[n:] 指定最忙的前 N 个线程并打印堆栈
[b] 找出当前阻塞其他线程的线程
[i <value>] 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
[--all] 显示所有匹配的线程

查看当前最吃资源的线程

image.png

方法调用时间追踪

命令

trace

使用 trace 命令可以针对某一类的某一方法进行方法调用时间的追踪,精确定位到问题所在。

使用建议:

  1. 首先使用 thread 命令查看当前高占用线程堆栈定位到方法
  2. 然后使用 trace 监控方法进行用时追踪

image.png

在线热更新

arthas 允许我们修改一个正在运行的字节码文件,也允许我们从外部加载一个新的 claas 文件来覆盖旧的。这样我们可以实现在线热部署,这样可以临时性的解决客户生产环境产生的问题,例如空指针异常 😂。

命令

jad/mc/retransform 组合可实现热更新

jad

反编译代码,将已加载的字节码文件反编译到容器内文件夹。现场操作人员可以直接修复问题(如果问题够简单)

jad --source-only net.skycloud.cmdb.resource.api.rest.ResourceSearchController > /tmp/ResourceSearchController.java

image.png

修改反编译出来的 class 文件 (除法分母不能为 0)

image.png

mc

Memory Compiler/内存编译器,编译 .java 文件生成 .class。 这也是我们可以从 外部加载 java 文件(打补丁) 的基础。

若前方技术支持无法解决,可以让后端伙伴进行 bug 修复,然后传输修复后的 java 文件来以解燃眉之急。不需要重新生成镜像。

mc /tmp/ResourceSearchController.java -d /tmp

image.png

retransform

加载外部的 .class 文件,retransform(重新转换) jvm 已加载的类。

retransform /tmp/net/skycloud/cmdb/resource/api/rest/ResourceSearchController.class

image.png

查看已更新的类

retransform -l

image.png

恢复原来的类

这两个命令一起执行

retransform --deleteAll

retransform --classPattern net.skycloud.cmdb.resource.api.rest.ResourceSearchController

Troube Shooting

作为在现场的工作人员需要至少需要掌握以上命令来进行诊断。troube shooting 流程如下。

image.png

  • Arthas
    1 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3165 引用 • 8206 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...