为什么 HDD 仍值得理解
尽管 SSD 普及,HDD 仍在大容量冷存储、备份、数据仓库中大量使用。其机械结构决定了它和 SSD 截然不同的性能画像:顺序吞吐尚可,随机访问极慢。理解这一点,才能解释”为什么数据库最怕随机磁盘读”。
物理结构
┌─────────────────────────────┐
│ ┌───┐ │
主轴 → │ │磁头│← 磁头臂(actuator) │
旋转 │ └─┬─┘ │
│ │ 悬停在盘片上方 ~10nm │
│ ╔═══════════════════╗ │
│ ║ 盘片 (Platter) ║ ← 高速旋转 7200-15000 RPM
│ ╚═══════════════════╝ │
└─────────────────────────────┘
多个盘片叠放,上下两面各有磁头
关键部件:
- 盘片 (Platter):涂磁性介质,双面可用
- 磁道 (Track):同心圆;柱面 (Cylinder):各盘面同半径磁道集合
- 扇区 (Sector):磁道上的最小读写单位(传统 512B,现代 4KB 高级格式化)
- 磁头臂 (Actuator):步进电机驱动,在盘片上径向移动定位
一次读写的延迟组成
随机访问一次数据的总延迟 = 寻道 + 旋转延迟 + 传输:
磁头移动到目标磁道
│ (寻道时间 Seek, 2-15ms)
▼
┌──────────────────────────┐ 盘片旋转,目标扇区转到磁头下
│ ░░░░░░░░░░░░░░░░░░░░░ │ (旋转延迟 Rotational, 平均半圈)
└──────────────────────────┘ │
▼ 磁头读取扇区数据
(传输时间 Transfer, ~微秒级)
| 阶段 | 典型值 (7200 RPM) | 说明 |
|---|---|---|
| 寻道 (Seek) | 3-15 ms | 磁头臂移动,占大头 |
| 旋转延迟 (Rotational) | 平均 4.2 ms | 7200 RPM 一圈 8.3ms,平均半圈 |
| 传输 (Transfer) | < 0.1 ms | 数据读出,相对可忽略 |
旋转延迟计算:7200 RPM = 120 圈/秒 → 每圈 8.33 ms,平均等待半圈 = 4.17 ms。15000 RPM 则每圈 4 ms,平均 2 ms。
IOPS 估算
随机读 IOPS ≈ 1 / 平均单次访问延迟。7200 RPM 硬盘:
平均延迟 ≈ 寻道(8ms) + 旋转(4.2ms) + 传输(0.05ms) ≈ 12.25 ms
IOPS ≈ 1 / 0.01225 ≈ 80 IOPS
对比:SSD 随机读可达 数万到数十万 IOPS。这正是 HDD 在随机访问场景被碾压的原因。
顺序 vs 随机:天壤之别
- 顺序读写:磁头不动、盘片连续转,吞吐可达 150-250 MB/s
- 随机读写:每次都要寻道 + 等旋转,吞吐骤降到几 MB/s
顺序扫描 1GB: 1000 MB / 200 MB/s ≈ 5 秒
随机读 1GB: 250000 IO × 12ms ≈ 50 分钟 ← 差 600 倍
队列深度与 NCQ
现代硬盘支持 NCQ (Native Command Queuing):把多个待处理 IO 重新排序,让磁头沿最短路径依次服务,减少来回摆动:
原始顺序: 读磁道 100 → 50 → 200 → 30
NCQ 重排: 30 → 50 → 100 → 200 ← 磁头单向扫过,省去往复
适当提高队列深度 (queue depth) 能提升 HDD 吞吐,但单线程同步随机读仍受限于单次延迟。
对数据库的启示
| HDD 特性 | 数据库应对 |
|---|---|
| 随机读极慢 (~80 IOPS) | 靠缓冲池把随机读转内存;建索引减少磁盘访问 |
| 顺序吞吐高 | 顺序扫描、批量导入快 |
| 寻道是瓶颈 | 聚类/有序存储减少磁头摆动 |
| NCQ 重排 | 适度并发 IO 提升吞吐 |
这就是为什么早期数据库拼命建索引、缓存、避免随机扫描——在 HDD 时代,一次多余的磁盘随机读就是 12ms 的代价。即便今天 SSD 大幅缓解,理解 HDD 仍能解释大量历史设计与”顺序优于随机”的本能优化。
参考
- Modern Hard Drive Architecture, Wikipedia: Hard Disk Drive
- ACM Queue: The Pathologies of Storage Systems