服务器磁盘 IO 高怎么排查?iowait、延迟与读写来源定位

2026-09-19

直接答案:先确认用户慢是否与磁盘延迟同一时间发生,再用iostat看设备利用、await、队列和吞吐,用pidstat/iotop找进程,最后把PID追到文件、SQL、日志或任务。iowait高说明CPU在等待块IO,但低iowait也不能证明磁盘正常;高并发、异步IO和多核会改变比例。不要在生产盘盲跑写压测或直接删除大文件。

本文于 2026 年 9 月按官方文档核对。命令和配置只展示判断方法,不代表可在任意生产环境直接复制;发行版、云平台、网络拓扑和业务写入不同,执行前必须确认对象、权限、备份和带外恢复入口。

专属资产:设备—进程—业务三证据表

现象/阶段 要判断什么 需要的证据 安全边界
await/p99高 单次IO等待长 设备与云盘指标 先查饱和/故障/限额
队列持续增长 到达量超过处理量 avgqu与应用积压 限并发或扩性能
吞吐高延迟稳 大块顺序任务 备份/复制时间线 调度到低峰
IOPS高吞吐低 小块随机访问 数据库/小文件 优化索引与缓存
写入低但盘忙 刷盘/快照/底层活动 fsync、云监控、宿主 保留证据联系平台

这张表要求每个结论至少有两个相互独立的证据,例如“服务监听+外部连接”“设备延迟+业务耗时”“备份文件+隔离恢复”。单一控制台绿灯、单次截图或一个User-Agent都可能误导,不能作为完成依据。

为什么常见的一键处理容易失败

运维问题通常跨越控制台、操作系统、应用和外部依赖。重启、全放行、清缓存或重装会改变多个变量,并可能清掉最有价值的现场。正确顺序是先定时间线和影响范围,再确认最靠近故障的证据层,最后做可回滚的最小动作。

对于有数据库、订单、表单、队列或用户上传的站点,还要先判断当前是否仍在写入。回滚旧快照、切回旧主机或恢复旧数据库前,必须处理变更期间的新数据;否则技术状态恢复了,业务数据却可能倒退。

六步安全执行流程

1. 确认对象与基线

记录故障起止、受影响接口、p95/p99和5xx,再用vmstat/iostat连续采样;单张%util截图无法证明根因,现代并行设备也不宜只靠100%利用率判断。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

2. 保留恢复入口

查看每个块设备的读写量、IOPS、await、队列和错误,映射到实际挂载点、LVM、RAID或云盘;避免把系统盘和数据盘指标混在一起。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

3. 取得直接证据

用pidstat -d、iotop或cgroup指标找持续读写进程,记录PID、用户、启动时间和命令;再用lsof、数据库状态或应用日志定位文件与请求。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

4. 只做最小变更

按时间线检查备份、压缩、日志轮转、数据库checkpoint、快照、容器层和临时文件。一次只暂停可安全中断的任务,不要直接kill数据库。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

5. 验证业务与副作用

短期可限并发、错峰、降低日志噪声或增加缓存;长期应优化SQL/索引、批量写入、数据布局,或选择满足延迟和IOPS的存储。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

6. 重启或跨峰复验

修复后用相同负载重跑,比较设备p95/p99、队列、应用尾延迟和错误;跨过一次备份或高峰周期,并确认没有把数据持久性换成速度。

每一步都要写明执行时间、操作者、原始结果和预期;涉及删除、覆盖、网络规则或服务停止时,先确认备份与回滚命令。

不应直接照做的五种处理

  • 只看iowait百分比
  • 生产数据库盘直接fio写测
  • kill最高IO进程不查业务
  • 关闭fsync换取表面速度
  • 清日志导致调查证据丢失

这些做法并非永远错误,而是缺少适用条件。若确需执行,应在变更单中写清目标、影响范围、停止阈值、备份位置、回滚命令和预计恢复时间;高风险动作先在副本或小流量上演练。

回滚触发与数据边界

出现核心写入失败、持续5xx、管理员入口丢失、数据校验不一致、尾延迟越过停止阈值或监控失明时,应停止继续扩大变更。回滚前确认新旧环境各自产生了哪些写入,保留日志和配置差异;回滚后用相同请求和同一时间窗口重测,而不是只看首页恢复。

如果故障根因尚未确认但必须先恢复服务,可以采用限流、摘除单节点、恢复上一配置或临时切流等缓解措施,并明确它只是临时处置。恢复后仍要完成根因分析和复发验证,不能把“重启后正常”写成最终原因。

验收清单

  • [ ] 设备与挂载映射正确
  • [ ] 连续采样覆盖故障
  • [ ] 高IO进程可解释
  • [ ] 业务时间线一致
  • [ ] 无磁盘错误
  • [ ] 数据持久性未削弱
  • [ ] 同负载延迟改善
  • [ ] 高峰和备份可共存

验收应由另一位维护者按记录复现至少一项关键检查,并覆盖重启、真实高峰或等价受控负载。所有失败项都记录实际值与时间,不使用“基本正常”“应该没问题”作为关闭条件。

相关资料与隔离测试入口

站内可继续参考磁盘满清理、CPU100排查、硬盘容量与IOPS。需要搭建副本验证配置时,可查看美国轻量云和美国弹性云服务器的实时规格;先确认库存、价格和适用条件,不把测试环境当备份或生产容灾。

常见问题

%util 100%一定是磁盘满负荷吗?

对传统单队列设备常是重要信号,但并行存储与统计实现会影响解释。应同时看await、队列、吞吐、IOPS和应用延迟。

iowait低就能排除磁盘问题吗?

不能。大量CPU工作、异步IO或多核会稀释比例,单个关键请求仍可能被高尾延迟拖慢。

加内存能解决IO高吗?

缓存不足导致重复读时可能有效,但同步写、备份、扫描或设备故障未必改善。先确认读写来源。

怎样安全使用fio?

只在隔离盘或专用测试文件上,声明块大小、读写、iodepth和runtime;不要对含生产数据的裸设备执行破坏性测试。

数据库IO高应该先加盘吗?

先查慢SQL、索引、全表扫描、临时表和checkpoint。若优化后真实工作集仍超过存储能力,再扩性能或拆分。

官方参考资料

最近更新