来源:刘军军 | 发布日期:2026-04-12
Linux Load 高但 CPU 低的排查思路
核心认知:Load 高但 CPU 低,90% 是磁盘 I/O 问题。排查本质是通过逐层剥离找到瓶颈资源。
排查决策树
Load 高 + idle > 50% → vmstat 1
├─ wa > 10% 且 b > 0 → 磁盘 I/O 瓶颈 ← 最常见
│ └─ iostat → iotop → 定位 I/O 进程
├─ si/so 持续 > 0 → 内存不足 / swap 频繁
│ └─ free → ps 排序内存 → OOM dmesg
├─ D 状态进程多(ps D) → I/O 阻塞(NFS/驱动)
│ └─ pstree → dmesg → 检查 NFS
├─ Z 状态进程多(ps Z) → 僵尸进程堆积
│ └─ 查父进程 → 修复/重启
└─ 以上都不是 → 网络/其他
└─ ss → ip link → journalctl
详细排查步骤
第一步:确认现象(5分钟)
# 1.1 查看 Load Average
uptime
# 输出示例:load average: 12.34, 10.56, 8.78
# 1.2 查看 CPU 使用率
top -bn1 | head -10
# 重点看:%Cpu(s): 5.0 us, 3.0 sy, 0.0 ni, 85.0 id, 7.0 wa, ...
# id: idle(空闲), wa: iowait(等待 I/O)
# 1.3 查看 CPU 核心数
nproc
# 1.4 查看总进程数
ps aux | wc -l
判断标准:
- Load > CPU 核心数 × 2 → 负载过高
- idle > 50% → CPU 使用率低
- wa > 10% → 可能有 I/O 问题
第二步:检查进程状态(10分钟)
# 2.1 所有进程状态分布
ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
# 2.2 D 状态进程(不可中断,通常在等 I/O)
ps aux | awk '$8 ~ /D/ {print $0}'
# 2.3 Z 状态进程(僵尸进程)
ps aux | awk '$8 ~ /Z/ {print $0}'
# 2.4 进程树
pstree -p | head -50
# 2.5 按资源排序进程
ps aux --sort=-%cpu | head -11
ps aux --sort=-%mem | head -11
关键判断:
- D 状态进程多 → I/O 阻塞
- Z 状态进程多 → 僵尸进程堆积
- 没有明显高 CPU 进程 → 不是 CPU 问题
第三步:检查 vmstat(关键!10分钟)
vmstat 1 5
输出详解:
| 列 | 说明 | 告警值 |
|---|---|---|
| r | 运行队列进程数 | > CPU 核心数 |
| b | 等待 I/O 的进程数 | > 2 |
| wa | CPU 等待 I/O 时间 % | > 10% |
| si | swap in(从磁盘读入内存) | > 0(持续) |
| so | swap out(从内存写入磁盘) | > 0(持续) |
判断:
- wa 高 + b 高 → 磁盘 I/O 瓶颈(最常见)
- si/so 持续 > 0 → 内存不足,频繁 swap
第四步:深入分析 I/O 瓶颈(15分钟)
仅在 vmstat 发现 wa 高时执行。
# 4.1 磁盘 I/O 详细统计(需要 sysstat)
iostat -x 1 3
# 4.2 进程 I/O 统计(需要 sysstat)
pidstat -d 1 3
# 4.3 磁盘挂载和使用
df -h
lsblk
# 4.4 磁盘错误
dmesg | grep -i error | grep -i sd
iostat 关键指标:
| 指标 | 说明 | 告警值 |
|---|---|---|
| %util | 设备繁忙时间百分比 | > 80% |
| await | 平均 I/O 等待时间(ms) | > 50ms |
| svctm | 平均服务时间(ms) | > 20ms |
常见 I/O 瓶颈原因:
- 大量日志写入(应用日志、Nginx 日志等)
- 数据库慢查询(MySQL、PostgreSQL 等)
- 备份任务正在运行
- 磁盘性能差(机械盘 vs SSD)
- 磁盘故障或损坏
第五步:检查内存和 Swap(10分钟)
仅在 vmstat 发现 si/so 高时执行。
# 5.1 内存详细使用
free -h
# 5.2 OOM Killer 日志
dmesg | grep -i oom
# 5.3 查看占用内存最多的进程
ps aux --sort=-%mem | head -16
内存问题判断:
- free 很小,buffer/cache 也小 → 真的内存不足
- swap used 持续增长 → 内存压力大
- 某个进程 %MEM 特别高 → 内存泄漏
第六步:检查其他可能原因(10分钟)
# 6.1 网络连接统计
ss -s
ip -s link
# 6.2 NFS 挂载(如果有)
mount | grep nfs
# 6.3 系统日志
journalctl -n 50 --no-pager
# 6.4 僵尸进程的父进程
ps -efL | grep -i defunct
# 6.5 内核参数
sysctl vm.dirty_ratio vm.dirty_background_ratio vm.swappiness
一键诊断脚本
cat << 'EOF' > /tmp/diagnose.sh
#!/bin/bash
echo "=========================================="
echo " Linux Load 高 CPU 低 快速诊断"
echo "=========================================="
echo "[1] Load Average 和 CPU 核心数"
uptime && echo "CPU 核心数: $(nproc)"
echo "[2] CPU 使用率"
top -bn1 | head -5
echo "[3] 进程状态统计"
ps aux | awk '{print $8}' | sort | uniq -c | sort -rn | head -10
echo "[4] D 状态进程(不可中断)"
d_count=$(ps aux | awk '$8 ~ /D/ {count++} END{print count+0}')
echo "D 状态进程数: $d_count"
[ $d_count -gt 0 ] && ps aux | awk '$8 ~ /D/ {print $0}' | head -5
echo "[5] VMSTAT"
vmstat 1 2 | tail -1
echo "[6] 内存使用"
free -h
echo "[7] 磁盘使用"
df -h | grep -v tmpfs
echo "=========================================="
echo "提示:"
echo "- 如果 wa > 10%,检查磁盘 I/O"
echo "- 如果有 D 状态进程,检查 I/O 阻塞"
echo "- 如果 si/so > 0,检查内存"
EOF
chmod +x /tmp/diagnose.sh
常见场景总结
| 场景 | Load | CPU idle | wa | b | si/so | 原因 |
|---|---|---|---|---|---|---|
| 场景 1 | 高 | 高 | 高 | 高 | 低 | 磁盘 I/O 瓶颈(最常见) |
| 场景 2 | 高 | 高 | 低 | 低 | 高 | 内存不足,swap 频繁 |
| 场景 3 | 高 | 高 | 低 | 高 | 低 | 大量 D 状态进程(NFS/驱动) |
| 场景 4 | 高 | 高 | 低 | 低 | 低 | 僵尸进程堆积 |
| 场景 5 | 高 | 高 | 低 | 低 | 低 | 网络 I/O 瓶颈 |
应急处理(临时方案)
# 1. I/O 瓶颈 — 降低进程 I/O 优先级
ionice -c 3 -p <PID>
# 2. 内存不足 — 清理缓存(谨慎使用!)
sync; echo 3 > /proc/sys/vm/drop_caches
# 3. 重启有问题的服务
systemctl restart <service>
排查口诀
Load 高 CPU 低,先看 vmstat 的 wa wa 高是 I/O 卡,iostat 把磁盘查 wa 低看 si/so,内存不足 swap 跑 还有 D 状态多,不是 I/O 就是锁 按步排查别着急,问题总能找到底!
关键命令速查
| 目的 | 命令 |
|---|---|
| 看 Load | uptime |
| 看 CPU | top |
| 看进程 | ps aux, ps aux --sort=-%mem |
| 看 I/O | vmstat 1, iostat -x 1, iotop |
| 看内存 | free -h |
| 看网络 | ss -s, ip -s link |
关联链接
- linux-server-load-case-study — 服务器负载过高排查(Netflix 60 秒法)
- server-performance-four-dimensions — 服务器性能五维排查
- linux-load-average-guide — Load Average 详解
- online-troubleshooting-checklist — 在线故障排查清单
- cpu-spike-troubleshooting-guide — CPU 飙高排查指南
关联页面
| 页面 | 关联点 |
|---|---|
| linux-perf-troubleshooting-handbook | Linux 服务器性能排查实战手册 — 60 秒快速摸底/4 大瓶颈排查/3 个实战案例/监控阈值/ |
| nfs-troubleshooting-sop | NFS 故障排查 SOP — 7 步排查法 / 6 类故障 / 4 大实战案例 / 生产最佳实践 |