参考来源与版权说明
这章解决什么问题
磁盘慢可能是设备本身慢,也可能是内核排队、文件系统放大、控制器限速、错误重试或多租户竞争。单看 IOPS、iowait 或使用率无法区分这些情况。本章建立从块 I/O 请求时间到设备响应的模型,并用负载形态、延时分布和单次事件把“忙”与“伤害应用”连接起来。
五条核心结论
- 块 I/O 请求时间由排队等待和设备侧响应共同构成;分析时必须说明测量的起止层级。
- 使用率表示设备忙碌时间,饱和度表示排队工作。100% 使用率可能只有轻微排队,也可能已经形成巨大队列。
- IOPS 不能脱离读写比、I/O 大小、随机/顺序、并发度与缓存状态比较;同样的 IOPS 可以代表完全不同的负载。
- 平均延时会掩盖缓存命中/未命中的双峰和少数超慢 I/O,直方图、热图或逐事件记录更可靠。
- 应用是否同步等待比磁盘是否忙更重要。先证明设备延时进入关键路径,再考虑调度、缓存、硬件或扩容。
核心模型与关键指标
从内核看,一个块请求先创建并进入队列,随后发给设备,最后由完成事件结束。等待时间是进入内核队列到发出设备的时间;设备响应时间是发出到完成的时间;两者之和才是完整块 I/O 请求时间。现代设备内部也有队列,因此旧式“服务时间”推算对可并行设备往往不准。
| 指标 | 含义 | 解读重点 |
|---|---|---|
| IOPS、kB/s 或 MB/s | 操作频率与吞吐量 | 与 I/O 大小、方向一起看 |
| await、r_await、w_await | 含排队的平均响应时间 | 读写应拆开,平均值会遮住尾部 |
| aqu-sz | 活动及排队请求的平均数量 | 持续升高提示饱和 |
| %util | 统计区间内设备忙碌比例 | 虚拟设备和并行设备需谨慎解释 |
| areq-sz、合并率 | 平均请求大小与合并情况 | 帮助判断小随机或大顺序 I/O |
| PSI I/O、进程 iodelay | 任务因 I/O 停顿的程度 | 更接近对应用的影响 |
| 错误与 SMART | 重试、介质和控制器健康 | 错误可让设备“还能用但很慢” |
诊断步骤
- 固定故障时间窗,先查内核日志与设备健康,排除错误、降级阵列、重建和固件异常。
- 用 iostat 按设备查看读写吞吐、IOPS、await、队列与使用率,找出离群设备和不均衡。
- 用 PSI 与 pidstat 判断哪些进程真的因 I/O 阻塞;如果应用采用异步 I/O,要回到事务时间线验证影响。
- 归纳负载:读/写比例、请求大小、随机/顺序、同步比例、突发与并发度。没有这些背景,阈值没有意义。
- 用 biolatency 看分布;若有尾部或多峰,再用 biosnoop 记录设备、进程、类型、大小和单次延时。
- 对齐文件系统与块设备延时。如果上层慢而设备层快,问题更可能在锁、队列、元数据或资源控制;若两层同步变慢,再查设备、控制器与底层存储。
常用工具与命令
以下均为只读命令;列名取决于 sysstat 和内核版本,BCC 工具可能需要管理员权限。
iostat -dxz 1 5
sar -d 1 5
cat /proc/pressure/io
pidstat -d 1 5
biolatency 10 1
biosnoop
smartctl --all /dev/nvme0n1
dmesg --ctime | grep -i -E "i/o error|nvme|scsi|ata|reset|timeout"
iostat 的第一组通常是自启动以来的平均值,分析当前问题应看后续区间。新版本可提供读、写、丢弃和刷新拆分字段;旧版本字段较少。smartctl 的设备路径和参数因 SATA、SAS、NVMe、RAID 控制器而异,应按厂商文档选择,切勿把测试或固件操作混入只读排查。
如何解读结果
await 上升且 aqu-sz 同时增长,说明排队正在累积;如果 %util 也接近上限,设备或其背后的服务中心很可能饱和。但由多盘阵列支持的虚拟设备即使显示 100%,仍可能有并行余量;反过来,控制器回写缓存也可能让前台统计显得很轻,而后端设备已繁忙。
r_await 高而 w_await 低,可能是读取排在异步写刷新之后;必须拆开读写。areq-sz 很小、合并率低且随机访问多,通常偏 IOPS/延时受限;大顺序 I/O 更可能受吞吐量限制。iowait 下降不代表磁盘变快:只要 CPU 同时有别的任务可运行,iowait 就会下降。最终应以应用阻塞时间和块延时分布闭环。
错误应优先于利用率检查,因为重试中的设备可能仍返回成功,却把尾部延时拉长。单盘离群而同组其他盘正常,优先查介质、固件、链路和重建;所有盘的吞吐在同一水平封顶,则还要怀疑控制器或总线。比较前后结果时要保持请求大小、并发度和缓存状态一致,否则“延时改善”可能只是负载变轻。
常见误判
- 用一个 IOPS 数字比较不同设备,却不说明方向、大小、随机性和并发度。
- 把 iowait 当作磁盘利用率;它只是 CPU 空闲时间的一种分类。
- 把 60% 或 10ms 等经验值当作通用红线,忽略设备类型、负载和服务目标。
- 只看平均 await,漏掉数百毫秒的少量尾部事件。
- 把虚拟磁盘的 %util 当作底层物理盘真实利用率。
- 直接运行写入型基准验证生产磁盘;这会改变数据和负载,必须在隔离环境、明确范围后进行。
五分钟自测
- 块请求总时间由哪两部分组成?答:内核排队等待时间与发给设备后的响应时间。
- %util 为 100% 能说明队列有多长吗?答:不能,还要看队列与延时。
- 为什么 5000 IOPS 不一定比 1000 IOPS 更快?答:I/O 大小、方向、随机性和并发度可能不同。
- iowait 降低是否证明磁盘改善?答:否,CPU 有其他工作时也会降低。
- 哪种图最容易发现双峰延时?答:延时直方图或热图。
本章小结
磁盘分析的重点是把负载、排队和性能结果分开,再证明设备延时是否阻塞业务。先用低开销统计缩小范围,再以分布和单次事件解释尾部;硬件调优或扩容应建立在清楚的读写负载与容量上限之上。
来源定位
- PDF 474-499 页:磁盘时间模型、延时尺度、缓存、访问模式、使用率、饱和度与 I/O 栈。
- PDF 500-508 页:USE、负载特征、延时分析、静态检查、微基准与伸缩方法。
- PDF 509-537 页:iostat、sar、PSI、pidstat、perf、BPF、控制器与 SMART 工具。
- PDF 538-548 页:延时可视化、实验、调优、练习与参考资料。
章节测验
共 5 道单选题。答错有解析,答对看来源页码。