LinuxLoad高但CPU低的排查思路

admin 2026-04-13 02:51:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了Linux系统出现高负载但CPU使用率低时的系统化排查方法。核心排查流程包括确认负载与CPU使用率、检查进程状态、分析vmstat指标、深入I/O与内存问题诊断。关键发现是90%此类问题源于磁盘I/O瓶颈,可通过wa指标和D状态进程快速定位。文档提供了完整的一键诊断脚本和六步排查口诀,强调vmstat的wa值和iostat工具的使用,并给出临时应急处理方案。 综合评分: 85 文章分类: 应急响应,系统运维,故障排查,解决方案,安全运营


cover_image

Linux Load 高但 CPU 低的排查思路

原创

刘军军 刘军军

运维星火燎原

2026年4月12日 09:01 山西

在小说阅读器读本章

去阅读

一、排查流程图

二、详细排查步骤

第一步:确认现象(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,  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 -11

echo ""
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 | | wa | CPU 等待 I/O 时间百分比 | > 10% | | si | swap in(从磁盘读入内存) | > 0(持续) | | so | swap 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 -h

echo ""
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/meminfo
echo ""
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&nbsp;"=== 网络连接统计 ==="
ss&nbsp;-s

echo&nbsp;""
echo&nbsp;"=== 网络接口流量(按 q 退出) ==="
ip&nbsp;-s&nbsp;link

# 6.2 检查 NFS 挂载(如果有)
echo&nbsp;""
echo&nbsp;"=== NFS 挂载 ==="
mount |&nbsp;grep&nbsp;nfs

# 6.3 检查系统日志
echo&nbsp;""
echo&nbsp;"=== 最近 50 条系统日志 ==="
journalctl&nbsp;-n50--no-pager

# 6.4 检查僵尸进程的父进程
echo&nbsp;""
echo&nbsp;"=== 查找僵尸进程的父进程 ==="
ps&nbsp;-efL&nbsp;|&nbsp;grep-i&nbsp;defunct

# 6.5 检查内核参数
echo&nbsp;""
echo&nbsp;"=== 内核参数(部分) ==="
sysctl vm.dirty_ratio vm.dirty_background_ratio vm.swappiness

三、快速排查命令清单

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

cat&nbsp;<<&nbsp;'EOF'&nbsp;> /tmp/diagnose.sh
#!/bin/bash
echo&nbsp;"=========================================="
echo&nbsp;" &nbsp;Linux Load 高 CPU 低 快速诊断"
echo&nbsp;"=========================================="
echo&nbsp;""

echo&nbsp;"[1] Load Average 和 CPU 核心数"
echo&nbsp;"--------------------------------"
uptime
echo&nbsp;"CPU 核心数:&nbsp;$(nproc)"
echo&nbsp;""

echo&nbsp;"[2] CPU 使用率"
echo&nbsp;"--------------------------------"
top&nbsp;-bn1&nbsp;| head&nbsp;-5
echo&nbsp;""

echo&nbsp;"[3] 进程状态统计"
echo&nbsp;"--------------------------------"
ps&nbsp;aux |&nbsp;awk'{print $8}'&nbsp;|&nbsp;sort&nbsp;| uniq&nbsp;-c&nbsp;|&nbsp;sort-rn&nbsp;| head&nbsp;-10
echo&nbsp;""

echo&nbsp;"[4] D 状态进程(不可中断)"
echo&nbsp;"--------------------------------"
d_count=$(ps aux | awk '$8&nbsp;~ /D/ {count++} END{print count+0}')
echo&nbsp;"D 状态进程数:&nbsp;$d_count"
if&nbsp;[&nbsp;$d_count-gt0&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;ps&nbsp;aux |&nbsp;awk'$8 ~ /D/ {print $0}'&nbsp;| head&nbsp;-5
fi
echo&nbsp;""

echo&nbsp;"[5] VMSTAT"
echo&nbsp;"--------------------------------"
if&nbsp;command&nbsp;-v&nbsp;vmstat &>/dev/null;&nbsp;then
&nbsp; &nbsp; vmstat&nbsp;12&nbsp;| tail&nbsp;-1
else
&nbsp; &nbsp;&nbsp;echo&nbsp;"vmstat 未安装"
fi
echo&nbsp;""

echo&nbsp;"[6] 内存使用"
echo&nbsp;"--------------------------------"
free &nbsp;-h
echo&nbsp;""

echo&nbsp;"[7] 磁盘使用"
echo&nbsp;"--------------------------------"
df&nbsp;-h&nbsp;|&nbsp;grep-v&nbsp;tmpfs
echo&nbsp;""

echo&nbsp;"=========================================="
echo&nbsp;"诊断完成"
echo&nbsp;"=========================================="
echo&nbsp;""
echo&nbsp;"提示:"
echo&nbsp;"- 如果 wa > 10%,检查磁盘 I/O"
echo&nbsp;"- 如果有 D 状态进程,检查 I/O 阻塞"
echo&nbsp;"- 如果 si/so > 0,检查内存"
EOF

chmod&nbsp;+x /tmp/diagnose.sh /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>

# 4. 临时扩容(如果是云服务器)
# 增加 CPU/内存

六、总结

排查口诀

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

关键命令速查

| 步骤 | 命令 | | — | — | | 看 Load | uptime | | 看 CPU | top | | 看进程 | ps auxps aux --sort=-%mem | | 看 I/O | vmstat 1iostat -x 1iotop | | 看内存 | free -h | | 看网络 | ss -sip -s link |

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


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军 刘军军《Linux Load 高但 CPU 低的排查思路》

评论:0   参与:  0