转速从 5400 提到 15000,接近三倍,IOPS 只从 71 涨到 95,涨幅 34%。因为寻道那 8.5 毫秒一动不动——厂商能在转速上做文章,却改不了机械臂要走路这件事。
8.1 拆出了三笔开销,这一节回答一个很实际的问题:花钱买更快的盘,能买到什么,买不到什么。
一、转速只决定旋转那一笔
平均旋转等待 = 30000 ÷ 转速(毫秒)。7200 转/分 → 4.17 毫秒;15000 转/分 → 2.00 毫秒。 注意这个公式的来历:一分钟 60000 毫秒转 RPM 圈,一圈就是 60000 ÷ RPM 毫秒;平均等半圈,再除以 2。 所以转速翻三倍,旋转等待缩到三分之一。但它在 12.69 毫秒里只占 4.17——缩到 2 毫秒,总共也只省下 2.17 毫秒。
二、提三倍转速,只换来 34%
Demo 79 把这笔账算清楚了。 5400 转 14.08 毫秒(71 IOPS),15000 转 10.53 毫秒(95 IOPS)。转速提了 2.8 倍,IOPS 只涨了 34%。 原因一句话:寻道那 8.5 毫秒一直没变,而它是三笔里最贵的一笔。你优化了最便宜的那一笔。 这是个很普遍的规律:总时间 = 各部分之和,把其中最小的一项干掉,总时间几乎不动。要提速,得先看清【哪一项最大】。 顺便一个反例:如果完全不寻道(顺序读),转速越高收益越明显——因为这时候旋转与传输成了全部。同一条优化在不同负载下价值完全不同。
三、想快,只有减少寻道次数
既然寻道是大头,那就想办法少寻。三条路。 ① 把随机变成顺序:排序、批量、预读。代价是要多占内存缓冲,而且会拉长单个请求的响应时间。 ② 加缓存:把重复访问挡在内存里,根本不碰盘。代价是内存钱,以及命中率不可能 100%。 ③ 换介质:SSD 没有机械臂,寻道这一笔直接归零。代价是单位容量贵、写入寿命有限。 三条路对应三种完全不同的思路:改访问模式、加中间层、换物理原理。现代系统里三条同时在用。
四、换介质之后,旧直觉会失效
SSD 上【顺序与随机差不多快】。这不是它更快,是【这一类开销不存在了】。 于是几十年积累下来的优化直觉,有一部分变成了负担: I/O 调度器的排序:SSD 上排序不省时间,还让请求多等(8.8 会讲)。 预读:SSD 随机读也很快,预读带来的浪费可能超过收益(8.9)。 碎片整理:对 SSD 没意义,还白耗寿命(8.11)。 这是技术换代时最常见的一类坑:上一代的优化,变成了下一代的成本。判断标准只有一个:这一招省的是哪一笔开销,而那一笔在新硬件上还在不在。
五、动手 Demo:HDD 的性能特性——转速提高能带来多少
只改转速,别的参数(寻道 8.5 毫秒、传输 150 MB/秒)全不变, 看 4 KB 随机读的 IOPS 怎么动。
SEEK = 8.5
XFER = 150.0
base = None
rows = []
for rpm in (5400, 7200, 10000, 15000):
rot = 30000.0 / rpm
tot = SEEK + rot + 4.0 / (XFER * 1024) * 1000
rows.append((rpm, rot, tot, 1000.0 / tot))
base = rows[1][2]
for rpm, rot, tot, iops in rows:
print("%5d rpm 旋转 %5.2f 合计 %5.2f IOPS %3.0f 相对 %.2f"
% (rpm, rot, tot, iops, base / tot))
print("转速倍数 = %.2f" % (15000.0 / 5400))
print("IOPS 倍数 = %.2f" % (rows[3][3] / rows[0][3]))
实跑输出:
--------------------------------------------------------------------
HDD 的性能特性——转速提高能带来多少
--------------------------------------------------------------------
① 转速只决定【旋转等待】这一笔
**转速越高,等半圈的时间越短**:**平均旋转等待 = 30000 ÷ 转速(毫秒)。**
转速 平均旋转 4 KB 随机合计 IOPS 相对 7200
--------------------------------------------------------------------
5400 rpm 5.56 毫秒 14.08 毫秒 71 0.90
7200 rpm 4.17 毫秒 12.69 毫秒 79 1.00
10000 rpm 3.00 毫秒 11.53 毫秒 87 1.10
15000 rpm 2.00 毫秒 10.53 毫秒 95 1.21
**转速从 5400 提到 15000——接近三倍**,
**IOPS 只从 71 提到 95,涨幅 34%。**
**因为寻道那 8.5 毫秒一直没变。**
**转速优化的是三笔开销里最便宜的一笔。**
② 真正的大头是【减少寻道次数】
**想让 IOPS 上去,只有三条路**:
**① 把随机变成顺序**(排序、批量、预读,8.8 与 8.9);
**② 加缓存**(第 6 章那几层,把重复访问挡在内存里);
**③ 换介质**(SSD,8.11——它没有机械臂,寻道这一笔直接归零)。
做法 省掉哪一笔 代价
--------------------------------------------------------------
排序后再读 寻道:不再来回跑 要多占内存缓冲
加内存缓存 全都省:根本不碰盘 内存钱与命中率
换 SSD 寻道归零,旋转归零 单位容量贵、寿命有限
**注意第三行**:**SSD 的随机读不是【变快】,而是【这一类开销不存在了】。**
**所以 SSD 上【顺序与随机差不多快】**——**这一点会推翻几十年来关于磁盘的所有优化直觉。**
📋 **Linux 上看队列深度与调度器**:
`cat /sys/block/sda/queue/nr_requests`、`cat /sys/block/sda/queue/scheduler`。
转速提了 2.78 倍,IOPS 只提了 1.34 倍。 看【旋转】那一列:从 5.56 降到 2.00,确实缩到三分之一;但【合计】从 14.08 只降到 10.53,因为 8.5 毫秒的寻道一直在那里。 换个角度:7200 转的盘,12.69 毫秒里有 8.5 是寻道,占 67%。任何不减少寻道的优化,天花板就是 33%。 所以买盘的时候,转速不是第一指标——先看你的负载是随机还是顺序。顺序负载下转速的收益会明显得多。
30 秒实验
- 算一遍:如果寻道能降到 4 毫秒,15000 转的 IOPS 会变成多少?
cat /sys/block/sda/queue/rotational,看看你的盘是机械还是固态。- 想一想:为什么监控硬盘(如西数紫盘)转速不高却卖得贵?
常见误区
- 【IOPS 是硬盘唯一的性能指标】。IOPS 只对【小块随机】有意义;大批量顺序读写要看带宽,两者不是一回事。
- 【转速越高越费电、越吵,所以不划算】。这条在台式机上成立,但服务器盘走高转速是为了【降低单次访问延迟】,目标不同,取舍也不同。
- 【SSD 全面替代 HDD,学这些没用了】。冷数据、备份、监控录像还在大量用机械盘,而且这套【先算清哪一笔最贵】的思路,换成任何介质都用得上。
自测三问(点开对答案)
1. 转速提升 2.78 倍,为什么 IOPS 只涨 34%? —— **因为转速只影响旋转等待(4.17 → 2.00 毫秒)**,**而寻道那 8.5 毫秒没变,它占了总时间的 67%。****优化最小的一项,总时间几乎不动。** 2. 机械盘提速的三条路分别对应什么代价? —— **变随机为顺序**:多占内存、拉长单个请求的响应;**加缓存**:花钱买内存,且命中率做不到 100%;**换 SSD**:单位容量贵、写入寿命有限。 3. 为什么在 SSD 上,I/O 调度器的排序变成了负担? —— **因为 SSD 没有磁头,排序不省任何时间**,**却让每个请求在队列里多等一会儿。****上一代为了机械盘做的优化,在新介质上成了纯开销。**- ☐ 8.3 HDD 的实验
相关笔记
- HDD的数据读写机制 — 三笔开销的来源
- SSD — 换介质之后
- I/O调度器 — 排序在两种介质上的不同价值
- 🐧 Linux是怎样工作的 · 索引