☰ 第 09 章 · 磁盘:看懂设备饱和与延时
COURSE SOURCES

参考来源与版权说明

仅作来源说明 · 不提供原始资料下载
查看全部来源说明
01
START HERE

这章解决什么问题

磁盘慢可能是设备本身慢,也可能是内核排队、文件系统放大、控制器限速、错误重试或多租户竞争。单看 IOPS、iowait 或使用率无法区分这些情况。本章建立从块 I/O 请求时间到设备响应的模型,并用负载形态、延时分布和单次事件把“忙”与“伤害应用”连接起来。

02
SECTION 02

五条核心结论

  1. 块 I/O 请求时间由排队等待和设备侧响应共同构成;分析时必须说明测量的起止层级。
  2. 使用率表示设备忙碌时间,饱和度表示排队工作。100% 使用率可能只有轻微排队,也可能已经形成巨大队列。
  3. IOPS 不能脱离读写比、I/O 大小、随机/顺序、并发度与缓存状态比较;同样的 IOPS 可以代表完全不同的负载。
  4. 平均延时会掩盖缓存命中/未命中的双峰和少数超慢 I/O,直方图、热图或逐事件记录更可靠。
  5. 应用是否同步等待比磁盘是否忙更重要。先证明设备延时进入关键路径,再考虑调度、缓存、硬件或扩容。
03
SECTION 03

核心模型与关键指标

从内核看,一个块请求先创建并进入队列,随后发给设备,最后由完成事件结束。等待时间是进入内核队列到发出设备的时间;设备响应时间是发出到完成的时间;两者之和才是完整块 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重试、介质和控制器健康错误可让设备“还能用但很慢”
04
SECTION 04

诊断步骤

  1. 固定故障时间窗,先查内核日志与设备健康,排除错误、降级阵列、重建和固件异常。
  2. 用 iostat 按设备查看读写吞吐、IOPS、await、队列与使用率,找出离群设备和不均衡。
  3. 用 PSI 与 pidstat 判断哪些进程真的因 I/O 阻塞;如果应用采用异步 I/O,要回到事务时间线验证影响。
  4. 归纳负载:读/写比例、请求大小、随机/顺序、同步比例、突发与并发度。没有这些背景,阈值没有意义。
  5. 用 biolatency 看分布;若有尾部或多峰,再用 biosnoop 记录设备、进程、类型、大小和单次延时。
  6. 对齐文件系统与块设备延时。如果上层慢而设备层快,问题更可能在锁、队列、元数据或资源控制;若两层同步变慢,再查设备、控制器与底层存储。
05
SECTION 05

常用工具与命令

以下均为只读命令;列名取决于 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 控制器而异,应按厂商文档选择,切勿把测试或固件操作混入只读排查。

06
SECTION 06

如何解读结果

await 上升且 aqu-sz 同时增长,说明排队正在累积;如果 %util 也接近上限,设备或其背后的服务中心很可能饱和。但由多盘阵列支持的虚拟设备即使显示 100%,仍可能有并行余量;反过来,控制器回写缓存也可能让前台统计显得很轻,而后端设备已繁忙。

r_await 高而 w_await 低,可能是读取排在异步写刷新之后;必须拆开读写。areq-sz 很小、合并率低且随机访问多,通常偏 IOPS/延时受限;大顺序 I/O 更可能受吞吐量限制。iowait 下降不代表磁盘变快:只要 CPU 同时有别的任务可运行,iowait 就会下降。最终应以应用阻塞时间和块延时分布闭环。

错误应优先于利用率检查,因为重试中的设备可能仍返回成功,却把尾部延时拉长。单盘离群而同组其他盘正常,优先查介质、固件、链路和重建;所有盘的吞吐在同一水平封顶,则还要怀疑控制器或总线。比较前后结果时要保持请求大小、并发度和缓存状态一致,否则“延时改善”可能只是负载变轻。

07
SECTION 07

常见误判

  • 用一个 IOPS 数字比较不同设备,却不说明方向、大小、随机性和并发度。
  • 把 iowait 当作磁盘利用率;它只是 CPU 空闲时间的一种分类。
  • 把 60% 或 10ms 等经验值当作通用红线,忽略设备类型、负载和服务目标。
  • 只看平均 await,漏掉数百毫秒的少量尾部事件。
  • 把虚拟磁盘的 %util 当作底层物理盘真实利用率。
  • 直接运行写入型基准验证生产磁盘;这会改变数据和负载,必须在隔离环境、明确范围后进行。
08
SECTION 08

五分钟自测

  1. 块请求总时间由哪两部分组成?答:内核排队等待时间与发给设备后的响应时间。
  2. %util 为 100% 能说明队列有多长吗?答:不能,还要看队列与延时。
  3. 为什么 5000 IOPS 不一定比 1000 IOPS 更快?答:I/O 大小、方向、随机性和并发度可能不同。
  4. iowait 降低是否证明磁盘改善?答:否,CPU 有其他工作时也会降低。
  5. 哪种图最容易发现双峰延时?答:延时直方图或热图。
09
SECTION 09

本章小结

磁盘分析的重点是把负载、排队和性能结果分开,再证明设备延时是否阻塞业务。先用低开销统计缩小范围,再以分布和单次事件解释尾部;硬件调优或扩容应建立在清楚的读写负载与容量上限之上。

10
SECTION 10

来源定位

  • PDF 474-499 页:磁盘时间模型、延时尺度、缓存、访问模式、使用率、饱和度与 I/O 栈。
  • PDF 500-508 页:USE、负载特征、延时分析、静态检查、微基准与伸缩方法。
  • PDF 509-537 页:iostat、sar、PSI、pidstat、perf、BPF、控制器与 SMART 工具。
  • PDF 538-548 页:延时可视化、实验、调优、练习与参考资料。
📝
QUICK CHECK

章节测验

5 道单选题。答错有解析,答对看来源页码。

单选题 · 第 1/5
已答 0/5

从内核块 I/O 视角看,一个请求的完整时间通常由哪两部分组成?

⚡ 用本章题目开始计时冲刺