利用子页编程延长NAND闪存寿命

利用子页编程延长嵌入式NAND闪存存储的寿命

摘要

闪存转换层(FTL)在实现基于NAND闪存的存储设备的高性能和可靠性方面起着重要作用。为了确保存储请求的元数据一致性,FTL必须将其自身的元数据保存到NAND闪存中。然而,大量的FTL元数据写入会损害基于NAND闪存的存储设备的寿命。即使内部内存中只更新了少量元数据,FTL仍需将整个闪存页连同冗余数据一并写入。本文利用子页编程(SP)技术来减少写入NAND闪存的FTL元数据量。我们还提出了一种基于SP技术的新型FTL,称为子页FTL(SPFTL),以延长基于嵌入式NAND闪存的存储的寿命。评估结果表明,在实际工作负载下,SPFTL最多可将FTL元数据写入量减少45.4%,从而将存储设备的寿命最多延长19.3%。

索引词 —闪存,闪存转换层(FTL),移动设备,可靠性,子页编程(SP)。

一、引言

近十年来,NAND闪存已成为许多消费电子产品中现代存储最受欢迎和最重要的介质。与传统存储介质不同,NAND闪存按页进行读取和写入(或编程),且写的页在擦除之前无法覆盖。由于NAND闪存的这一特殊性,基于NAND闪存的存储设备需要一种机制来处理这些特征,以便主机能够通过传统的块I/O接口访问它们。这种机制通常称为闪存转换层(FTL)。已有许多FTL设计被提出,以高效管理NAND闪存上的地址空间[1]并最大化性能和/或寿命[2]–[4]。

为了在NAND闪存上高效且可靠地存储数据,闪存转换层不仅必须管理地址空间的映射信息,还必须执行若干维护任务,例如垃圾回收(GC)和磨损均衡。这些需求迫使闪存转换层维护自身的FTL元数据。

例如,闪存转换层需要维护逻辑块地址(LBAs)与物理闪存地址之间的映射信息。闪存转换层还应跟踪所有块的擦除次数,以实现各块之间的均衡磨损。通常情况下,将全部元数据保存在存储设备的内部内存中是不现实的,因为这些设备通常仅配备少量SRAM,且元数据需在电源循环之间保持持久性。因此,近期的FTLs[5],[6]通常将部分元数据缓存在内部内存中,而原始元数据则存储在非易失性闪存中。

由于FTL元数据的可靠性和一致性至关重要,FTL应定期将FTL元数据刷新或写回NAND闪存。对于移动消费设备中最流行的基于闪存的存储设备而言尤其如此,例如嵌入式多媒体卡(eMMC)和通用闪存存储(UFS)[7],[8],,由于资源限制,这些设备的内部内存非常有限。

此类额外的FTL元数据写入显著增加了嵌入式存储设备中NAND闪存的写入次数。在对真实I/O轨迹的分析中,我们发现很大一部分闪存写入是由FTL元数据写入引起的。

我们还发现,FTL元数据更新的粒度非常小,大多数这些FTL元数据写入的内容与前一次写入相同,仅少数几个字节不同。然而,即使更新仅改变了FTL元数据中的几个字节而页面其余部分保持不变,FTL也无法对小于整个页的数据进行FTL元数据更新写入。这通过重复写入几乎相同的FTL元数据,浪费了基于NAND闪存的存储设备有限的寿命。

本文提出了一种新颖的子页FTL(SPFTL),通过减少有效FTL元数据写入量,从而延长基于NAND闪存的存储设备的寿命。为了利用元数据更新的小尺寸特性,SPFTL采用了我们在先前工作中提出的子页编程(SP)方案[9]。SP允许仅对页的一部分进行编程,而页的其余部分保持未编程状态。该方法防止了未编程部分的磨损,从而延长了NAND闪存的整体寿命。通过在NAND闪存上重组FTL元数据的结构,SPFTL使用SP方案处理小规模的元数据写入。基于真实智能手机使用轨迹的评估结果表明,与传统的页映射FTL相比,SPFTL最多可将元数据写入量减少45.4%,并将基于NAND闪存的存储设备的寿命最多提高19.3%。

本文其余部分组织如下。第二节介绍了闪存转换层(FTL)的基础知识及其自身的元数据典型的映射方案,接着是我们基于真实I/O轨迹对FTL元数据写入量的分析。用于减少数据写入量的SP方案在第三节中进行说明。第四节描述了采用SP的基线FTL和SPFTL设计的实现。我们在第五节中比较了FTL元数据写入量,并展示了SPFTL带来的设备寿命提升。第六节描述了相关工作,第七节对本文进行了总结。

二、背景与动机

A. 闪存转换层

闪存转换层(FTL)的主要目标是隐藏NAND闪存的特殊性,使主机能够通过传统的块I/O接口访问由NAND闪存构成的存储设备。为此,FTL将LBA映射到物理页号(PPN)。当主机请求写入某个LBA时,FTL按其管理单元将该请求划分为逻辑页号(LPN),并将请求的数据存储在闪存中。FTL维护LPN与对应PPN之间的映射信息。

当主机后续使用相同的LBA读取存储设备时,FTL将其LPN转换为闪存芯片中的对应PPN,并从该PPN位置响应请求。由于NAND闪存不能直接覆盖写入,FTL通过异地更新处理覆盖写操作。当主机请求写入一个已写入的LBA时,FTL将请求的数据写入一个空闲页,将先前存储的数据标记为无效,并将该LBA的LPN映射更新为新的PPN位置。

无效数据通过一种称为垃圾回收的过程进行回收。当存储中的空闲块数量低于某个阈值时,闪存转换层会启动垃圾回收,以确保获得足够的空闲块,从而使闪存转换层能够继续处理来自主机的写请求。为了执行垃圾回收,闪存转换层选择一个牺牲块,将该牺牲块中的有效数据迁移到其他块中,然后擦除该牺牲块,最终将其转换为空闲块。

该空闲块可被闪存转换层再次用于处理后续的写请求。通常,牺牲块的选择基于其所含的有效页(即包含有效数据的页)数量,以最小化迁移这些有效页的开销[10],[11]。

B. FTL元数据

根据映射粒度的不同,FTLs可分为三类:1)块映射FTL;2)页映射FTL;和3)混合映射FTL。我们可以将映射信息视为FTL元数据的一种,因为它描述了存储在存储设备中的相应数据的属性(即PPN位置)。除了映射信息外,闪存转换层还应维护其他类型的元数据,以提供各种功能来提高存储设备的性能和可靠性。

例如,闪存转换层需要区分空闲块和已用块,并跟踪存储中可用的空闲块数量。通常,闪存转换层使用位图和计数器来管理这些元数据。为了执行垃圾回收,闪存转换层应维护页面有效性,以识别需要迁移的有效页,从而回收块。为了优化牺牲块用于垃圾回收的选择,闪存转换层可能会跟踪每个块的有效页面数量、擦除块的年龄以及每个页面的热度[12]。

闪存转换层还应均衡块的磨损,以最大化基于闪存的存储设备的寿命[13]。闪存转换层通过将擦除次数较多的块与擦除次数较少的块进行交换来实现所谓的磨损均衡。

为了执行磨损均衡,闪存转换层需要为每个块维护一个计数器,以记录该块经历过的擦除次数。此外,闪存转换层可以采用多种复杂功能,例如冷热数据分离[11],、磨损均衡指数[4],、非均衡磨损[15],和去重[14],以提升存储设备的性能和可靠性。这些方案在闪存转换层运行过程中也需要各自的FTL元数据来跟踪相关的信息。

上述大多数FTL元数据应在电源循环之间保持持久性和一致性。因此,它们必须存储在非易失性闪存中。元数据的具体位置可能因FTL设计而异。一种方法是将物理页号地址空间划分为多个分区,并预留一些分区分区用于存储元数据[16],[17]。这种设计在操作FTL元数据时简化了块管理。然而,当元数据量不固定时,静态分区可能导致存储利用率低下。另一种方法是将元数据与常规数据一起存储,而不为元数据预留块[2]。这种方法可以解决存储利用率低下的问题,但会使块管理变得复杂。

C. 动机

FTL元数据的类型和数量取决于其映射方案的设计与实现以及FTL所支持的功能。然而,存储在NAND闪存中的FTL元数据必须加载到存储设备的内部内存中才能被访问或更新。但是,由于内部内存容量非常小且有限,只能同时加载部分FTL元数据。例如,目前在商用消费市场中广泛使用的典型eMMC和UFS存储系统的内部内存大小仅为几百千字节。当考虑一个以4 KiB页粒度管理32 GiB闪存的FTL时,该FTL至少需要32 MiB的映射信息,这超出了此类存储设备内部内存的容量。因此,许多嵌入式存储设备的FTL利用内部内存作为FTL元数据的缓存,这类似于存储层次结构中CPU缓存与主存的关系。

加载到内部内存后,FTL元数据可能会被写请求、垃圾回收、磨损均衡等操作修改。更新后的FTL元数据需要写回NAND闪存,以确保在电源循环后更新仍能持久保存。

由于内部内存相较于完整的FTL元数据较小,且FTL元数据的可靠性对存储设备的整体可靠性至关重要,因此FTL元数据更新频繁发生。为了减少频繁的元数据写入,可以采用日志记录技术恢复技术[18]。这些技术试图跳过写入非关键的元数据更新。相反,它们在设备的开机序列期间扫描元数据,以识别并恢复可能的元数据损坏。然而,这种方法可能不适用于需要保证快速系统启动时间的嵌入式存储设备。因此,考虑到开机序列所花费的时间,嵌入式存储设备倾向于将闪存转换层元数据写回或刷新到NAND闪存中。例如,eMMC存储系统会定期刷新脏元数据以实现快速启动时间。

频繁的元数据刷新导致大量元数据写入NAND闪存。

为了更好地理解FTL元数据更新的特征及其相关的闪存写入,我们进行了多种基于轨迹的研究。我们收集了客户实际使用的智能手机中的I/O轨迹,并在实现了专为嵌入式存储设备设计的页映射FTL的FTL模拟器上重放这些轨迹。

有关FTL设计的详细信息请参见第四节,有关I/O轨迹和FTL模拟器的详细信息请参见第五节。图1总结了本文获得的一些有趣结果。

在重放各种I/O轨迹时,我们将FTL元数据写入与总闪存写入量分开。在干净状态下(即此前未发出主机写入请求),模式A、B和C的FTL元数据更新分别占总闪存写入量的8.3%、6.7%和11.0%。然而,在大量主机写入请求后的老化状态下,模式A、B和C的FTL元数据更新占总闪存写入量的比例显著增加至88.8%、87.4%和86.5%。图1展示了闪存写入量的细分情况。这些FTL元数据更新的写入量占总闪存写入量的相当大比例。除了模拟器研究外,我们还在商用eMMC存储系统内部进行了类似的评估,并观察到类似的结果;即使在干净状态下,约24.8%–60.9%的闪存写入源自FTL元数据写入。由于需要在非常受限的资源上实现快速启动时间和突然断电恢复等多种功能,商用嵌入式存储系统具有较大的元数据开销。该闪存写入结果表明,相当一部分NAND闪存磨损来自FTL元数据写入,若能妥善管理这些FTL元数据更新,则存在进一步延长基于NAND闪存的存储寿命的优化机会。

有趣的是,我们发现了FTL元数据写入的独特特性。

对于每次FTL元数据更新的写入操作,通过将更新后的FTL元数据与存储在闪存中对应页的原始FTL元数据进行比较,我们识别出了页面中的变更情况。我们注意到,FTL元数据更新仅针对元数据页中的少数几个字节。具体而言,模式A、B和C的平均变更量分别为70.3字节、48.4字节和66.0字节。86.5%至88.8%的FTL元数据写入所更改的数据少于20字节,而单次变更的最大数据量在一整个4 KiB页中也仅有1 KiB。这种较小的FTL元数据更新是因为针对写请求或其他操作的FTL元数据更新通常只涉及少量页,仅修改相应的映射信息中的几个字节。

示意图0

其他元数据。这意味着FTL元数据更新是在闪存页上编程,这些页的值几乎与原始页相同,仅有一小部分被更新。基于这一观察,我们受到启发,通过消除不必要的编程数据来延长嵌入式存储设备的寿命。

III. 子页编程

如前一节所述,元数据更新虽然较小,但占总闪存写入量的很大比例。本节介绍全页编程(SP),这是我们之前为延长NAND闪存寿命所做的工作。

A. 子页

我们定义子页为小于页面大小的编程单元。通常,我们将子页大小设置为扇区大小(例如512字节)的整数倍。

例如,对于一个4 KiB页,我们可以考虑划分为两个2 KiB子页或四个1 KiB子页。在对某个子页进行数据编程时,同一页中的其他子页将填充预定义值(通常为1),该值对应于未编程单元。因此,实际并未对正在编程的子页之外的单元进行编程,从而减少了这些单元中氧化层的应力。

因此,总体而言,子页编程相比常规的全页编程对存储单元造成的应力更小。

SP方案的关键思想是,仅在需要写入少量数据时对子页进行编程,而不是将原始数据填充到整个页后再进行编程。假设一个FTL元数据更新操作修改了两个4 KiB页中的两个2 KiB范围。在原始情况下,这需要两次全页编程操作来写入8 KiB数据,而采用SP操作则只需两次写入,总共仅写入4 KiB。基于这一点,我们考虑在FTL设计中采用SP方案来处理小量的FTL元数据写入。

全页编程与半页编程类似[19],因为这两种方式都是对页进行部分编程。这些编程方案之间的主要区别在于对未编程单元的处理方式。在半页编程的情况下,页的剩余部分会通过后续的半页编程操作很快被编程。相反,在全页编程中,除非包含该页的块发生

B. 子页编程模式

我们首先将子页分区定义为块中具有相同页内偏移位置的一组子页。例如,如果子页大小是页面大小的一半,则每个块包含两个子页分区。子页分区0由各页的下半部分的子页组成,而子页分区1则由各页上半部分的子页组成。

同样地,当子页大小为页面大小的四分之一时,我们可以定义四个分区。每个分区中的子页数量与块中的页数相同。

我们将专用于SP的块称为SP块。在编程SP块时,我们施加了三个限制:第一,禁止在SP块上进行全页编程;第二,同一时间只能使用属于同一分区的子页;当一个分区被用于SP块时,只有在该块被擦除后,其他分区才能被使用;最后一个限制是,每个子页必须按照从最低页号到最高页号的顺序依次编程,如同在全页编程中一样。

由于SP块中包含两个或更多的子页分区,因此可以考虑多种使用子页分区的顺序。为了获得最佳的耐久周期效果,我们采用乒乓顺序[9],使页面中的所有闪存单元承受最小的编程干扰应力。图2展示了乒乓顺序的一个使用示例:一个分区被持续使用,直到该分区内出现不可纠正位错误;然后切换到下一个分区,直到该分区内再次出现不可纠正位错误。在乒乓顺序中,未使用的分区中的闪存单元可保持在编程禁止状态,直到实际使用时为止。

示意图1

IV. SPFTL

本节讨论了闪存转换层如何利用全页编程方案来缓解因过度的FTL元数据写入所引起的问题。我们首先介绍了基础FTL设计,并提供了两种不同的FTL方法。我们相信其他FTLs可以以类似的方式在其元数据管理中采用SP技术。

A. 基准闪存转换层

我们所指的基准闪存转换层DFTLpor基于采用按需映射技术[5],[6]的DFTL[2], 。DFTL是一种先进的FTL,通过动态地将必要的元数据加载到内部内存中,以最大化随机写入性能。为了清晰地阐述我们的思路和贡献,我们仅添加了最少的

示意图2

为DFTL提供以下特性:用于电源循环的按块元数据管理和元数据恢复方案。我们预计,其他需要更多元数据的复杂功能,例如去重、冷热数据分离等,也可以在无需重大修改的情况下加以考虑。

如图3所示,DFTLpor在内部内存中维护以下元数据:缓存页映射表(CPMT)、缓存块信息表(CBIT)和全局上下文(GXT)。类似于DFTL的转换块[2],,整个页映射表(PMT)按闪存页大小进行划分,并存储在称为PMT块的专用闪存块中。活跃页映射项被缓存在内部内存的一个区域,即CPMT中。对于按块元数据管理,DFTLpor维护一种称为块信息表(BIT)的元数据结构。BIT中的每个条目记录一个物理闪存块的有效页面数量和擦除次数。由于BIT的大小很大,它也按闪存页大小进行划分,并存储在称为BIT块的闪存块中。用于牺牲块选择和磨损均衡的BIT条目被缓存在内部内存的一个名为CBIT的区域中。为了跟踪最新PMT和BIT页的位置,DFTLpor在内部内存中分别维护页映射目录(PMD)和块信息目录(BID)。这两个目录PMD和BID构成了GXT,即DFTL所管理的顶层元数据por。除了PMD和BID之外,GXT还包含其他元数据,例如块摘要信息(BSI)和更新/空闲块指针(UFP),这些元数据在垃圾回收中用于处理牺牲块。由于GXT频繁更新且其空间开销非常低(例如,对于16GB设备仅为2047字节),DFTLpor始终将完整的GXT元数据保留在内部内存中。

DFTLpor将数据写入更新块,该块表示写入输入数据的闪存块。这会更新CPMT中的映射项,并更改CBIT中的相应信息。请注意,在更新时,CPMT或CBIT中可能没有空间容纳新条目。在这种情况下,一个或多个脏项可以被刷新到闪存。最后,DFTLpor更新PMD和BID中的相关条目。当当前更新块没有空间时,将调用GC过程。由于

GC后更新块会发生变化,DFTLpor首先刷新属于当前更新块的所有CPMT/CBIT中的脏项

B. SPFTL

我们首先介绍SPFTL的基本设计,这是一种充分利用全页编程进行元数据管理的全新方法。SPFTL将所有元数据存储在SP块中,元数据更新直接写入其对应的更新块。

在SPFTL中,由于有限的内部内存大小,当PMT或BIT页从相应的缓存(CPMT或CBIT)中被逐出时,会被写入闪存。在这种情况下,新的PMT(或BIT)页仅在少数脏项上与旧页不同。其余的元数据被写入闪存是冗余地完成的,仅仅因为整个闪存页必须一次性编程。然而,SP技术开启了一种将更小数据写入的新机会——小于闪存页大小。如果我们以子页单位管理元数据页(PMT、BIT和GXT页),则可以通过避免对元数据页的未修改部分进行重复写入,来减少effective元数据写入量。

SPFTL的基本元数据架构与DFTLpor相同,如图3所示。主要区别在于,SPFTL将元数据大小减小以适应子页,并将所有FTL元数据存储在SP块中。为简洁起见,我们仅考虑子页大小为闪存页大小一半的情况。由于PMT和BIT页现在以子页粒度存储,SPFTL通过子页对其进行读取或写入。然而,这不需要对CPMT和CBIT的管理进行任何更改。

当一个或多个脏项从CPMT或CBIT中驱逐时,SPFTL将相应的子页加载到内部内存中,更新修改的条目,并将其写回相应的元数据更新块。

与DFTLpor相比,SPFTL的一个缺点是由于PMT和BIT页的数量增加,导致PMD和BID中的条目数量翻倍。如果因PMD和BID的增加使得GXT大小超过子页大小,则通过SP技术管理PMT和BIT页所带来的优势将被抵消。然而,由于以下原因,这对整体性能影响不大。首先,我们使用实际工作负载进行的实验结果表明,GXT写入占总元数据写入的比例仅为3.0%。因此,即使每次GXT写入需要两次SP操作,其影响仍可忽略不计。其次,由于PMT和BIT块的数量和位置是固定的,可以通过在PMD或BID条目中仅存储块索引而非块编号来减小GXT的大小。

C. 带有元数据日志的SPFTL

我们提出另一种称为SPFTLlog的SPFTL变体,该变体采用元数据日志方法。SPFTLlog的设计原则是利用全页编程来管理FTL元数据,同时尽量减少对DFTLpor元数据架构的修改。从这个意义上说,SPFTLlog除了处理元数据更新之外,在其他方面均与DFTLpor相同。

为了使用全页编程处理小规模元数据更新,SPFTLlog只需将修改后的元数据条目记录到一个专用的日志块中,如图4所示。每种元数据类型都有其独立的日志块。因此,SPFTLlog中有三种类型的日志块,分别用于GXT、PMT和BIT。这些日志块被设置为SP块,以便只能通过全页编程进行编程。

当发生元数据更新时,SPFTLlog会创建该更新的日志,并通过全页编程将其写入相应的日志块。对于PMT更新,日志由LBA及其更新后的PPN组成。BIT更新的日志由块编号、有效页数和已更新块的擦除次数组成。类似地,GXT更新的日志由被更新元数据的类型及其更新值构成。

如果对同一个原始元数据页面执行了多次更新,则将日志合并到一个子页中。例如,属于同一PMT页面的日志会被合并到一个子页中。当这些日志被合并到原始元数据时,对应的日志子页已满。为了合并日志,SPFTLlog将相应的元数据页加载到内部内存中,更新日志中的元数据,并根据元数据类型将更新后的元数据写回到更新块中。

SPFTLlog使用一种称为日志信息目录(LID)的数据结构来跟踪最新的日志。LID中的每个条目都指向相应元数据页的更新在日志块中的位置。为了访问一个元数据页,SPFTLlog首先查询LID,以确定该元数据页是否已在日志块中被更新并记录。如果存在该元数据页的条目,SPFTLlog则从LID条目所指向的日志块的日志中读取最新的元数据。否则,该元数据页没有关联的日志,SPFTLlog将访问存储在各个更新块中的元数据页。

示意图3

V. 评估

A. 评估设置

我们实现了一个基于跟踪的FTL模拟器,用于DFTLpor、SPFTL和SPFTLlog。该FTL模拟器接收块级跟踪,并根据FTL实现处理跟踪中的每个请求。我们参考主要闪存制造商的硬件规格,采用20纳米级MLC NAND闪存的典型参数来模拟NAND闪存。具体而言,NAND闪存由8-KiB页组成,这是我们在评估中采用的逻辑到物理映射粒度,每个块包含128页。因此,单个块的大小为1兆字节。

表I总结了20纳米级MLC NAND闪存的特性。我们设置了总共16 384个块,提供16-GiB的容量作为总存储空间。需要注意的是,其中15 564个块用于用户空间,相当于15.20-GiB的容量,其余5%的块保留作为超额配置空间[25]。

我们参考eMMC和UFS存储设备的通用硬件规格,假设有26千字节的内部内存用于运行所有三个FTL。在该内部内存中,我们分配2千字节用于缓存一个更新块的PMT和BIT条目,并分配4千字节用于GXT管理两个目录和其他剩余元数据。内部内存允许FTLs缓存整个GXT,而只有部分PMT和BIT可以加载到给定的内存中。我们假设剩余的内部内存用于8-KiB页回写和一个8-KiB缓冲区来管理PMT(或BIT)页,这些是每个FTL运行所必需的。在SPFTLlog中额外使用了一个4-KiB缓冲区用于合并日志。

我们假设元数据块以SLC模式运行[20],[21]而数据块则处于MLC模式。MLC或TLC芯片中的每个块都可以设置为SLC模式,该模式下仅使用LSB页。由于FTL元数据仅占用少量存储空间但包含关键信息,因此我们采用提供更高可靠性和更长寿命的SLC模式,而非MLC模式。然而,我们必须考虑元数据块与数据块之间不同的耐久循环次数。我们认为,所提出的方案可以集成到任何MLC或TLC芯片中,而无需进行重大修改。

在我们的评估中,同时使用了真实I/O轨迹和合成随机写入模式。真实I/O轨迹是通过在智能手机上设置块级跟踪工具,并让消费者以正常使用方式使用智能手机24小时而收集的。表II总结了三个真实I/O轨迹的特征。我们还执行了各种带有8-KiB页面请求的随机写入,以测量FTL元数据写入次数。由于FTLs在有限的内部内存下运行,随机写入可能会产生大量的FTL元数据写入。

对于性能指标,会在处理每个请求时收集所有NAND操作(即元数据写入计数和相应的擦除次数)。因此,在Flashsim模拟器[22]中通过测量给定轨迹的操作时间来比较闪存转换层的性能。操作时间基于表I所示的20纳米级MLC NAND内存的时间参数。

B. FTL元数据分析

正如我们所预期的,当FTL在执行15.20 GiB的随机写入且页面请求为8-KiB时,会写入大量FTL元数据。这是因为随机写入模式导致不同PMD中的PMT/BIT条目发生频繁变更。对于DFTLpor而言,写入的FTL元数据总量达到15.16 GiB,几乎与用户写入总量相当。

我们在一个基于跟踪的FTL模拟器上重放了三条真实I/O轨迹,并收集了关于FTL元数据的性能指标。首先,我们在干净条件下执行三条真实I/O轨迹,即所有数据和元数据块均为空。如第二节所述,DFTLpor写入的元数据量占总闪存写入量的6.7%至11.0%。SPFTL将三条真实I/O轨迹的元数据写入量分别降低至总闪存写入量的6.3%、3.9%和4.9%。SPFTLlog也将写入的元数据量分别降低至6.2%、3.8%和4.7%。

图5展示了在老化状态下运行真实I/O轨迹时产生的元数据写入量。为了制造老化状态,我们使用随机工作负载填满整个用户空间,并重放这些I/O轨迹,这会在给定I/O轨迹的执行过程中引发垃圾回收并激活元数据写入。

当在DFTLpor上运行模式A时,我们可以看到大量的FTL元数据流量来自PMT写入(89.8%),而BIT和GXT的写入分别占7.3%和2.9%。这是由于小规模且随机的写入模式,每次写入请求都会访问PMT/BIT页。我们观察到,在模式A中,FTL元数据写入总量达到5.50 GiB,是用户写入数据量的7.93倍。模式B和C也观察到了类似的结果。我们可以发现,模式C中的FTL元数据写入总量明显高于模式A和B。这表明FTL元数据写入量与用户写入的数据量成正比。

我们可以观察到,两个SPFTL显著减少了所有给定轨迹的元数据写入量。SPFTL将该量分别减少了42.9%、42.2%和43.0%。A、B和C相比DFTL分别por。具体而言,SPFTLlog使元数据写入量减少了44.8%、45.0%和45.4%。这表明SPFTL的日志操作能够进一步减少由于实际工作负载的空间局部性所导致的元数据写入量。在图5中,我们还将PMT/BIT细分为PMT-GC/BIT-GC,其表示在FTL元数据垃圾回收过程中迁移的有效FTL元数据页的数量。SPFTL和SPFTLlog的PMT-GC和BIT-GC略有增加,这是由于使用子页导致FTL元数据条目数量增加所致,但与总FTL元数据写入量相比,这些增量可以忽略不计。因此,在所有三种真实I/O轨迹中,FTL元数据写入量最多减少了45.4%,相较于DFTLpor。

示意图4

C. 寿命分析

使用全页编程通常会增加SP块的擦除次数。然而,我们之前的研究表明,与采用全页编程的其他传统块相比,SP块能够承受更多的擦除次数[9]。为了准确计算SPFTL设计的寿命,我们应在SPFTL的总擦除次数中反映SP块增加的耐久性。

由于SPFTL和SPFTLlog同时使用全页编程和SP,我们定义归一化磨损指数(NWI)以考虑SP块的擦除次数,其可计算为

$$
\text{NWI} = \sum_{b=1}^{m} \text{Erase} {fp}(b) + \sum {b=1}^{n} \text{Erase} {sp}(b) \times \text{Weight} {sp}
$$

其中,$ m $和$ n $分别表示全页块和SP块的数量,$ \text{Erase} {fp} $和$ \text{Erase} {sp} $分别表示它们的擦除次数。$ \text{Weight} {sp} $是SP块擦除次数的归一化因子。根据我们之前的实验结果,在由4-KiB子页[9]组成的SP2OSLC配置上测得,SP块的耐久周期相比采用全页编程的块提升了1.71倍。因此,我们将$ \text{Weight} {sp} $设为1/1.71,以计算SPFTL和SPFTLlog的NWI。需要注意的是,DFTLpor不使用任何SP块,而SPFTL将SP块用于所有元数据块。在SPFTLlog中,仅日志块使用SP块在SP块中运行,其余的元数据块的操作与DFTLpor中的相同。

图6显示了DFTLpor、SPFTL和SPFTLlog在三个真实I/O轨迹中的总擦除次数。NWI(SPFTL)和NWI(SPFTLlog)表示根据(1)计算的归一化总擦除次数。由于使用了全页编程,SPFTL和SPFTLlog的擦除次数略有增加。然而,归一化总擦除次数估计低于其他方法,并且对于所有给定轨迹,设备寿命均可显著延长。因此,SPFTL在模式A中将寿命延长了最多17.5%,在模式B中延长了16.5%,在模式C中延长了17.2%。SPFTLlog相比DFTLpor在模式A中寿命提升了19.2%,在模式B中提升了19.3%,在模式C中也提升了19.3%。

示意图5

D. 性能分析

我们利用FTL服务时间来评估SPFTL和SPFTLlog的性能。由于唯一的区别在于FTL元数据是否通过SP进行管理,因此我们使用表I中所示的NAND时序参数来评估性能。与DFTLpor相比,SPFTLlog在模式A中使服务时间增加了4.7%,在模式B中增加了4.4%,在模式C中增加了4.1%。这是因为更新日志的LID查找开销被添加到了关键路径中。然而,SPFTL在模式A、B和C中分别使服务时间减少了4.3%、3.2%和4.2%。这一改进取决于SP方案所写入的数据量。我们还研究了每个请求中NAND操作所消耗的响应时间。SPFTLlog在模式A中使平均写入延迟最多增加3.1%,在模式B中增加3.1%,在模式C中增加2.9%。然而,SPFTL在模式A、B和C中分别使平均写入延迟最多减少了5.3%、0.9%和5.4%。SPFTL的写入延迟也因子页的传输时间比整页更快而降低。

六、相关工作

FTL可以将小型主机写入请求收集到写缓冲区[26],从而减少读取、修改和写入操作。对于全页编程而言,SPFTL立即写入子页,因此减少了由小部分元数据更新引起的冗余。为了提高NAND闪存的耐久周期,均衡器[4]同时考虑了块的擦除次数和页面编程时间的变化。在出现非均衡磨损[15],的情况下,会在块耗尽之前检查每个页的耐久性。动态编程和擦除缩放[23]可以改变NAND闪存的擦除电压和擦除时间,从而改善基于NAND闪存的存储的寿命。

与其他方法类似,内容感知闪存转换层通过去除不必要的和重复的数据来延长寿命。基于对象的闪存转换层[24]在主机文件系统中实现索引元数据的延迟持久化,并在保持一致性的同时消除日志,从而延长基于NAND闪存的存储的寿命。

本文提出的方法与上述方法正交,因为SPFTL可以与其他方案结合,以增强基于NAND闪存的存储设备的寿命。

七、结论

传统闪存转换层总是执行全页编程,这种做法在存储FTL元数据写入的小改动时具有极高的冗余性。为了减少FTL元数据写入的冗余,我们提出了一种新颖的SPFTL,该方法利用SP技术。我们认为所提出的方法可被其他FTL采用。

我们使用真实I/O轨迹进行的评估结果表明,SPFTL最多可将写入的元数据量减少45.4%。最后,在由20纳米级NAND芯片组成的环境中,SPFTL最多可将基于嵌入式NAND闪存的存储的寿命提高19.3%。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值