简而言之:这是因为固态硬盘(SSD)在写入完成之前就向你报告说已经完成了。但对于读取来说,它无法做同样的事情。
更详细的解释是写入缓存。
我们从QD1的情况开始。一旦SSD接收到数据并将其保存在驱动器上的缓存中,但尚未实际写入NAND闪存,它就会向操作系统报告写入已完成。这会产生很大的差异,因为将数据实际写入NAND闪存非常慢。对于读取来说,它实际上必须先从NAND闪存中读取数据,然后才能发送回来(除非它之前已经读取过并且仍然保存在缓存中,但这在随机读取时几乎不太可能发生)。
这种做法的缺点是,在突然断电的情况下,已写入SSD但尚未写入NAND闪存的数据可能会丢失。一些企业级SSD包括超级电容器,以便在突然断电时存储足够的电力,以完成将缓存中的数据写入NAND闪存。
硬盘也会出现相同的情况,因为它们也在进行写入缓存。只是它们的做法没有SSD那么激进。为什么SSD如此激进?要回答这个问题,我们需要考虑QD32的情况,这更加复杂和有趣。
你所说的随机读取通常比随机写入在 QD32 上更快的说法是不准确的。这主要取决于你看的是哪些具体的固态硬盘。
如果你看一下许多 SATA 固态硬盘的 4k QD1 随机读取,它们似乎都在 20-30 MB/s 的范围内表现。为什么呢?因为 4k QD1 随机读取主要涉及延迟而不是吞吐量。延迟来自三个部分:
1. SATA/AHCI 的接口延迟,涉及告诉驱动器该做什么并发送数据。
2. 控制器本身必须确定如何处理接收到的数据和指令。
3. 实际读取或写入数据到 NAND 芯片的时间。
无论是 1 还是 3,在很长一段时间里都没有太大变化,这就是为什么 1k QD1 随机读取也没有太大变化的原因。
固态硬盘从 SATA/AHCI 到 PCIe/NVMe 的最近转变大大降低了 1 的延迟,这就是为什么某些 M.2 和 PCIe 固态硬盘最近在这方面取得了巨大的改进。
SSD控制器可以通过并行读取或写入多个NAND芯片来大大减少延迟,从而掩盖3的大部分延迟。如果使用NCQ进行QD32 4k随机读取,SSD可以无序地处理读取请求,并确保尽可能并行地从多个NAND芯片中读取。
对于QD32 4k随机写入,SSD会执行一种称为写合并的操作。当大量小的写入请求到达时,SSD控制器会在本地缓存它们,并在累积了足够多的写入缓冲区后,将其分割成适当大小的块,并并行地将这些块写入多个NAND芯片,再次帮助掩盖NAND延迟。写合并的另一个优点是,现今大多数SSD的页面大小(最小可读取或写入的单位)都大于4k,将写入组合到达页面大小之前有助于避免大量写放大。正是为了实现这些功能,SSD在写入缓存方面非常积极主动。