Linux负载高时应先定位瓶颈而非重启,需结合CPU、内存、I/O、进程四维度交叉分析load average(就绪+不可中断任务数,非CPU使用率),再依序排查资源热点、内存压力、I/O卡顿、不可中断进程及隐蔽因素。

Linux系统负载高时,别急着重启,先定位真正瓶颈。关键不是看load average数字本身,而是结合CPU、内存、I/O、进程四个维度交叉验证——很多“高负载”其实只是I/O等待或单个进程卡死,并非CPU真忙。
看懂load average背后的含义
top或uptime显示的三个数字(如12.50, 11.80, 9.20)分别代表过去1/5/15分钟的平均“就绪态+不可中断态”任务数。注意:它不等于CPU使用率。比如load=12但CPU idle 70%,大概率是大量进程在等磁盘或锁;反过来,CPU跑满但load只有1.2,说明任务少但每个都很重。
快速判断:用 cat /proc/loadavg 查第4字段(当前运行队列长度)和第5字段(总进程数),再对比 ps aux --sort=-pcpu | head -5 看谁在吃CPU。
揪出真凶:按优先级排查四类资源
- CPU热点:用 pidstat -u 1 每秒刷新,关注 %usr/%sys/%guest 列;%sys 高说明内核态耗时多(如频繁系统调用、软中断),%usr 高才是应用层问题
- 内存压力:free -h 看available是否持续低于1G;vmstat 1 中si/so列非零说明在swap,bi/bo持续高说明磁盘在扛内存压力
- I/O卡顿:iostat -x 1 关注 %util > 90% 且 await > 50ms 的设备;r/s+w/s 合计远小于 IOPS 上限,但 %util 却高?可能是单队列SSD被锁死或IO调度器不匹配
- 不可中断进程:ps aux | awk '$8 ~ /D/ {print}' 找状态为D的进程——它们卡在内核态等待IO或锁,会推高load但不占CPU,常见于存储异常或NFS挂载点假死
快速定位异常进程的组合命令
一条命令抓典型:
ps auxf --sort=-%cpu | head -10 —— 看CPU大户及其子进程树
lsof -P -n -p $(pgrep -f "java|python|nginx") | awk '{print $9}' | sort | uniq -c | sort -nr | head -5 —— 查某服务打开最多文件的路径(常暴露日志疯涨或连接泄漏)
strace -p $(pgrep -f "problem_cmd") -c 2>&1 | grep -E "(read|write|open|futex)" —— 统计某进程系统调用耗时分布,futex高说明锁竞争,read/write高说明IO慢
别忽略的隐蔽因素
- 内核参数限制:ulimit -n 太小会导致“too many open files”,进程卡在accept();net.core.somaxconn 过低让新连接排队,表现像服务响应慢
- 硬件层面:用 smartctl -a /dev/sdX 检查磁盘健康;dmesg -T | tail -20 看是否有内存ECC报错、PCIe链路降速等底层警告
- 容器环境特例:Docker/K8s中需进容器用 top,但宿主机的 docker stats 显示的CPU%是cgroup统计值,可能和容器内top不一致——优先信cgroup数据
基本上就这些。排查高负载不是拼命令数量,而是建立“load → 资源类型 → 具体进程 → 根因”的逻辑链。每次动手前,先问一句:这个高load,到底是“活得多”还是“干得慢”?










