Docker容器使用Arthas监控Java应用的完整指南
作者:荔枝爱编程
这篇文章主要为大家详细介绍了如何在运行中的 Docker 容器里,为目标 Java 进程快速注入 Arthas 并进行线上诊断,感兴趣的小伙伴可以了解一下
为什么要这么做
- Arthas 支持 JDK 11 及以上版本,本身并不存在“无法直接跟踪 JDK 11”的问题;问题的根因常出现在容器基础镜像过于精简。
- 从 JDK 9 起工具布局与模块化发生变化,而许多瘦身镜像(如 openjdk:*‑slim、alpine 变体)常不包含 jcmd 等诊断工具,也没有随镜像提供 jattach,导致无法直接对 JVM 执行动态 attach;安装完整 JDK 或额外安装 jattach 后即可恢复能力。
- 另一个高频问题是“运行 Arthas 的 Java 与目标 JVM 版本不一致”会导致 attach 失败或不稳定,建议使用与目标进程一致或相近版本的 JDK 来运行 arthas‑boot。
本文演示如何在运行中的 Docker 容器里,为目标 Java 进程快速注入 Arthas 并进行线上诊断。
步骤 1:进入容器并安装必要工具
# 进入正在运行的容器 docker exec -it xxx /bin/sh # 安装 jattach (用于将 Arthas Agent 注入到目标 JVM) apk add --no-cache jattach # 安装 JDK (解决 tools.jar 缺失问题,非常重要!) apk add --no-cache openjdk11-jdk # 安装网络工具 (用于后续排查和验证) apk add --no-cache net-tools iproute2
步骤 2:下载 Arthas
# 下载 arthas-boot.jar wget https://arthas.aliyun.com/arthas-boot.jar
步骤 3:确认目标 Java 进程 PID
# 查看 Java 进程,确认 PID(通常为 1) ps -ef | grep java
会看到类似输出:
1 root 9:33 java -Xms512m ... -jar tiji-risk-prevention.jar
记下 PID,这里是 1
。
步骤 4:将 Arthas Agent 注入到目标 JVM
# 使用 jattach 将 Arthas Agent 加载到 PID 为 1 的 Java 进程中 jattach 1 load instrument false /root/.arthas/lib/4.0.5/arthas/arthas-agent.jar
注意:如果 /root/.arthas/
目录不存在,先运行一次 java -jar arthas-boot.jar 1
来触发 Arthas 的自动下载和解压。
步骤 5:手动启动 Arthas 核心服务(关键步骤)
这一步是解决会遇到的 Connection refused
问题的关键:
# 手动启动 Arthas Core 服务,监听 telnet 和 HTTP 端口 java -cp /root/.arthas/lib/4.0.5/arthas/arthas-core.jar \ com.taobao.arthas.core.Arthas \ --telnet-port 3658 \ --http-port 3659 \ --ip 127.0.0.1 \ # 或者使用 --ip 0.0.0.0 以允许外部访问 --pid 1 &
注意:使用 &
让它在后台运行。
步骤 6:验证 Arthas 是否成功启动
# 检查 3658 端口是否在监听 netstat -tlnp | grep 3658
你应该看到类似输出:
tcp6 0 0 127.0.0.1:3658 :::* LISTEN 1/java
步骤 7:连接到 Arthas
现在你可以通过以下任一方式连接:
方式一:使用 arthas-boot.jar
(推荐)
# 再次运行 arthas-boot.jar,它会检测到端口已监听并直接连接 java -jar arthas-boot.jar 1
步骤 8:开始使用 Arthas 进行诊断
连接成功后,你会看到 Arthas 的欢迎界面:
,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doc tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html version 4.0.5 ... [arthas@1]$
现在你就可以使用 Arthas 命令来监控你的方法了,例如:
# 查找方法 sm *getPatrolTaskTrack* # 跟踪方法执行耗时 trace com.yourcompany.service.YourClass getPatrolTaskTrack # 监控方法调用统计 monitor com.yourcompany.service.YourClass getPatrolTaskTrack # 查看方法调用堆栈 stack com.yourcompany.service.YourClass getPatrolTaskTrack
清理
# 可按需删除临时文件与解压目录(路径因实际解压位置而异) rm -f /tmp/arthas-boot.jar # Arthas 解压目录一般位于 ~/.arthas 或 /root/.arthas rm -rf ~/.arthas || true
参考
Arthas 官方站点与使用指南:arthas.aliyun.com
到此这篇关于Docker容器使用Arthas监控Java应用的完整指南的文章就介绍到这了,更多相关Docker Arthas监控Java应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!