K8s Java容器CPU飙高排查手册

 

 

# K8s Java容器CPU飙高排查手册

## 一、快速瓶颈预判

- **CPU高 \+ wa≈0**:业务代码计算密集,无磁盘/数据库IO瓶颈

- **CPU高 \+ 频繁GC**:JVM内存不足/内存泄漏

- **CPU正常 \+ wa高**:磁盘IO、数据库阻塞

- **线程含epollWait**:中间件网络等待,正常休眠,无需排查

---

## 二、标准最优排查流程

### 步骤1:查看整体负载 \+ 定位高CPU线程

```bash
# 查看容器整机负载
top
# 查看Java进程内部所有线程CPU占用
top -H -p ${Java_PID}
```

线程判断:**http\-nio\-8080\-exec** 线程CPU占比高 = 接口业务代码导致CPU飙升

### 步骤2:线程ID 十进制转十六进制

```bash
printf "%x\n" 线程十进制ID
```

检索堆栈格式:0x\+转换后的十六进制ID

### 步骤3:kill \-3 抓取线程栈

```bash
kill -3 ${Java_PID}
```

查看位置:Lens → Pod → Logs
**重要:堆栈日志不会输出到项目info\.log/error\.log,只能看Pod控制台日志**

### 步骤4:Arthas 线上精准诊断

前置必执行,解决Arthas挂载卡死

```bash
unset JAVA_TOOL_OPTIONS
```

#### 方式1:本地上传jar(推荐)

```bash
# 本地kubectl上传jar包至Pod临时目录
kubectl cp arthas-boot.jar ${pod_name}:/tmp -n ${namespace}
# 进入目录并附着Java进程
cd /tmp
java -jar arthas-boot.jar ${Java_PID}
```

#### 方式2:容器内curl下载

```bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar ${Java_PID}
```

#### Arthas 固定核心排查命令

#### Arthas 固定核心排查命令

```bash
# 查看当前CPU占用最高10条线程,直接定位耗时代码行
thread -n 10

# 追踪指定接口完整调用链路耗时,拆分SQL/Redis/业务代码耗时
trace 服务全类名 接口方法名

# 实时查看JVMGC情况,判断是否内存导致CPU升高
gc

# 退出当前Arthas交互会话
exit

```

### 步骤5:数据库核验

```sql
-- 达梦数据库查询当前活跃慢SQL
SELECT SESS_ID,SQL_TEXT,DATEDIFF(SS,LAST_RECV_TIME,SYSDATE) RUN_SEC
FROM V$SESSIONS WHERE STATE='ACTIVE' ORDER BY RUN_SEC DESC;
```

判定:SQL执行耗时短 → 数据库无瓶颈,问题全部来自Java业务代码

---

## 三、CPU飙高常见根因及解决方案

1. 接口无分页/分页过大:一次性查询海量数据,内存计算占用CPU → 前后端强制分页,后端拦截全量查询

2. 循环N\+1查询:循环内单次调用Redis、数据库 → 改用批量查询,消除循环单查

3. 数据库缺失索引:全表扫描返回大量冗余数据 → 补充查询、筛选、排序字段索引

posted @ 2026-06-25 16:55  自然观察家  阅读(4)  评论(0)    收藏  举报