linux高负载排查核心是识别系统等待的资源类型而非单纯看CPU占用;Load Average反映就绪态与D状态任务平均数量,需结合vmstat、iostat、free交叉分析,再据wa/us/sy等指标定位I/O、CPU或内存瓶颈。

Linux高负载排查,核心不是“看哪个进程CPU高”,而是先搞清:系统到底在等什么。
看懂Load Average的真正含义
Load Average(1/5/15分钟)反映的是**就绪态+不可中断态(D状态)任务的平均数量**,本质是“排队等资源的活儿有多少”。它不等于CPU使用率,也不只和CPU有关——内存不足触发swap、磁盘慢导致I/O卡住、大量进程阻塞在锁或网络上,都会推高load。
关键判断标准:
- load nproc返回值)→ 通常健康
- load > CPU逻辑核数 → 已出现资源争抢,需进一步定位瓶颈类型
- 1分钟load远高于5/15分钟 → 突发短时压力,可能无需干预
- 1/5/15分钟load持续接近或超过核数 → 系统长期承压,必须查根因
三步快速缩小问题范围
别一上来就top,先用三个命令交叉验证:
- vmstat 1 5:看r(运行队列长度)是否持续>核数,同时观察wa(I/O等待)、si/hi(中断)、cs(上下文切换)是否异常升高
- iostat -x 1:重点关注%util(设备忙时占比)、await(平均I/O响应时间)、r_await/w_await。若%util接近100%且await显著升高,说明磁盘拖慢了整个队列
- free -h && dmesg | grep -i oom:检查可用内存(avail Mem)是否过低,以及内核是否已触发OOM Killer杀进程
区分CPU忙 vs CPU闲着等
top里%Cpu(s)行是破题钥匙:
- us + sy 高(>80%),wa很低 → 真正的CPU计算瓶颈,找高%CPU进程(ps -eo pid,cmd,%cpu –sort=-%cpu | head)
- wa高(>20%),us/sy很低 → CPU空转等I/O,此时top里常看到大量D状态进程,重点查磁盘和存储栈
- sy异常高(>30%) → 内核态耗时多,可能是频繁系统调用、锁竞争、或驱动问题
- si高(>15%) → 软中断密集,常见于高吞吐网络或定时器任务
针对性深挖常见场景
确认方向后,用对应工具收口:
- java服务CPU高:用pidstat -t -p PID 1找高耗线程,再jstack PID | grep ‘0x[0-9a-f]’ -A 5(十六进制线程ID)定位堆栈
- 大量D状态进程:ps aux | awk ‘$8 ~ /D/ {print}’,结合lsof -p PID看它卡在哪个文件或设备上
- 内存型假性高负载:buff/cache虽高但可回收,真正危险信号是avail Mem持续低于100MB或swap used持续增长
- 网络连接堆积:用ss -s看total established、orphan数量;ss -tn state time-wait | wc -l看TIME_WAIT是否异常
基本上就这些。抓准load的本质是“排队长度”,再配合vmstat/iostat/free三板斧定性,后面全是顺藤摸瓜的事。