为什么 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 ms7200 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 仍能解释大量历史设计与”顺序优于随机”的本能优化。

参考