为什么在 hdd/ssd 基准测试中 4k 读取比写入慢?

mgu*_*utt 13 ssd hard-drive benchmarking advanced-format

有多种基准测试工具可用于测试 PC 驱动器的速度。

以下是 SATA SSD 的基准示例:

  • 顺序读取:718.498 MB/s
  • 顺序写入:777.414 MB/s
  • 随机读取 512KB:160.541 MB/s
  • 随机写入 512KB:838.930 MB/s
  • 随机读取4KB (QD=1):26.985 MB/s [6588.1 IOPS]
  • 随机写入4KB (QD=1):135.603 MB/s [33106.2 IOPS]
  • 随机读取 4KB (QD=32):177.003 MB/s [43213.6 IOPS]
  • 随机写入 4KB (QD=32):178.397 MB/s [43554.0 IOPS]

m.2 固态硬盘:

  • 顺序读取(Q= 32,T= 1):829.119 MB/s
  • 顺序写入(Q= 32,T= 1):677.645 MB/s
  • 随机读取 4KiB(Q= 32,T= 1):744.328 MB/s [181720.7 IOPS]
  • 随机写入 4KiB(Q= 32,T= 1):144.876 MB/s [35370.1 IOPS]
  • 顺序读取 (T= 1):785.600 MB/s
  • 顺序写入 (T= 1):789.973 MB/s
  • 随机读取 4KiB(Q= 1,T= 1): 56.585 MB/s [13814.7 IOPS]
  • 随机写入 4KiB(Q= 1,T= 1): 170.449 MB/s [41613.5 IOPS]

硬盘:

  • 顺序读取:114.988 MB/s
  • 顺序写入:111.043 MB/s
  • 随机读取 512KB:39.260 MB/s
  • 随机写入 512KB:57.409 MB/s
  • 随机读取 4KB (QD=1):0.546 MB/s [133.4 IOPS]
  • 随机写入 4KB (QD=1):0.757 MB/s [184.9 IOPS]
  • 随机读取 4KB (QD=32):1.582 MB/s [386.3 IOPS]
  • 随机写入 4KB (QD=32):0.700 MB/s [171.0 IOPS]

在每种情况下,“随机读取 4KB Q1”都比写入慢,并且在大多数情况下,它与“QD32”相反。

在一些论坛上,人们说这是关于 SSD 芯片结构的限制,但像往常一样,硬盘驱动器显示相同的行为,这似乎是另一个原因?!

Mr *_*pha 13

TL;DR:这是因为 SSD 对你撒谎,说写入之前已经完成。对于读取,它无法逃脱同样的事情。

答案的较长版本是写缓存。

让我们从 QD1 案例开始。一旦 SSD 收到数据并将其保存在驱动器本地的缓存中,但在实际将其写入 NAND 之前,SSD 将向操作系统报告写入已完成。这有很大的不同,因为实际上将数据写入 NAND 非常慢。对于读取,它实际上必须先从 NAND 读取数据,然后才能将其发回(除非它更早读取并仍将其保存在缓存中,但这对于随机读取而言是不太可能的)。

这样做的缺点是,面对突然断电,写入 SSD 但尚未写入 NAND 的数据可能会丢失。一些企业级 SSD 包括一个超级电容器,可以存储足够的电量,以便在突然断电时将缓存中的数据写入 NAND。

对于硬盘驱动器,您会看到同样的事情,因为它们也在进行写入缓存。他们只是没有那么积极。为什么SSD如此激进?为了回答这个问题,我们需要考虑 QD32 的情况,它更复杂也更有趣。

你所说的随机读取通常比 QD32 的随机写入快是不正确的。这在很大程度上取决于您查看的特定 SSD。

如果您查看许多 SATA SSD 上的 4k QD1 随机读取,它们似乎都在 20-30 MB/s 范围内执行。这是为什么?这是因为 4k QD1 随机读取主要是关于延迟而不是吞吐量。延迟来自三个部分:

  1. SATA/AHCI 的接口延迟,包括告诉驱动器做什么和发送数据。
  2. 控制器本身必须弄清楚如何处理它收到的数据和指令。
  3. 实际读取或写入数据到 NAND 芯片所需的时间。

1. 或 3. 在很长一段时间内都没有太大变化,这就是为什么 1k QD1 随机读取也没有太大变化的原因。

最近 SSD 从 SATA/AHCI 到 PCIe/NVMe 的转变大大降低了 1. 的延迟,这就是为什么最近某些 m.2 和 PCIe SSD 在这方面表现出很大的改进。

SSD 控制器可以做的一件事对延迟有很大帮助,就是并行读取或写入多个 NAND 芯片,这样可以掩盖 3 的大部分延迟。如果您使用 NCQ 进行 QD32 4k 随机读取,则 SSD 可以为读取提供服务请求乱序,并确保它从尽可能多的 NAND 芯片中并行读取。

对于 QD32 4k 随机写入,SSD 会执行称为写入组合的操作。当大量小的写入请求进入 SSD 控制器时,它们会在本地缓存,并且当已经建立了足够大的写入缓冲区时,控制器会将其拆分为大小合适的块并将这些块并行写入多个 NAND 芯片,再次帮助掩盖NAND 延迟。写入组合的另一个优点是现在大多数 SSD 的页面大小(可以读取或写入的最小量)大于 4k,并且组合写入直到达到页面大小有助于避免大量写入放大。正是为了做这些事情,SSD 才在写缓存方面如此激进。