二、详细排查步骤
第一步:确认现象(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
判断标准:
第二步:检查进程状态(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 |
wa | CPU 等待 I/O 时间百分比 | > 10% |
si | swap in(从磁盘读入内存) | > 0(持续) |
so | swap out(从内存写入磁盘) | > 0(持续) |
判断:
第四步:深入分析 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 瓶颈原因:
大量日志写入(应用日志、Nginx 日志等)
数据库慢查询(MySQL、PostgreSQL 等)
备份任务正在运行
磁盘性能差(机械盘 vs SSD)
磁盘故障或损坏
第五步:检查内存和 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
内存问题判断:
第六步:检查其他可能原因(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
四、常见场景总结
| 场景 | 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 aux、ps aux --sort=-%mem |
| 看 I/O | vmstat 1、iostat -x 1、iotop |
| 看内存 | free -h |
| 看网络 | ss -s、ip -s link |
Load 高 CPU 低,90% 是磁盘 I/O 问题!先用 vmstat 1 看 wa 和 b,再用 iostat 和 iotop 深入分析!