作者通过SimpleSSD仿真模型,采用SLC+QLC混合模式来开展进一步的验证工作。评估过程中,当写入请求到达固态硬盘时,首先会被写入缓存(DRAM),然后才被回写到NAND。文中引入了一个名叫做LRU(Least Recently Used)识别数据热度,以便将热点数据和冷数据分别写入SLC和QLC区域。与页面大小对齐的写入请求会被立即写入SSD,而小于16KB的IO请求则暂时保留在缓存等待与后续的IO聚合。
同时,为了对比不同的workload差异,论文中提供了10个workload压力模型。
在QLC NAND闪存中,由于需要等待一层中的所有字线(WLs)完成粗略编程后才能进行精细编程,因此这个时间间隔在写操作过程中是无法忽略的。研究结果显示,QLC闪存中两次编程步骤间的平均时间要远大于3D TLC闪存中编写一层所需的时间。
不同工作负载之间的时间间隔表现出显著变化,这主要是由于这些工作负载间写请求平均大小的巨大差异所导致。例如,Src2_2和Proj_0这类具有与页面大小相同的小型子请求的工作负载,在数据立即被写入底层NAND闪存的情况下,其经过时间较短。大多数工作负载的平均经过时间接近50ms,最坏情况下甚至可能超过300ms。在这样长的时间段内,由于数据更新操作,发生无效编程问题的可能性非常高。
论文提到影响无效编程严重程度的四个关键因素:
-
缓存大小
-
Block块大小(即一个块中包含的页数)
-
Open Block计数(SSD中可以并行写入的最大块数)
-
LRU长度(用于区分冷热数据)
通过改变评估存储系统的这些参数,研究发现无效编程问题在基于3D QLC的存储系统中普遍存在。具体来说,两次编程步骤之间被无效化的页面数量定义为“Invalid Page Count”,完成第一步编程的页面数量定义为“Page Count”,而无效比例(Invalid Ratio)则根据这两个指标计算得出。
此外,文中还提出另外一个参数:“回写比例”。所有写请求所涉及的总页数为“Request Page Count”,即请求页面计数。同时,写到底层NAND闪存的实际页数定义为“Write Back Page Count”。
这个写回比例有助于量化存储系统处理写请求时,实际需要对NAND闪存执行编程操作的数据量,以及缓存系统如何有效地吸收和管理这些写入数据,从而影响整体性能和闪存寿命。随着缓存大小、块大小以及开放块数量等参数的变化,写回比例也会发生变化,这会直接影响无效编程的发生情况。
缓存大小对无效编程(Invalid Programming)也有非常大的影响。在3D QLC NAND闪存中,由于采用两步编程规则,小于Page Size的IO请求首先被写入缓存,随后回写到底层存储设备。当缓存达到其容量上限时,会使用LRU(Least Recently Used)替换算法来淘汰较冷数据,并将其写回到闪存内存中。
实验结果表明,在大多数情况下,随着缓存大小的增加,无效比率(Invalid Ratio)也随之增长。这是因为更大的缓存可以容纳更多的写请求,导致更少的数据需要写到底层闪存中。
对于诸如Prxy_0和Wdev_0这类平均IO请求小于Page Size的工作负载来说,部分写请求会被缓存吸收,写入NAND的比例较低。
简而言之,缓存的大小与无效比率的增长密切相关,缓存越大,能暂存的待处理冷数据越多,进而可能导致无效编程现象增多。