Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战

🚀 作者主页: 有来技术

🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot

🌺 仓库主页: Gitee 💫 Github 💫 GitCode

💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • [Arthas 简介](#Arthas 简介)
  • [Arthas 官方](#Arthas 官方)
  • [Docker 容器使用 Arthas](#Docker 容器使用 Arthas)
    • [方案一:容器内下载运行 Arthas](#方案一:容器内下载运行 Arthas)
    • [方案二:安装 Arthas 到基础镜像](#方案二:安装 Arthas 到基础镜像)
  • 常见问题排查
  • 结语

Arthas 简介

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

Arthas 官方

名称 地址
官方文档 https://arthas.aliyun.com/doc
Git 仓库 https://github.com/alibaba/arthas
Docker 镜像 https://hub.docker.com/r/hengyunabc/arthas/tags

Docker 容器使用 Arthas

Spring Boot 项目使用 Docker 容器部署,如何在容器中使用 Arthas 呢?

方案一:容器内下载运行 Arthas

在这种情况下,通常是基于一种自信的假设,即不会在基础镜像中安装 Arthas。然而,如果问题确实发生,为了保留现场,需要采用这种方案。

bash 复制代码
# 进入容器
docker exec -it youlai-boot /bin/sh
# 下载并运行 Arthas
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

方案二:安装 Arthas 到基础镜像

在 DockerFile 里添加安装 Arthas 命令

bash 复制代码
# 基础镜像
FROM openjdk:17-jdk-alpine

# 维护者信息
MAINTAINER youlai <youlaitech@163.com>

# 设置国内镜像源(中国科技大学镜像源),修改容器时区(alpine镜像需安装tzdata来设置时区),安装字体库(验证码)
RUN echo -e https://mirrors.ustc.edu.cn/alpine/v3.7/main/ > /etc/apk/repositories  \
    && apk --no-cache add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone \
    && apk --no-cache add ttf-dejavu fontconfig

# 在运行时自动挂载 /tmp 目录为匿名卷,提高可移植性
VOLUME /tmp

# 将构建的 Spring Boot 可执行 JAR 复制到容器中,重命名为 app.jar
ADD target/youlai-boot.jar app.jar

# 安装 Arthas 到镜像
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

# 指定容器启动时执行的命令
CMD java \
    -Djava.security.egd=file:/dev/./urandom \
    -jar /app.jar

# 暴露容器的端口
EXPOSE 8989

常见问题排查

CPU 占用过高

bash 复制代码
# 查看控制台
dashboard
bash 复制代码
# 查看CPU占用top5 的线程
thread -n 5

内存占用过高

// TODO

死锁排查

bash 复制代码
# 查看是否有死锁
thread -b 

结语

在Docker容器中使用Arthas,为Java应用的监控与排查提供了便捷利器。通过实时诊断和解决CPU、内存、死锁等问题,Arthas极大地提高了开发调试的效率,为应用的稳定性和性能优化提供了有力支持。将这一强大工具与容器技术结合,为现代应用开发提供了更加灵活、高效的解决方案。

相关推荐
繁星蓝雨9 分钟前
C++设计原理——异常处理
java·c++·异常处理·noexcept·throw·try catch
BerrySen17827 分钟前
一个Java项目改成AI流程后,最难的部分完全变了
java·大数据·人工智能·可观测性·大模型应用开发·工程思维
程序猿秃头之路37 分钟前
DDD 系列:DTO、VO、DO、Entity 怎么区分
java·ddd·领域驱动设计
摇曳的精灵1 小时前
dify的docker部署
运维·docker·容器·dify
自由随风飘1 小时前
JAVA中的面向对象-3
java·开发语言
桐薇全肯定2 小时前
MySQL学生成绩管理系统实战操作
java·数据库·sql
Nuanyt2 小时前
SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格
java·spring·junit·mybatis·restful
醉城夜风~2 小时前
C++模板详解:从基础到高级全面解析
java·开发语言·c++
井川廊咏3 小时前
初探性能优化——2个月到4小时的性能提升
jvm·数据库·性能优化