当前位置:首页>Linux>Linux Load 高但 CPU 低的排查思路

Linux Load 高但 CPU 低的排查思路

  • 2026-09-20 15:57:11
Linux Load 高但 CPU 低的排查思路
一、排查流程图

二、详细排查步骤

第一步:确认现象(5分钟)

# 1.1 查看 Load Averageuptime# 输出示例: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,  0.0 hi,  0.0 si,  0.0 st# id: idle(空闲), wa: iowait(等待 I/O)# 1.3 查看 CPU 核心数nproc# 或grep -c ^processor /proc/cpuinfo# 1.4 查看总进程数ps aux | wc-l

判断标准:

  • Load > CPU 核心数 × 2 → 负载过高

  • idle > 50% → CPU 使用率低

  • wa > 10% → 可能有 I/O 问题


第二步:检查进程状态(10分钟)

# 2.1 查看所有进程状态分布echo "=== 进程状态统计 ==="ps aux | awk'{print $8}' | sort | uniq -c | sort-rn# 2.2 查看 D 状态进程(不可中断,通常在等 I/O)echo ""echo "=== D 状态进程(不可中断) ==="ps aux | awk'$8 ~ /D/ {print $0}'# 2.3 查看 Z 状态进程(僵尸进程)echo ""echo "=== Z 状态进程(僵尸) ==="ps aux | awk'$8 ~ /Z/ {print $0}'# 2.4 查看进程树echo ""echo "=== 进程树(前 50 行) ==="pstree -p | head -50# 2.5 查看占用资源最多的进程echo ""echo "=== 按 CPU 排序前 10 ==="ps aux --sort=-%cpu | head -11echo ""echo "=== 按内存排序前 10 ==="ps aux --sort=-%mem | head -11

关键看:

  • D 状态进程多 → I/O 阻塞

  • Z 状态进程多 → 僵尸进程堆积

  • 没有明显高 CPU 进程 → 不是 CPU 问题


第三步:检查 vmstat(关键!10分钟)

# 3.1 查看 vmstat(每 1 秒刷新,共 5 次)echo "=== vmstat 统计 ==="vmstat 15

vmstat 输出详解:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  8      0 102400   8192 512000    0    0     0 10000  100   50  5  3 75 17  0
列说明告警值
r运行队列中的进程数> CPU 核心数
b等待 I/O 的进程数> 2
waCPU 等待 I/O 时间百分比> 10%
siswap in(从磁盘读入内存)> 0(持续)
soswap out(从内存写入磁盘)> 0(持续)

判断:

  • wa 高 + b 高 → 磁盘 I/O 瓶颈(最常见)

  • si/so 持续 > 0 → 内存不足,频繁 swap


第四步:深入分析 I/O 瓶颈(15分钟)

如果第三步发现 wa 高,继续排查:

# 4.1 查看磁盘 I/O 详细统计(需要安装 sysstat)echo "=== iostat 磁盘 I/O 统计 ==="iostat -x13# 4.2 查看哪个进程在读写磁盘(需要安装 iotop)echo ""echo "=== iotop 进程 I/O(按 q 退出) ==="ps aux --sort=-%mem | head -11# 4.3 查看进程 I/O 统计(需要安装 sysstat)echo ""echo "=== pidstat 进程 I/O ==="pidstat -d13# 4.4 查看磁盘挂载和使用echo ""echo "=== df -h 磁盘使用 ==="df -hecho ""echo "=== lsblk 磁盘布局 ==="lsblk# 4.5 查看磁盘错误echo ""echo "=== dmesg 磁盘错误 ==="dmesg | grep-i error | grep-i sd

iostat 关键指标:

指标说明告警值
%util设备繁忙时间百分比> 80%
await平均 I/O 等待时间(毫秒)> 50ms
svctm平均服务时间(毫秒)> 20ms

常见 I/O 瓶颈原因:

  1. 大量日志写入(应用日志、Nginx 日志等)

  2. 数据库慢查询(MySQL、PostgreSQL 等)

  3. 备份任务正在运行

  4. 磁盘性能差(机械盘 vs SSD)

  5. 磁盘故障或损坏


第五步:检查内存和 Swap(10分钟)

如果第三步发现 si/so 高,继续排查:

# 5.1 查看内存详细使用echo "=== free -h 内存使用 ==="free -h# 5.2 查看 /proc/meminfoecho ""echo "=== /proc/meminfo(前 20 行) ==="cat  /proc/meminfo | head -20# 5.3 查看占用内存最多的进程echo ""echo "=== 按内存排序前 15 ==="ps aux --sort=-%mem | head -16# 5.4 查看 OOM Killer 日志echo ""echo "=== OOM Killer 日志 ==="dmesg | grep-i oom# 或journalctl -k | grep-i oom# 5.5 查看进程的内存映射# echo ""# echo "=== 进程内存映射(选一个 PID) ==="# cat /proc/<PID>/smaps | head -30

内存问题判断:

  • free 很小,buffer/cache 也小 → 真的内存不足

  • swap used 持续增长 → 内存压力大

  • 某个进程 %MEM 特别高 → 内存泄漏


第六步:检查其他可能原因(10分钟)

如果以上都没找到问题,检查:

# 6.1 检查网络echo "=== 网络连接统计 ==="ss -secho ""echo "=== 网络接口流量(按 q 退出) ==="ip -s link# 6.2 检查 NFS 挂载(如果有)echo ""echo "=== NFS 挂载 ==="mount | grep nfs# 6.3 检查系统日志echo ""echo "=== 最近 50 条系统日志 ==="journalctl -n50--no-pager# 6.4 检查僵尸进程的父进程echo ""echo "=== 查找僵尸进程的父进程 ==="ps -efL | grep-i defunct# 6.5 检查内核参数echo ""echo "=== 内核参数(部分) ==="sysctl vm.dirty_ratio vm.dirty_background_ratio vm.swappiness

三、快速排查命令清单

一键诊断(复制粘贴运行)

cat << 'EOF' > /tmp/diagnose.sh#!/bin/bashecho "=========================================="echo "  Linux Load 高 CPU 低 快速诊断"echo "=========================================="echo ""echo "[1] Load Average 和 CPU 核心数"echo "--------------------------------"uptimeecho "CPU 核心数: $(nproc)"echo ""echo "[2] CPU 使用率"echo "--------------------------------"top -bn1 | head -5echo ""echo "[3] 进程状态统计"echo "--------------------------------"ps aux | awk'{print $8}' | sort | uniq -c | sort-rn | head -10echo ""echo "[4] D 状态进程(不可中断)"echo "--------------------------------"d_count=$(ps aux | awk '$8 ~ /D/ {count++} END{print count+0}')echo "D 状态进程数: $d_count"if [ $d_count-gt0 ]; thenps aux | awk'$8 ~ /D/ {print $0}' | head -5fiecho ""echo "[5] VMSTAT"echo "--------------------------------"if command -v vmstat &>/dev/null; then    vmstat 12 | tail -1elseecho "vmstat 未安装"fiecho ""echo "[6] 内存使用"echo "--------------------------------"free  -hecho ""echo "[7] 磁盘使用"echo "--------------------------------"df -h | grep-v tmpfsecho ""echo "=========================================="echo "诊断完成"echo "=========================================="echo ""echo "提示:"echo "- 如果 wa > 10%,检查磁盘 I/O"echo "- 如果有 D 状态进程,检查 I/O 阻塞"echo "- 如果 si/so > 0,检查内存"EOFchmod +x /tmp/diagnose.sh /tmp/diagnose.sh

四、常见场景总结

场景LoadCPU idlewabsi/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># 4. 临时扩容(如果是云服务器)# 增加 CPU/内存

六、总结

排查口诀

Load 高 CPU 低,先看 vmstat 的 wa;wa 高是 I/O 卡,iostat 把磁盘查;wa 低看 si/so,内存不足 swap 跑;还有 D 状态多,不是 I/O 就是锁;按步排查别着急,问题总能找到底!

关键命令速查

步骤命令
看 Loaduptime
看 CPUtop
看进程ps aux、ps aux --sort=-%mem
看 I/Ovmstat 1、iostat -x 1、iotop
看内存free -h
看网络ss -s、ip -s link

Load 高 CPU 低,90% 是磁盘 I/O 问题!先用 vmstat 1 看 wa 和 b,再用 iostat 和 iotop 深入分析!

最新文章

随机文章