CLOCK‐DNV:一种用于消费电子产品闪存存储设备的写缓冲算法
摘要
如今,由于具有吸引人的特性,闪存存储设备已成为智能手机、平板电脑和智能电视等消费电子设备中的标准存储。由于闪存存储有助于缩短系统的响应时间,基于闪存存储的消费电子设备正逐渐增多。然而,消费电子产品中的闪存存储面临着随机写入请求的问题,因为运行在消费电子设备上的应用程序会同时发出大量写操作以存储其持久化数据。
本文提出了一种新型写缓冲算法,称为带DRAM和NVM混合写缓冲区的时钟算法(CLOCK‐DNV),该算法将随机写入请求重组为顺序写入。为了最大化连续写请求的数量,CLOCK‐DNV利用了NVM介质和脏页填充机制的优势。为了进行全面评估,所提出的算法在广泛用于性能分析的闪存存储模拟器上实现,并与两种写缓冲算法FAB和CBM进行了比较。评估结果明确表明,CLOCK‐DNV的命中率高于其他写缓冲算法。此外,与最先进的算法CBM相比,CLOCK‐DNV有效地将发送到底层闪存的写请求数量最多减少了56%,同时将闪存存储耐久性最多提升了56%。
索引术语 — 缓存存储, 智能设备, 智能家居, 闪存, 非易失性存储器。
I. 引言
与闪存存储因其体积小、抗冲击性、高性能和低功耗等优势,已被广泛应用于便携式消费设备中,例如MP3播放器、平板电脑和智能手机。最近,人们越来越关注将大容量闪存存储用作智能电视的主存储,以高效支持网页浏览器和家庭云服务器等特殊功能[1],[2]。然而,由于闪存存储不支持原地更新,因此在闪存转换层(FTL)会产生垃圾回收(GC)开销。不幸的是,随机写入请求会增加GC过程中的额外写入次数,从而加剧该GC开销。此外,随机写入请求还会因频繁触发GC操作而对闪存存储的有限耐久性产生负面影响[3]‐[5]。
为了解决上述存储问题,早期的研究工作主要集中在闪存存储内部的DRAM写缓冲区[6]‐[11],因为这是一种将随机写入请求转换为顺序写入的方法。一些研究团队采用闪存友好的写缓冲区算法来降低垃圾回收(GC)开销,该算法根据逻辑块地址(LBA)将写缓冲区内的多个页面分组为一个块,并同时驱逐属于受害者块的连续页面[8]‐[11]。然而,这些算法会降低写缓冲区的缓存命中率,因为那些包含大量页面的块会被选为受害者块以进行顺序写入。
在过去几年中,一些研究提出在闪存存储中利用非易失性内存(NVM)作为写缓冲区[12],[13],因为新兴的NVM具有类似动态随机存取存储器的特性,包括字节寻址性和高性能,同时也具备类似存储的特性,如非易失性。然而,近年来NVM技术的研究趋势表明,由动态随机存取存储器和非易失性内存组成的混合写缓冲区架构相比仅基于动态随机存取存储器或非易失性内存构建的写缓冲区,在性能和成本方面具有更显著的优势[12]‐[16]。例如,一些研究人员专注于混合写缓冲区架构,并提出了协同缓冲管理(CBM)方案[12],该方案利用非易失性内存作为写缓冲区以降低垃圾回收开销。然而,由于协同缓冲管理(CBM)方案的设计是将动态随机存取存储器的空间用于读缓存,将非易失性内存的空间用于写缓冲区,因此在写密集型或读密集型工作负载下效率较低。
本文提出了采用由DRAM和NVM组成的混合写缓冲区架构的CLOCK‐DNV。CLOCK‐DNV的目标是实现写缓冲区的高缓存命中率、高性能以及闪存存储耐久性。为实现上述目标,CLOCK‐DNV在空间局部性方面扩展了传统CLOCK算法,并利用NVM的优势以最小化发送到底层闪存的写请求数量。特别是,CLOCK‐DNV通过使用将DRAM上的页面与NVM上的页面进行合并的脏页填充机制,最大化发送到闪存的连续页面数量。为进行评估,CLOCK‐DNV在闪存存储模拟器[17]上实现,并通过多种工作负载进行了测试。评估结果表明,与其他写缓冲算法相比,CLOCK‐DNV保持了更高的命中率。此外,与最先进的写缓冲算法CBM相比,CLOCK‐DNV分别最多可将写入请求数量和底层闪存的擦除操作次数减少56%和56%。
本文的其余部分组织如下。第二节详细描述了背景与相关工作,以帮助理解本研究。第三节介绍了CLOCK‐DNV写缓冲算法的设计。第四节介绍了评估设置,并从缓存命中率、性能和耐久性方面展示了若干评估结果。最后,第五节对本文进行了总结。
II. 背景与相关工作
在过去的几年里,非易失性内存(NVM)在工业界和学术界都受到了广泛关注。本节简要概述了非易失性内存技术,并介绍了本文的相关工作。
A. 新兴非易失性存储器
最近,有许多实地研究致力于利用非易失性内存技术,例如自旋转移矩磁阻存储器、相变存储器和无晶体管交叉点。一些研究人员已将非易失性内存视为I/O层次结构的一部分。这是因为新兴的非易失性内存兼具类似DRAM的特性和类似存储器的特性,如表I [16]所示。此外,非易失性内存可应用于各种软件层,包括页面缓存和/或文件系统层,以提升各层的性能。
表I 存储介质比较
| 跟踪 | DRAM | NAND | NVM |
|---|---|---|---|
| 非易失性 | No | Yes | Yes |
| 字节寻址性 | Yes | No | Yes |
| 静态功耗 | Yes | No | No |
| 读取延迟 | ~50 ns | ~30 us | ~50 ns |
| 写入延迟 | ~50 ns | ~300 us | ~250 纳秒 |
| 耐久性 | N/A | 10^4 | 10^8 |
不幸的是,由于两个问题[18]‐[20],新兴的NVM技术还不能成为DRAM的可行替代者。首先,NVM的读写延迟不对称,且NVM的写入延迟远慢于DRAM [18],[19]。其次,尽管非易失性内存的耐久性高于NAND闪存,但其耐久性远低于动态随机存取存储器介质,因此需要均衡磨损机制[20]。为了隐藏上述问题,一些研究人员引入了一种混合内存架构,该架构由动态随机存取存储器和非易失性内存组成,并提出了结合方法以充分利用每种内存介质的优势。遗憾的是,先前的研究主要集中于主机侧的软件层,例如页面缓存[14],[15]和/或文件系统层。本文则关注存储侧的组件,例如闪存存储内部的写缓冲区,因为这种非易失性内存尽管写入延迟较低,但仍能为提升闪存存储的整体性能和耐久性提供大量机会。
B. 闪存存储中的写缓冲算法
如今,几乎所有的消费电子设备采用闪存存储作为其存储介质,从便携式设备到家用电器皆是如此。然而,闪存存储仍然受困于随机写入请求,因为这类写请求会显著增加闪存存储上昂贵的垃圾回收开销。
在闪存存储中,关于写缓冲算法[6]‐[13]以将随机写入请求重组为顺序写入的研究已有很多。以往的研究可分为两类:DRAM写缓冲区[6]‐[11]和由动态随机存取存储器与非易失性内存构成的混合写缓冲区[12],[13]。
DRAM写缓冲区广为人知,并已被应用于商用闪存存储中。这是因为该方法在DRAM写缓冲区中以块粒度临时存储页面,同时以顺序方式将已存储的页面提交到底层闪存中。FAB提出了一种基于最近最少使用(LRU)算法[9]的闪存感知的缓冲管理方法。该方法根据每个请求的逻辑块地址(LBA)将DRAM写缓冲区中的页面聚集为一个块,并同时驱逐属于同一块的所有页面以实现顺序写入。
LB‐CLOCK也是一种利用传统CLOCK算法设计的块粒度写缓冲算法[10]。然而,这两种方法都会产生额外写请求,以回收写缓冲区上的空闲空间。为了减少额外写请求,一些研究团队提出了组合写缓冲算法,该算法在写缓冲区上同时以页粒度和块粒度管理页面。一些研究人员将闪存存储内的DRAM写缓冲区逻辑分区为基于页的列表和基于块的列表[11]。另一些研究人员则引入了用于闪存存储的分层DRAM和NVM的混合写缓冲区,并提出了一种协同缓冲管理(CBM)方法[12],以降低闪存存储上的垃圾回收开销。该方法利用DRAM作为读缓存,NVM作为写缓存,以发挥NVM的非易失性特性。此外,CBM将NVM写缓冲区分区为页区域和块区域,以支持顺序写入。然而,当工作负载为写密集型时,即使DRAM写缓冲区内仍有足够的空闲空间,CBM仍频繁地驱逐NVM写缓冲区中的页面。因此,CBM的缓存命中率较低。
之前版本的工作 [21] 也采用了hybrid write buffer,并同时关注了时间和空间局部性对闪存存储的整体性能和耐久性至关重要。当前版本通过引入脏页填充机制,在空间局部性方面增强了早期版本。此外,本文还通过广泛的评估结果展示了非易失性内存和闪存存储的耐久性。
III. CLOCK‐DNV 算法的设计
本文提出了一种用于闪存存储的新型写缓冲算法,称为具有动态随机存取存储器和非易失性内存混合写缓冲区的时钟算法(CLOCK‐DNV)。为了充分利用动态随机存取存储器和非易失性内存的优势,CLOCK‐DNV 使用各自的时钟算法分别处理每种内存中的页面:动态随机存取存储器使用 CLOCK‐D,非易失性内存使用 CLOCK‐NV。图1展示了 CLOCK‐DNV 架构的概览。如图1所示,CLOCK‐D 以页粒度管理动态随机存取存储器上的所有页面,而 CLOCK‐NV 为时间与空间局部性考虑,以块粒度处理非易失性内存上的页面。
A. CLOCK-D替换算法
CLOCK‐D旨在保持动态随机存取存储器的高命中率和高空间利用率。为实现这一设计目标,CLOCK‐D遵循传统时钟算法的基本规则,并在动态随机存取存储器上同时处理干净页面和脏页。然而,与传统时钟算法不同的是,考虑到动态随机存取存储器的易失性特征,CLOCK‐D更倾向于在DRAM写缓冲区中优先保留干净页面而非脏页(该策略称为脏页优先迁移)。在脏页优先迁移机制下,每个页面的引用位会根据其脏位进行不同的设置。
如果动态随机存取存储器上的某个页面被再次访问(缓存命中),CLOCK‐D首先检查其脏位。若被再次访问页面的脏位为0(即干净页面),CLOCK‐D将其引用位设为1,以赋予其第二次机会;反之,若页面的脏位为1(即脏页),CLOCK‐D则不更新其引用位。因此,与脏页相比,CLOCK‐D能够使干净页面在动态随机存取存储器中保留更长时间。
图2展示了CLOCK‐D算法的伪代码。如果动态随机存取存储器上没有空闲空间,CLOCK‐D首先使用其自身的指针选择一个牺牲页,然后回收该页。如果指针所指向页面的引用位为1,则CLOCK‐D将其引用位从1改为0以给予第二次机会,然后 CLOCK‐D的指针移动到循环列表中的下一个页面。否则,由指针指向的页面会根据其脏位在循环列表中被驱逐,或迁移至CLOCK‐NV的循环列表。如果牺牲页的脏位为0(干净页面),CLOCK‐D直接驱逐该页面,因为闪存上的读操作远快于写操作。另一方面,如果牺牲页是脏页,CLOCK‐D则将该页面迁移至非易失性内存(CLOCK‐NV循环列表),以便将脏页聚集成组。
B. CLOCK-NV替换算法
CLOCK‐NV 同样遵循传统时钟算法关于时间局部性的基本规则。然而,由于 CLOCK‐NV 的设计目标是将发往闪存的随机写入请求重组为顺序写入,因此与传统时钟算法相比存在两个重要区别。首先,与传统时钟算法不同,CLOCK‐NV 忽略主机发出的 刷新命令 和 force unit access (FUA)标记的请求,因为 NVM 是混合写缓冲区内的持久化区域。其次,CLOCK‐NV 以块粒度管理 NVM 写缓冲区中的所有页面,其块大小与闪存块大小相同,并为每个块设置一个引用位。因此,CLOCK‐NV 必须决定页面在不同块之间的放置位置,并跟踪每个块中页面的数量。
图3展示了CLOCK‐NV算法的伪代码。如果一个页面从动态随机存取存储器迁移到非易失性内存,CLOCK‐NV首先检查该页面的逻辑块地址(LBA),然后通过将其LBA除以块大小,将该页面放置到相应的块中。如果对应的块在CLOCK‐NV的循环列表中不存在,则在CLOCK‐NV中创建一个新块,然后将该页面附加到所创建的块上。最后,CLOCK‐NV将该块的引用位更新为1。由于引用位会由其自身的指针周期性地清除,每当属于该块的页面被重新访问时,CLOCK‐NV会将该块的引用位设置为1,以利用时间局部性。如果NVM上没有空闲空间,CLOCK‐NV首先找到一个受害者块,然后同时将受害者块中的所有页面写入到底层闪存中。由于这些多页面写入有助于降低闪存存储的垃圾回收开销,CLOCK‐NV通过遍历CLOCK‐NV中的所有块,仔细选择循环列表中包含页面数最多的块作为受害者块。如果 CLOCK‐NV内部的一些块具有相同数量的页面,则 CLOCK‐NV根据每个块的引用位来选择受害者块,因为引用位指示了该块中的页面最近是否被重新访问过。
C. 脏页填充机制为了最大化连续的脏页数量
为了最大化对底层闪存的连续写入次数,CLOCK‐DNV 使用脏页填充机制,将 CLOCK‐D 的一些脏页填充到 CLOCK‐NV 的一个块中。该机制在 CLOCK‐NV 替换策略选择受害者块后触发。进行脏页填充时,CLOCK‐DNV 首先扫描 CLOCK‐D 的循环列表,查找块编号与受害者块相同的辅助页。如果这些辅助页存在于动态随机存取存储器中,CLOCK‐DNV 将这些页面填充到 CLOCK‐NV 的受害者块中,然后同时发出受害者块的完整页面,以实现对闪存友好的写入。当然,该机制会增加写请求的数量,但可以显著降低昂贵的垃圾回收开销。
IV. 评估
本节首先描述评估环境,然后将CLOCK‐DNV的评估结果与知名写缓冲算法FAB和CBM的评估结果进行比较。
A. 评估设置
所有实验均在模拟器上进行,该模拟器模拟了具有 32GB容量的SLC NAND闪存存储,并采用页面映射 FTL [17]。表II列出了该闪存存储模拟器的其他参数。
表II 模拟器参数
| 参数 | 描述 |
|---|---|
| 页面大小 | 4 KB |
| 块大小 | 256 KB(64页) |
| 页面读取延迟 | 25 微秒 |
| 页面写入延迟 | 200 微秒 |
| 块擦除延迟 | 1.5 毫秒 |
| 超额配置比率 | 15% |
在评估中,由于两个原因,三种写缓冲算法(FAB [9], CBM[12], 和 CLOCK‐DNV)被分别在闪存存储模拟器上实现。首先,FAB 是为动态随机存取存储器写缓冲区设计的,而 CBM 和 CLOCK‐DNV 是为由动态随机存取存储器和非易失性内存组成的混合写缓冲区架构设计的。其次,FAB 在动态随机存取存储器写缓冲区上以块粒度处理所有页面,而 CBM 和 CLOCK‐DNV 则同时在混合写缓冲区上以页粒度和块粒度管理所有页面。每种算法的块大小设置为模拟器的闪存块大小。对于混合写缓冲区算法,本文将DRAM写缓冲区的大小设置为混合写缓冲区总大小的10%。最后,为了公平比较,模拟器的其他配置均采用与CBM [12]中相同的参数。
B. 工作负载
为了在广泛的应用场景中评估CLOCK‐DNV,本文使用了三个真实世界的工作负载作为闪存存储模拟器的输入:金融轨迹、CAMWEBDEV轨迹和Filebench 跟踪。金融轨迹和CAMWEBDEV轨迹各自具有不同的特征:金融轨迹来自马萨诸塞大学轨迹仓库,是一种读取密集型OLTP工作负载;CAMWEBDEV轨迹来自SNIA,是一种写密集型工作负载。
为了扩大评估范围,本文还使用了一个通过运行 Filebench基准中的随机读写(random‐rw)所采集的 Filebench 工作负载。该工作负载的读取和写入操作比例相近。表III详细列出了每个工作负载的特征。
表III 工作负载的规格说明
| 参数 | 读写比 | 轨迹大小 |
|---|---|---|
| 金融轨迹 | 8.2 : 1.8 | 1.8 GB |
| CAMWEBDEV轨迹 | 0.8 : 9.2 | 0.52 GB |
| Filebench 跟踪 | 5 : 5 | 2.81 GB |
C. 缓存命中率
首先,本文比较了三种写缓冲算法的缓存命中率,因为这对写缓冲算法的整体性能至关重要。
图5展示了通过将写缓冲区大小从16MB变化到128MB时每种算法的缓存命中率。如图5所示,CLOCK‐DNV在大多数情况下保持了比其他算法更高的缓存命中率。特别是在金融工作负载下(图5a),CLOCK‐DNV的性能比FAB高出多达2倍。这是因为CLOCK‐DNV能够在页粒度上回收空闲空间,从而避免过早淘汰问题,该问题会同时驱逐受害者块中的所有页面。
同时,在写密集型工作负载的情况下,CBM 的命中率明显低于 CLOCK‐DNV(图5b)。然而,这并不令人意外,因为 CBM 从不利用 DRAM 上的空间来存放任何脏页。因此,即使 DRAM 上存在空闲空间,CBM 也必须在受害者块中逐出多个页面。
在 Filebench 工作负载的情况下,所有算法的缓存命中率均低于其他两种工作负载,且彼此接近。然而,CLOCK‐DNV 的表现优于 FAB 最多达 23%,优于 CBM 最多达 15%。这些结果证实,即使工作负载的读写比为 5:5,CLOCK‐DNV 仍通过共享 DRAM 和 NVM 上的空闲空间,充分利用了两者的空闲空间。
D. 写请求数量
本文还通过比较向底层闪存发出的刷新请求数量,展示了CLOCK‐DNV对写请求次数的影响。由于FAB和 CBM提供clean page padding,会填充干净页面以最大化连续写请求的数量,因此刷新请求可能由干净页面和脏页组成。与此同时,与上述算法不同的是,CLOCK‐DNV利用了第三节中提到的脏页填充机制。
图6以柱状图形式展示了每种算法的评估结果。X轴采用对数尺度,Y轴通过收集从每个写缓冲区到底层闪存的驱逐痕迹进行度量。如图6所示,CLOCK‐DNV在所有情况下均有效减少了发送到闪存的刷新请求数量。特别是,CLOCK‐DNV完全消除了干净页面的驱逐,因为它仅将脏页填充到由CLOCK‐NV替换策略选中的受害者块中。对于金融工作负载,与FAB和CBM相比,CLOCK‐DNV分别最多减少了48%和42%的刷新请求。在Filebench工作负载的情况下,CLOCK‐DNV分别比FAB和CBM最多提升了21%和13%。与此同时,CBM在CAMWEBDEV工作负载中表现出负面性能。主要原因是该工作负载的写请求无法放置在动态随机存取存储器的空间中。因此,与 CLOCK‐DNV相比,CBM使发送到底层闪存的刷新请求数量最多增加了56%。
E. 内存介质的耐久性
在未验证内存介质耐久性的情况下,很难证明 CLOCK‐DNV的有效性,因为非易失性内存和闪存存储的寿命有限,且其耐久性低于动态随机存取存储器介质。因此,本节展示了有多少写请求被发送到非易失性内存,并基于闪存存储模拟器比较了闪存存储的耐久性。
非易失性内存耐久性 : 实际上,尽管非易失性内存的耐久性比 NAND闪存高出一个数量级,但它也存在寿命有限的问题,并且仍然需要采用磨损均衡技术。
图7显示了发送到非易失性内存的写请求数量,此处仅将 CLOCK‐DNV与CBM进行比较,因为FAB不使用非易失性内存作为其自身的写缓冲区。如预期所示,在所有情况下,CLOCK‐DNV的写请求数量最低。特别是,在CAMWEBDEV(一种写密集型工作负载)的情况下,CLOCK‐DNV最多可将写请求数量减少55%。出现此结果的主要原因是,CLOCK‐DNV将动态随机存取存储器和非易失性内存的所有空间共享用于写请求,而CBM算法则使用动态随机存取存储器作为读缓存、非易失性内存作为写缓存。因此,CLOCK‐DNV的所有写请求都可以在动态随机存取存储器和非易失性内存上得到服务,而无需频繁执行驱逐操作。
闪存存储耐久性 : 为了验证闪存存储的耐久性,本文还给出了从闪存存储模拟器中测得的擦除操作次数。图 8展示了每种写缓冲算法在三种不同工作负载下的模拟耐久性结果。不出所料,CLOCK‐DNV显著提高了闪存存储的耐久性。这种改进是通过利用脏页填充机制刷新脏页实现的,因为擦除操作的数量与写入模式密切相关。如图8所示,与FAB算法相比,CLOCK‐DNV明显延长了闪存存储的寿命:金融工作负载下从37%提升至48%,CAMWEBDEV工作负载下从2%提升至28%,Filebench工作负载下从11%提升至20%。在最佳情况下,与CBM写缓冲算法相比,CLOCK‐DNV将闪存存储的寿命最多延长了56%(图8b)。
V. 结论
如今,大多数消费电子设备都采用闪存存储设备作为其主要存储介质,但大量随机写入请求发送到底层闪存存储会显著降低闪存存储的性能与耐久性。本文提出 CLOCK‐DNV,通过使用由动态随机存取存储器和非易失性内存构成的混合写缓冲区架构,将随机写入请求转换为顺序写入。CLOCK‐DNV的核心思想是共享动态随机存取存储器和非易失性内存上的所有空闲空间,并以页粒度管理动态随机存取存储器空间、以块粒度管理非易失性内存空间,从而充分利用时间与空间局部性。此外,CLOCK‐DNV利用非易失性内存和脏页填充机制,有助于最大化连续写入请求的数量。在闪存存储模拟器上的评估结果明确表明,在所有情况下,CLOCK‐DNV在提升性能方面均优于以往的写缓冲算法FAB和CBM,同时延长了非易失性内存和闪存存储的耐久性。
3713

被折叠的 条评论
为什么被折叠?



