(资料图)

在剖析读写延迟的来源之前,我们还是先来回顾一下固态硬盘的架构。从下图可以清晰的了解到,固态硬盘主要由主控,DRAM缓存以及NAND闪存构成。主控负责的任务主要是Wear Leveling, Garbage Collection(垃圾回收), Bad Block Management(坏块管理), ECC纠错等. 同时,在主控中,与主机对接的是Host interface,Host与固态硬盘的之间的通信协议可以是PCIe,SAS或者SATA等,和NAND闪存对接的是NAND controller.

了解了固态硬盘的结构之后,我们需要再认识一下主机和固态硬盘数据通信的逻辑关系。从主机的角度来看,对固态硬盘进行的操作均是逻辑上的读写内容。而从NAND闪存的角度讲,主机要求的逻辑上的读写,实际到NAND闪存后,变成了物理上的读,写,擦除等执行操作。

我们知道,固态硬盘的好坏以及用户体验集中归因于带宽,IOPS,延迟,一致性等。其中,固态硬盘的延迟,大部分原因在于NAND闪存的读写延迟造成的。

垃圾回收是固态硬盘延长寿命,减少读写次数的手段。在垃圾回收过程中,会增加数据的搬迁,擦除等操作,所以垃圾回收也会带来一定程度的写入延迟。不过,这个写入延迟并不是直接的,而是由DRAM等造成的间接延迟。

从上图,我们可以看到,在4KB随机写, 队列深度QD=1的情况下,有些固态硬盘的写入延迟超过了200ms。虽然这200ms并不能让我们有深刻的感觉,但对于高性能系统而言,这个200ms是灾难性的。

如果说,写入延迟是垃圾回收间接造成的,那么读取延迟则是垃圾回收带来的直接恶果。因为,在垃圾回收启动之后,固态硬盘的主控将需要做垃圾回收的区块中的数据搬迁到spare区域,然后在数据搬迁完成后再擦除整个区块的内容。这个过程影响了固态硬盘的读取速度。这也是当我们的固态硬盘在写入一段时间之后,性能会变慢的原因,因为内部启动了垃圾回收的步骤。

从上图,可以看到,在4KB随机写, 队列深度QD=1的情况下,有些固态硬盘的读取延迟超过了35ms。

如果对NAND闪存先发了一个read block1 page2的命令,之后接着再发个erase Block0的命令,这个时候,读取延迟会因为后面的erase操作增大了延迟了,此时延迟的大小基本等于NAND读取时间tR加上块擦除时间tErase.

同样,如果对NAND闪存先发了一个read block2 page3的命令,之后接着再发个program Block0 page1的命令,这个时候,读取延迟会因为后面的program操作增大了延迟了,此时延迟的大小基本等于NAND读取时间tR加上后面program的时间tPROG.

推荐内容