Linux 负载很高但 CPU 不高,问题可能卡在哪里?

先别被负载数字吓到

很多站长看到 Linux 面板里 load average 飙到 8、12 甚至更高,第一反应就是“CPU 爆了”。但负载不是 CPU 使用率,它描述的是一段时间内正在运行、等待运行,以及处在不可中断等待状态的任务数量。换句话说,负载高只能说明系统排队的人变多了,至于队伍为什么变长,还要继续拆开看。

真正容易误判的场景,是 CPU 使用率并不高,网站却开始卡顿,或者面板只显示“负载过高”却没有明显的 CPU 100%。这时如果直接重启,短时间可能看起来恢复了,但根因还在:下一次备份、爬虫、慢查询、磁盘写入或外部接口波动出现时,负载仍然会回来。

判断这类问题,核心不是追着一个数字跑,而是把 load average、CPU、磁盘 I/O、内存、进程状态和业务日志放在同一条时间线上看。只要排查顺序正确,很多“玄学卡顿”都能变成可解释的问题。

load average 到底在数什么

在 Linux 里,load average 通常显示 1 分钟、5 分钟、15 分钟三个平均值。它不是百分比,也不是“CPU 占用率”。如果一台 4 核服务器的 1 分钟负载是 4 左右,通常意味着短时间内任务排队刚好接近 CPU 并行能力;如果长期维持在 12,就说明系统里有大量任务在等待 CPU 或等待某些内核资源。

这里最关键的一点是:负载里的任务不只包括正在抢 CPU 的进程,也包括 D 状态,也就是不可中断睡眠状态的进程。常见原因是磁盘 I/O、网络文件系统、块设备、某些驱动或存储链路响应慢。于是就会出现一种很典型的现象:CPU 看起来不忙,负载却很高。

所以看到负载高时,不要只问“CPU 为什么没满”,而要问“有哪些任务在排队,它们到底卡在 CPU、磁盘、网络、锁等待,还是外部依赖上”。这个问题一换,排查方向就清楚很多。

先看三个数字的变化趋势

负载的三个时间窗口很有用。1 分钟高、5 分钟低、15 分钟更低,通常代表刚刚出现了短时峰值;1 分钟、5 分钟、15 分钟一起高,说明问题持续了一段时间;1 分钟已经降下来但 15 分钟仍然高,可能是高峰刚过去,系统正在恢复。

排查时可以先执行 uptimetop 看 load average,再结合业务时间点判断:是否刚好在备份、日志切割、定时任务、采集任务、爬虫高峰、营销活动或搜索引擎抓取时间附近。如果时间点高度重合,优先从这些任务入手,比盲目扩容更有效。

Linux 服务器负载监控与排查示意图
负载高时要把 CPU、I/O、进程状态和业务时间线一起看,而不是只盯着一个 load 数字。

还要结合 CPU 核心数看负载。2 核机器负载 4 和 16 核机器负载 4,含义完全不同。新手最容易把负载数字当成固定阈值,其实它必须放在 CPU 核数、业务类型和持续时间里理解。

CPU 不高时,优先怀疑 I/O 等待

如果 load 很高,但 top 里 CPU idle 仍然不少,或者 wa 这个 iowait 指标明显升高,就要优先看磁盘 I/O。很多网站的卡顿并不是算力不够,而是数据库、日志、备份、图片处理或缓存落盘把磁盘拖慢了。

可以用 iostat -x 1 查看磁盘的 %utilawaitr/sw/s 等指标;用 iotoppidstat -d 1 找到正在大量读写的进程。如果某个 MySQL、PHP、备份脚本、日志压缩进程持续占用 I/O,就说明负载高的主因可能不是 CPU,而是磁盘排队。

在云服务器里,还要注意云盘性能上限。CPU 和内存看起来都够,但云盘 IOPS、吞吐或延迟达到瓶颈时,应用照样会慢。尤其是低配实例、共享型云盘、突发性能盘,一旦积分耗尽或写入高峰到来,就容易出现“CPU 很闲但系统很卡”的感觉。

再看进程状态和队列来源

排查负载高时,ps -eo state,pid,ppid,comm,wchan:32 --sort=state 这类命令很有价值。它能帮助你看到哪些进程处在 R 状态,哪些处在 D 状态。R 状态多,通常说明 CPU 调度压力大;D 状态多,则更像 I/O、存储或内核等待。

如果是 Web 站点,还要同时看 Nginx、PHP-FPM、MySQL、Redis、队列任务和定时脚本。比如 PHP-FPM 子进程堆积,可能是慢 SQL、外部接口超时、文件锁等待或后端服务响应慢;MySQL 线程堆积,可能是慢查询、索引缺失、锁等待或磁盘写入压力;Nginx 连接数异常,则可能是爬虫、攻击流量或上游响应过慢。

排查过程中不要只截一张图。负载问题经常是动态的,建议连续观察几分钟,把命令输出、访问日志和错误日志的时间点对齐。只看某一秒,很容易把结果看反。

什么时候该优化,什么时候该扩容

如果负载高只在备份、日志压缩、批处理任务运行时出现,而且业务响应没有明显下降,可以先调整任务时间、降低并发、限制 I/O 或把重任务挪到低峰期。很多小站真正需要的不是更高配置,而是把定时任务从访问高峰里拿出来。

如果负载高伴随页面响应变慢、数据库慢查询增加、PHP-FPM 队列堆积、磁盘 await 持续升高,就要先定位瓶颈,再决定优化方向。CPU 瓶颈可以考虑代码优化、缓存和升级核心数;磁盘瓶颈要看云盘类型、数据库写入、日志策略和备份方式;网络瓶颈则要结合带宽、连接数、CDN 和回源链路。

对于业务已经稳定增长的网站,选择服务器时也要看场景。静态内容多、访问分布广,可以优先考虑 CDN 和缓存;数据库写入明显,磁盘性能比单纯 CPU 更重要;如果是中小型官网、轻量应用或测试环境,速维云轻量云 这类带有香港 500M 大带宽、续费同价和年付流量翻倍特点的方案,更适合作为入门或轻量业务底座,但仍然要配合监控、备份和日志策略使用。

一套更稳妥的排查顺序

遇到负载高但 CPU 不高,可以按这个顺序处理:第一步看 uptimetop,确认负载持续时间和 CPU 各项指标;第二步看 iostatiotop,确认是否存在磁盘等待;第三步看 ps 进程状态,区分 R 状态和 D 状态;第四步查 Web、数据库和系统日志,把异常时间点对齐;第五步再决定是优化配置、调整任务、清理异常进程,还是升级实例规格。

如果业务还在正常响应,不建议第一时间重启。重启会抹掉一部分现场信息,也可能让你错过真正的瓶颈证据。更稳的做法是先保存关键输出,例如 top -b -n 1iostat -x 1 5ps、慢查询日志和 Nginx 错误日志,再根据证据操作。

当然,如果服务器已经无法登录、业务完全不可用,或者负载持续升高并触发 OOM、磁盘写满、数据库连接耗尽,就要按应急流程处理:先止血恢复服务,再回头分析日志和监控。运维判断从来不是死守某个命令,而是在风险、证据和恢复速度之间做平衡。

别让负载数字替你做决定

load average 是一个很有价值的信号,但它不是结论。它提醒你系统里有人在排队,却不会直接告诉你队伍为什么变长。把它和 CPU、I/O、内存、进程状态、日志、业务时间线一起看,才能判断服务器到底是忙、卡、等,还是被某个任务拖住了。

对网站运维来说,最怕的不是负载突然升高,而是每次都靠重启解决。负载问题只要被记录、拆解和复盘,下一次就能提前规避:定时任务避开高峰,备份限速,数据库慢查询优化,日志轮转合理配置,云盘和带宽按业务增长提前规划。这样服务器才不是“出了问题才救火”,而是逐渐变成可预期、可维护的基础设施。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享