第9章 磁盘:别拿一个 await 或 util 就宣布磁盘有问题

磁盘分析先看工作负载和排队关系,再判断设备能力,均值指标本身不够用。

本页目录

设备很忙,不等于设备就是根因

第 9 章先拦住一个最常见的直觉:指标一难看,就把问题压成磁盘根因。

磁盘相关问题,至少要分成四件事:

  • 工作负载是什么样
  • 队列是不是在堆
  • 单次服务时间是不是变长
  • 设备后面还有没有控制器、阵列、云盘这类抽象层

这四件事不拆开,await%util 都很会骗人。

先把磁盘问题拆成四类

先按下面这个顺序判断:

1. 先看工作负载像什么

是顺序还是随机,是读多还是写多,是吃吞吐还是吃 IOPS。

2. 再看排队是不是开始堆

慢是因为每个请求本身都慢,还是因为请求先在队列里等了很久。

3. 再看服务时间是不是真的变长

如果单次服务时间确实变长,才更像设备或更下层存储本身出了问题。

4. 最后再看设备后面还有什么抽象

RAID、控制器、SAN、云盘、远端存储都会改写你看到的表象。

别拿高利用率和平均等待时间直接宣布设备根因

最常见的错法有四种:

  • await 一高,就直接说磁盘不行
  • %util 一满,就直接说设备饱和
  • 只看单个设备数字,不看工作负载形状
  • 把阵列、云盘、控制器当成裸设备看

这些错法都少了一步:先分清排队和服务时间。

如果后面挂的是 RAID、SAN、云盘或别的虚拟块设备,%util 的欺骗性会再放大一层。虚拟盘的 %util 到 100% 只说明它在这段时间没闲着,不等于底层所有物理盘都打满,更不等于阵列已经没有继续吞吐的空间。

什么时候更像排队,不像设备变慢

下面这些情况,更像请求在堆,而不是单次设备服务突然变坏:

  • 并发一高,延迟立刻拉长
  • 吞吐没明显掉,但等待快速变大
  • 负载一波动,延迟跟着大起大落
  • 上层写回、批量写或突发流量跟着一起出现

这时候先别急着判设备差,先看是不是队列被打满了。

一个最典型的错法:拿平均等待时间直接定案

现场里很常见:有人看到 await 很高,就说“磁盘就是瓶颈”。

但平均等待时间里,混着很多东西:

  • 请求在队列里等了多久
  • 设备真正服务了多久
  • 不同负载形状被平均到一起
  • 下游抽象层把表象重新包装了多久

所以第 9 章最值钱的地方,不是再给你一个更花的盘指标,而是逼你先把平均值拆开。

%iowait 也是同一类假象。它的意思只是“CPU 恰好闲着,同时有人在等 I/O”,不是“磁盘此刻有多慢”。随便再跑一个吃 CPU 的任务,%iowait 都可能立刻掉下去,但盘的真实状态一点没变。

吞吐、IOPS、排队和服务时间要拆开看

先把吞吐、IOPS、排队、服务时间分开

以后看磁盘问题,先别只盯一个数字。至少同时回答:

  1. 这更像吞吐受限,还是 IOPS 受限。
  2. 这更像队列积压,还是单次服务时间变长。
  3. 这是不是被阵列、控制器、云盘重新包装过的表象。

`await` 和 `%util` 只能当线索

看到这两个数字难看时,先把它们当“值得继续看”的信号,不要当最终结论。

抽象层一多,就优先保留对照证据

云盘、SAN、阵列环境里,优先保留这些证据:

  • 前后变化
  • 同类实例对照
  • 不同卷或不同节点对照
  • 工作负载变化和延迟变化的对应关系

这比死盯单一设备数字更有用。

本机设备分清以后,再看跨机器链路

第 9 章解决的是“本机块设备和存储抽象怎么看”。第 10 章接着进入最容易被单边证据带偏的领域:网络。