Linux 负载高但 CPU 不忙怎么查:从 D 状态、iowait 到磁盘队列的排查顺序
凌晨的订单导出开始变慢,接口 CPU 图却只在 20% 左右。值班同学看到 uptime 的 1 分钟负载从 1.8 拉到 18,第一反应是“机器算力不够”。随后几次采样却发现,真正积压的不是计算,而是一批进程卡在 D 状态,磁盘等待把负载抬了起来。Linux 的负载高并不等于 CPU 一定忙,先分清可运行任务和不可中断 I/O 等待,排查会快很多。
负载高不等于 CPU 满负载,统计规则里同时包含正在排队抢 CPU 的任务,以及卡在不可中断 I/O 等待的任务,后者哪怕不占 CPU 时间也会把负载数值拉高。
uptime和/proc/loadavg的负载包含可运行任务,也包含不可中断等待中的任务,不能只拿它和 CPU 使用率做一一对应。vmstat的r、b、wa要连续观察;单次快照很容易把瞬时波动当成根因。- 发现
D状态后先找等待点和对应设备或远端挂载,再决定限流、错峰、修复存储链路还是扩大容量。
先确认:高负载不一定是 CPU 瓶颈
先取两份相隔几秒的样本,不要只截一张监控图就下结论:
uptime cat /proc/loadavg vmstat 1 5
uptime 会给出最近 1、5、15 分钟的负载。/proc/loadavg 除了这三个数字,还能看到当前可运行任务数和系统任务总数。关键区别在于:负载不只看正在使用或等待 CPU 的任务,也会统计处在不可中断等待中的任务;后者常和磁盘、网络文件系统或块设备访问有关。
因此,8 核机器上看到负载 16 并不能直接推出“CPU 已经跑满两倍”。若同一时段 us、sy 都不高,wa 却连续上涨,或者 b 长时间大于 0,就该把检查方向从算力转到等待链路。
把现场按时间线留住,别让下一轮波动覆盖证据
这次导出故障里,第一分钟只看到了负载上升;第三分钟才看到 b 增加;第五分钟用进程状态定位到同一批导出任务。把每一轮采样留在同一份值班记录里,后面的判断才有前后关系。
| 时间点 | 观察结果 | 当时的判断 | 下一步 |
|---|---|---|---|
| 00:12 | 1 分钟负载快速升高,CPU 未满 | 暂不扩容 | 连续采样 vmstat |
| 00:14 | b 连续非零,wa 上升 | 存在 I/O 等待信号 | 列出 D 状态进程 |
| 00:16 | 导出任务集中等待同一挂载路径 | 工作集撞到同一存储路径 | 暂停批量投放并查设备指标 |
| 00:24 | 积压消退,负载回落 | 限流有效,但根因仍需修复 | 补队列上限与慢盘告警 |
表里的时间和数字只是演示记录方式,不是可套用的阈值。不同内核、磁盘类型、挂载方式和业务批量都会改变波动形态;真正有价值的是让负载、等待比例、进程状态和业务动作落在同一时间轴上。

第二轮采样:用 r、b、wa 把猜测缩小
vmstat 1 5 的价值不在于背每一列,而在于看这三类信号是否同向变化:
r偏高且 CPU 的用户态或内核态长期饱和,才更像是计算任务排队。b持续出现,表示有任务进入不可中断睡眠,值得继续看 I/O 和进程状态。wa连续升高时,CPU 时间正花在等待 I/O 完成;它不是设备故障的证明,却是继续查看设备、挂载和队列的强信号。
这里容易踩一个坑:把某一秒的 wa=0 当成排除依据。批量任务常以突发方式提交读写,单次采样可能刚好落在空档。更稳妥的是在业务高峰的完整窗口采 30 到 60 秒,并把采样结果和导出队列长度、请求耗时对齐。
看到 D 状态后,先把等待落到具体进程
ps 的 STAT 列能帮助筛出进程状态。D 通常表示不可中断睡眠,常见于 I/O 等待,但它不是“磁盘已经坏了”的结论。先把 PID、父进程、命令名和等待位置放在一起看:
ps -eo state,pid,ppid,comm,wchan:32 --sort=state | awk '$1 ~ /^D/ {print}'
cat /proc//wchan
cat /proc//stack
wchan 只是辅助线索。它能告诉你任务正阻塞在什么内核等待点附近,却不能单独替代设备、文件系统或远端存储的证据。若多个进程同时围绕同一挂载目录、同一块盘或同一个文件服务等待,再结合设备延迟、队列长度和应用日志,就能从“机器很慢”收敛到具体依赖。

别把所有 D 状态都归咎于本地磁盘
同样是 D,来源可能完全不同:本地块设备拥塞、网络文件系统响应慢、容器卷的后端存储延迟、日志目录被高并发写入,甚至某个驱动或文件系统路径异常。先找共同的文件路径、设备名、挂载点和调用来源,再根据实际依赖决定下一步。
现场处置时我更愿意先减小新增压力,而不是直接终止所有等待中的任务。比如把导出投放改成有限并发、暂停非关键的批量归档、把日志写入从同步主链路里拆开。这样做不能修好存储,却能避免等待队列继续增长,同时保留足够的证据给后续定位。
修复动作要和证据对应,别只加机器
| 证据组合 | 更可能的方向 | 优先动作 |
|---|---|---|
r 高、CPU 长时间饱和、wa 低 | 计算或调度拥塞 | 拆热点、限制并发、评估 CPU 容量 |
b 与 wa 同时上升,D 状态集中 | I/O 路径等待 | 查设备延迟、挂载与批量写入策略 |
| D 状态只出现在远端目录访问 | 网络或远端文件服务 | 核对链路、服务端负载和重试策略 |
| 负载短时尖峰,队列很快自行消退 | 突发批处理叠加 | 错峰、分批、设置投放上限 |
给存储扩容有时是正确动作,但应该放在证据之后。若真正问题是凌晨多个任务同时扫同一目录,单纯把机器换大只会让更多任务更快冲到同一个瓶颈。先把排队入口收住,再修复慢路径,最后回放一次接近真实的批量窗口,才能确认处理是否有效。
把这条排查链路变成可复用的告警
防复发不必一开始就堆很多指标。针对这类场景,至少把 1 分钟负载、CPU iowait、不可中断进程数量、关键挂载延迟和导出队列长度放进同一告警面板。告警触发后先自动保存 uptime、vmstat 和 D 状态进程清单,值班人员拿到的是时间一致的证据,不是事后才想起去跑的命令。
第二个改动是给批量任务设置明确边界:每次投放多少、并发上限是多少、超过多长时间要暂停、失败后从哪里续跑。负载数字只是表象,真正能削弱事故影响的是把工作量和等待时间都限制在可控范围内。
相关问题
load average 超过 CPU 核数就一定要扩容吗?
不一定。先区分负载里的任务是在抢 CPU,还是在等待 I/O。CPU 未满而 D 状态和 iowait 上升时,扩容计算资源通常不是第一选择。
ps 里有 D 状态进程可以直接杀掉吗?
不要把终止进程当成定位手段。不可中断等待中的进程未必能立即退出,贸然处理还可能破坏业务现场。先记录 PID、等待点、挂载路径和设备状态,再按业务窗口处置。
iowait 很低,是不是就能排除存储问题?
不能完全排除。采样窗口太短、压力集中在少数任务或等待来自远端依赖时,都可能让单个 CPU 指标不显眼。结合 D 状态、设备延迟和业务路径判断更稳。
容器里的负载高和宿主机负载高该看哪一个?
先明确告警来自哪个命名空间和监控口径,再同时核对容器的工作负载、卷挂载和宿主机的 I/O 情况。只看其中一边容易漏掉共享存储或节点级竞争。
核对资料
Go 1.25 sync.WaitGroup.Go 怎么用:少写 Add/Done,但别忽略 panic 和复用边界
- 上一篇
- Go 1.25 sync.WaitGroup.Go 怎么用:少写 Add/Done,但别忽略 panic 和复用边界
- 下一篇
- Go errgroup.SetLimit 怎么用:批量调用下游时限制并发、保留取消与错误
-
- 文章 · linux | 9小时前 | Linux · ssh · 运维 · 安全加固 · Linux SSH sshd_config 密钥登录 AllowUsers
- Linux SSH 仅允许密钥登录怎么做:账户白名单、配置检查和可回退发布
- 257浏览 收藏
-
- 文章 · linux | 10小时前 | Linux · 安全 · 运维 · 服务加固 · Linux服务单元 PrivateTmp NoNewPrivileges ReadWritePaths 服务加固
- Linux 服务单元怎么加固:只读根、私有临时与可写路径白名单
- 259浏览 收藏
-
- 文章 · linux | 5天前 | Linux · nginx · HTTP响应头 · 浏览器安全 · SharedArrayBuffer · 跨源隔离 · Linux Nginx SharedArrayBuffer COOP COEP 跨源隔离
- Linux Nginx 配置 COOP 和 COEP:让 SharedArrayBuffer 可用前先做这 4 项检查
- 111浏览 收藏
-
- 文章 · linux | 5天前 | 容器 · 内存 · Linux · 运维 · Linux journalctl 内存排查 cgroup OOM Killed
- Linux 服务器进程被 OOM Killed 怎么排查:从内核日志到 cgroup 内存上限的完整流程
- 316浏览 收藏
-
- 文章 · linux | 1星期前 | Linux · Path · sudo · 运维排查 · 权限配置 · Linux sudo path 绝对路径 command not found secure_path visudo
- Linux sudo 提示 command not found 怎么办:从 secure_path 到绝对路径排查
- 440浏览 收藏
-
- 文章 · linux | 1星期前 | [] · []
- Linux 提示 Permission denied 怎么处理:别急着 chmod 777,先看身份、权限和路径
- 476浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4554次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4214次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4175次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4396次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4347次使用
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- 在Linux系统中安装Go语言的详细教程
- 2022-12-29 402浏览

