小白零基础|Docker容器JDK8使用Arthas排查Java接口性能卡顿(保姆级踩坑+解决教程)
小白零基础|Docker容器JDK8使用Arthas排查Java接口性能卡顿(保姆级踩坑+解决教程)
一、前言
很多新手在排查Docker容器内部Java接口慢、请求超时、接口卡顿问题时,使用Arthas会遇到各种奇葩报错:找不到Java进程、tools.jar缺失、socket挂载失败、端口占用、attach连接拒绝等问题。
本次结合真实线上排查全过程,整理一套小白可直接复制粘贴使用的分步教程,包含:全套报错解决、Arthas部署、分层排查接口耗时、定位性能瓶颈、终极环境修复方案,全程零理解门槛,照着操作即可排查99%的Java接口性能问题。
实际业务场景:首页分页接口 searchContainerPage 耗时最高12s,页面加载卡死,通过Arthas逐层定位底层卡顿根源。
二、环境介绍 & 新手避坑前置说明
1. 问题环境
-
服务部署:Docker 容器部署
-
运行JDK:openjdk 1.8.0_111(容器默认JRE精简环境,无完整JDK工具)
-
排查工具:Arthas 3.5.1
-
核心问题:容器默认环境无法直接运行Arthas,存在大量兼容bug
2. 新手最大误区(必看)
-
❌ 不要在宿主机直接执行Arthas:Docker独立PID隔离,宿主机找不到容器Java进程
-
❌ 不要用容器默认JRE启动:缺失tools.jar,直接报错无法挂载进程
-
❌ 不要绑定PID1、PID8:均为容器内核进程/守护进程,不是Java业务进程
三、保姆级第一步:给容器部署Arthas(小白直接抄)
1. 将宿主机Arthas拷贝进业务容器
提前下载好Arthas完整包,执行拷贝命令(替换为自己的容器ID):
docker cp /appdata/dsa5500-ems/apps/arthas-packaging-3.5.1-bin 你的容器ID:/tmp/
2. 进入容器内部
docker exec -it 你的容器ID bash
3. 进入Arthas目录
cd /tmp/arthas-packaging-3.5.1-bin
四、新手必遇报错 + 一键解决方案
报错1:找不到Java进程
报错日志
[INFO] arthas-boot version: 3.5.1
[INFO] Can not find java process. Try to run `jps` command lists the instrumented Java HotSpot VMs on the target system.
Please select an available pid.
原因:容器是精简JRE环境,无jps工具,Arthas无法自动扫描进程
解决(小白固定命令):手动查询真实Java业务进程PID
ps -ef | grep java | grep -v /bin/sh | grep -v grep
报错2:缺失tools.jar、JRE环境不支持
报错原因:容器默认java指向jre,无诊断工具包
终极解决:使用容器内完整JDK启动Arthas(核心关键)
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.home=/usr/lib/jvm/java-8-openjdk-amd64 -jar arthas-boot.jar 你的Java进程PID
报错3:socket挂载失败、连接被拒绝
报错:Unable to open socket file、Connection refused
一键修复缓存权限
chmod 1777 /tmp
rm -rf /tmp/hsperfdata_* ~/.arthas /tmp/arthas-*
五、小白专属:分层排查接口耗时固定流程(100%定位卡顿)
排查口诀:先Controller → 再Service → 再底层子方法 → 最后第三方/数据库
第一步:追踪接口入口Controller(定位整体耗时)
排查首页分页接口总耗时,复制执行:
trace com.dsa.hems.home.controller.ContainerController searchContainerPage
本次排查结果
[6307.570395ms] 总接口耗时6.3秒
+---[2.69ms] 请求头获取(可忽略)
+---[6301.91ms] Service层业务逻辑(100%耗时卡点)
第二步:进入Service层深挖业务耗时
外层无问题,跟进核心业务方法:
trace com.dsa.hems.home.service.HomeServiceImpl searchContainerPage -n 20
第三步:精准追踪底层卡顿子方法
定位到核心卡顿方法 searchEngineerHomePage,限制20次请求自动停止,避免刷屏:
trace com.dsa.hems.home.service.HomeServiceImpl searchEngineerHomePage -n 20
第四步:继续深挖工具/组装方法
trace com.dsa.hems.home.service.HomeServiceImpl buildHomeInfoList -n 20
第五步:定位最终卡顿根源(第三方Feign调用)
逐层排查后,精准定位12秒卡顿根因:跨服务Feign远程调用阻塞
trace com.dsa.hems.home.service.HomeServiceImpl searchEngineerHomePage -n 20
# 最终卡点日志
+---[12031.836646ms] com.dsa.hems.common.feign.service.DmContainerService:searchUserKeyContainerPage() #367
问题结论:接口耗时12s完全卡在Feign远程调用第三方容器服务,非本地代码、非数据库问题。
六、终极解决:彻底解决容器Arthas所有兼容问题
反复测试得出:老旧JDK8u111 + 默认JRE容器,动态attach天生存在bug,临时排查总会报错。
最终可行解决方案(本人实测有效)
使用自带完整JDK8的最新镜像重新部署服务:
-
替换Docker基础镜像为
openjdk:8-jdk(完整JDK,包含所有诊断工具) -
重新打包、部署容器服务
-
容器内直接正常启动Arthas,无任何报错、无需复杂权限修复
该方案彻底根治:tools.jar缺失、进程找不到、socket挂载失败、attach异常等所有问题。
七、小白总结:通用性能排查套路(可复用所有项目)
1. 排查顺序(万能公式)
Controller入口耗时 → Service业务层耗时 → 底层子方法/循环/组装耗时 → 数据库SQL/Redis/Feign远程调用耗时
2. 高频固定命令(直接收藏复用)
# 1. 查询真实Java进程
ps -ef | grep java | grep -v grep
# 2. 分层追踪接口耗时
trace 包名.Controller类名 接口方法名
trace 包名.Service类名 业务方法名 -n 20
# 3. 只看1秒以上慢请求(防刷屏)
trace 包名.类名 方法名 '#cost>1000' -n 10
# 4. 排查结束正常退出(必须执行)
stop
八、踩坑总结(新手必看)
-
不要用精简JRE镜像:线上调试、问题排查必须用完整JDK镜像,否则所有诊断工具失效
-
容器内必须手动指定PID:精简环境jps失效,无法自动扫描进程
-
接口卡顿大概率不是本地代码:本次案例最终卡在Feign跨服务调用,优先排查第三方、远程接口、数据库
-
临时报错不用死磕:老旧容器环境兼容问题无解,替换完整JDK镜像可一劳永逸
更多推荐

所有评论(0)