一种基于文件系统特征的SLC缓存方案

2022-11-07 10:57:28李明江
计算机应用与软件 2022年10期
关键词:数据类型存储设备日志

李明江 陈 仁

1(黔南民族师范学院计算机与信息学院人工智能与大数据应用技术研究所 贵州 都匀 558000) 2(中科院上海技术物理研究所中国科学院红外探测与成像技术重点实验室 上海 200083)

0 引 言

近年来,由于基于闪存(主要是NAND Flash)的固态存储设备具有速度快、延时低、功耗低、抗震、体积小等优点[1],无论是在消费领域,还是在企业数据中心,抑或是在移动领域(如eMMC、UFS等),固态存储设备都得到广泛的使用。但与传统磁性硬盘相比,固态存储设备在容量和价格方面却不占优势。为解决这个问题,闪存一直朝着高密度方向发展,从早期的2D SLC(单个存储单元存储1比特数据的二维闪存),到现在广泛使用的3D TLC(单个存储单元存储3比特数据的三维闪存),存储密度越来越高,单比特数据成本越来越低,使得固态存储设备在容量和价格方面与传统硬盘相当。但是,闪存存储密度提升的同时,闪存的性能和寿命也是越来越低。

为解决TLC性能差的问题,SLC缓存算法被广泛应用在固态存储设备。传统SLC缓存算法[2-4]思路是,在固态存储设备中,一些TLC块(Block)配置成SLC缓存使用,用户写入数据时,如果当前设备中有空闲SLC缓存,数据则会被优先写入到这些缓存中。当系统空闲时,这些SLC缓存的数据会被搬到TLC块中。SLC缓存算法虽然能提升固态存储设备突发写入(Burst write)性能,但是由于数据先写入到SLC,然后还是要搬到TLC,这会引入额外的写放大,影响系统的寿命(Endurance)。另外,当SLC缓存耗尽或即将耗尽的时候,为释放SLC缓存空间,SLC数据到TLC空间数据搬移的垃圾回收会被触发,这时系统写入性能会出现断崖式下降。

为减小SLC缓存算法对存储设备寿命的影响,有学者提出基于用户数据冷热程度使用SLC缓存[5-6],即当用户写入的数据是热数据时,热数据会被写入到SLC缓存,而对冷数据,数据则被直接写入到TLC块中。这些算法满足了热数据写入的高性能需求,同时减少了数据从SLC到TLC的搬移,减小了系统的写放大,提升了存储设备的寿命。但是,当SLC缓存耗尽的时候,由于需要释放SLC缓存空间,SLC缓存垃圾回收导致用户写入性能变差的问题没有得到解决或者缓解。

用户数据一般都是以文件的形式存储在存储设备上的。本文在前人研究的基础上,从文件系统特征出发,根据数据的类型和特征,把用户数据、文件元数据(meta)、日志数据(Journal)写入到不同的存储空间。该算法不仅改善了系统突发写入性能,而且改善了SLC缓存空间耗尽下系统的写入性能,同时兼顾了系统的寿命。

1 相关工作

1.1 闪存类型

闪存根据其存储密度,一般分为SLC、MLC和TLC。SLC(Single Level Cell),指闪存每个存储单元存储1比特的数据;MLC(Multiple Level Cell)和TLC(Triple Level Cell)则是指每个存储单元能存储2比特和3比特的数据。同SLC相比,在同样尺寸的晶元上,MLC和TLC存储的数据量分别是SLC的2倍和3倍。闪存密度的提升增加了闪存的容量,降低了闪存单比特的成本。但是,闪存密度提升带来的不利因素则是闪存性能的下降以及闪存寿命的降低。

从表1可以看到,TLC写入性能只有SLC的1/3,这就是为什么需要SLC缓存来提升系统突发写入性能的原因。在擦写次数(寿命)方面,TLC只有SLC的1%,TLC的耐写性大大减小,因此在使用SLC缓存提升性能的同时,还需要考虑到SLC缓存对TLC寿命的影响,SLC缓存算法应该尽量减小对系统寿命的影响。

表1 SLC、MLC和TLC参数对比表[7]

1.2 SLC缓存算法分析

为了解决TLC等高密度闪存性能差的问题,SLC缓存设计被应用到固态存储设备中。在一个基于TLC的固态存储设备中,一部分TLC配置成SLC工作模式,数据会被临时写到SLC缓存中,然后这些数据最终需要存储到TLC闪存空间。典型的SLC缓存架构如图1所示。

假设用户写入的总数据量为T,其中写入到SLC缓存的数据量占比为x(0≤x≤1),则直接写入到TLC中的数据量占比为1-x。在释放SLC缓存空间的时候,假设从SLC到TLC搬动的有效数据占比为y(0≤y≤1)。写入到闪存的数据包括:

(1) 用户写到SLC缓存的数据:T×x。

(2) 用户直接写到TLC的数据:T×(1-x)。

(3) SLC缓存垃圾回收写入到TLC的数据:T×x×y。

总共写入到闪存的数据量为T×(1+x×y),因此SLC缓存机制引入的写放大为:

WA=T×(1+x×y)/T=1+x×y

(1)

可以看出,SLC缓存会导致额外的写放大(1+x×y),具体来说,写入到SLC缓存的数据量(x)越多以及SLC缓存垃圾回收时搬动的有效数据(y)越多,则写放大越大,对系统寿命影响越大,反之亦然。

在SLC数据向TLC迁移的垃圾回收时,搬动的数据越少(即y越小),则写放大越小,对系统性能和寿命影响越小。而该数据与缓存在SLC的数据类型紧密相关。

(1) 如果冷数据(即不经常更新的数据,比如视频、图像、音频等类型数据)写入SLC缓存空间,这些数据在SLC缓存期间几乎不会被更新或重写,在腾出SLC空间的时候,有多少数据写入到SLC缓存,就几乎需要原封不动地把这些数据迁移到TLC。这意味着对冷数据,y接近1,冷数据写入到SLC缓存对系统性能和寿命影响最大。

(2) 如果数据是热数据(即被频繁更新的数据),这些数据在写入到SLC缓存的时候,很大概率会被更新,因此在释放SLC缓存空间时,往TLC搬动的数据占比y会远小于1。因此热数据适合写入到SLC缓存空间,性能提升的同时,对系统性能和寿命影响很小。

(3) 特别地,有些系统数据(比如文件系统的日志文件),系统写入的时候是在一个存储空间循环写入,这些数据如果被写入到SLC缓存空间,会导致整个SLC块被变成无效,因此在回收SLC缓存空间的时候,不需要做真正意义上的垃圾回收,只需执行SLC块的擦除操作,无须数据的搬移,即y=0。对于这种数据类型,即使触发垃圾回收,因为无须数据搬移,系统性能和寿命都能同时保证。但这前提是必须避免这些数据和热数据混合写入到SLC缓存,否则在做垃圾回收的时候,还是需要把热数据搬移到TLC空间。因此对诸如日志文件类型的数据,应该写入到单独的SLC缓存空间。

1.3 日志文件系统[8]

本文以主流的EXT4文件系统为例,来分析文件数据类型。EXT4是第四代扩展文件系统,是Linux系统下的日志文件系统,其数据类型包括用户数据、文件元数据(meta data)和日志(journal)数据。文件元数据是文件系统管理文件所需的数据,而日志数据则是用来确保文件数据一致性而加入的数据。

EXT4有三种日志模式,分别为:journal、ordered、writeback。

(1) journal模式。journal模式提供了完全的数据块和元数据块的日志,所有的数据都会被先写入到日志里,然后再写入存储设备上。在文件系统崩溃的时候,日志就可以进行重放,把数据和元数据带回到一个一致性的状态。journal模式性能是三种模式中最低的,因为所有的数据都需要日志来记录。

(2) ordered模式。ordered模式下,EXT4文件系统只提供元数据的日志,但它逻辑上将与数据更改相关的元数据信息与数据块分组到一个称为事务的单元中。当需要把元数据写入到存储设备上的时候,与元数据关联的数据块会首先写入。也就是数据先写入,再做元数据的日志。

(3) writeback模式。writeback模式下,当元数据提交到日志后,数据可以直接被提交到存储设备,即会做元数据日志,数据不做日志,并且不保证数据比元数据先写入到磁盘。

对用户数据和元数据来说,包含有频繁更新的数据(即热数据)和不频繁更新的数据(即冷数据),取决于用户存储的数据类型;而对日志数据来说,主机为它分配一个独立的逻辑地址空间,文件系统在这个空间连续写入并循环使用。

本文将针对文件系统类型,尤其是日志文件系统特点,设计一种全新的SLC缓存方案,不仅能提升系统性能,而且能改善在回收SLC缓存空间期间的系统性能,同时又能减小SLC缓存给存储系统寿命造成的影响。

2 方案设计与实现

2.1 非日志文件数据的存储

从前面SLC缓存算法分析可得出结论,热数据和冷数据分开存储,即热数据先写到SLC缓存再回收到TLC空间,冷数据直接写到TLC空间,这样不仅能满足热数据的写入性能需求,而且能减小SLC缓存算法对系统寿命影响。冷热数据的区分,可以在主机端来区分,比如:对视频、图像、语音等数据,主机端根据文件的后缀名,把它标识为冷数据,对其他数据则把它标识为热数据。主机在写这些数据的时候,在相应的写入命令中加上标识。

在设备端,固件根据数据的冷热标识,把数据写到不同的闪存空间,如图2所示。

写入到SLC缓存空间的数据,当SLC缓存满了的时候,需要对SLC缓存做垃圾回收,即把SLC块上的有效数据搬到TLC空间,如图3所示。

热数据由于被频繁更新,因此在SLC块中,很多数据都是无效的,释放出SLC缓存空间需要搬动的有效数据很少,即式(1)中的y很小,因此能减小SLC缓存算法对存储性能和寿命的影响。

2.2 日志文件数据的存储

注意到文件系统中日志数据的特殊性,即顺序写入和循环写入的特点,固态存储设备为其再分配一个独立的SLC存储空间,避免和其他非日志的数据写在同一个闪存空间。这样做的好处是,在释放日志SLC缓存空间的时候,可以快速回收,无须数据的搬移。

因此,在冷热数据分开存储的基础上,SLC空间被分成两部分,一部分用以缓存热数据,一部分存储日志数据,如图4所示。

如图5所示,假设日志文件逻辑空间为LBA 0-MAX,主机按逻辑地址依次写入日志数据,当逻辑空间写满后,主机则又从起始逻辑地址(即LBA 0)写入。假设每个SLC块能写入100个逻辑块的数据,当写满SLC块blockn的时候,block 0的数据则全部变成无效。在回收SLC空间的时候,无须做任何数据的搬移,只需擦除block 0就能得到一个空闲的SLC块。

对日志文件之外的数据,由于写入的随机性和不确定性,因此无法做到零数据搬移的垃圾回收。前述的冷热数据分开存储到不同的闪存空间,能最大化减小垃圾回收时的数据搬移;但对日志数据,根据其写入的特殊性(顺序循环写入),存储设备为其分配独立的日志文件数据缓存空间,做到了零数据搬移的垃圾回收,不仅避免了缓存空间垃圾回收对系统性能的影响,而且避免了闪存缓存空间垃圾回收引入的写放大(y=0)。

2.3 主机和设备实现

在主机端,设备驱动层根据数据类型,给不同的数据打上标志:图像、视频和音频数据(根据文件后缀名)标识为冷数据;日志文件标识为日志数据;其他数据类型标识为热数据。

在主机往设备写数据的时候,文件数据类型标志包含在写入命令当中。

在设备端,实现了相应的SLC缓存算法,主要包括:

1) 为不同的数据类型分配不同的闪存空间(热数据SLC缓存空间、日志SLC缓存空间和主TLC存储空间)。

2) 根据主机写入命令中的数据类型标志,把数据写入到对应的闪存空间。

3) SLC缓存空间垃圾回收算法。

(1) 对日志SLC缓存空间,无须数据搬移就能释放SLC空间,只需执行前台垃圾回收。

(2) 对热数据SLC缓存空间,只做后台垃圾回收,即系统空闲的时候释放SLC缓存空间;如果主机在写入的时候没有足够多SLC缓存空间,热数据会被直接写入到主TLC空间。不做前台SLC缓存垃圾回收,是出于性能考虑,因为直接写TLC性能会比在做垃圾回收时的性能要好,从而避免了系统写入性能出现断崖式下降。

基于文件系统特征的SLC缓存方案如图6所示。

3 实验数据和分析

3.1 实验设置和测试负载

实验目的是验证新的SLC算法在不同的日志模式下,对系统性能的提升以及对系统寿命(写放大)的改善。

主机端使用文件系统为EXT4的Linux操作系统,并加入新的驱动程序,以支持文件系统数据类型的甄别,并在写入命令中打上数据类型标记。

设备端是一块基于PCIe3.0x2的120 GB SSD开发板,后端四个闪存通道,每个闪存通道各挂了一片32 GB的3D TLC闪存。SSD开发板固件分别实现了两种SLC算法:

(1) 传统SLC缓存算法:分配4 GB SLC缓存空间,主机写入的数据(无数据分类)会被先写到SLC缓存,如果缓存耗尽,数据直接写入到TLC空间;在系统空闲的时候,SLC缓存会被后台垃圾回收释放空间。

(2) 新的SLC缓存算法:分配2 GB SLC缓存空间用以存储日志数据;分配4 GB SLC缓存空间存储热数据;冷数据没有SLC缓存空间,直接写入到TLC空间。热数据写入的时候,如果有可用的SLC缓存空间,数据会被写入到SLC空间,否则,热数据则被直接写入到TLC空间。在系统空闲的时候,SLC缓存会被后台垃圾回收释放空间。

3.2 性能数据对比

我们使用Filebench来生成各种实际工作负载,然后测试对应负载下的性能数据。结果如表2、图7、图8所示。

表2 不同的测试负载

从测试结果来看,无论是在Journal模式还是在Ordered模式下,本文提出的SLC缓存方案较传统SLC方案在性能上都有不同幅度的提升,尤其是在日志数据占比比较大的情况下,比如Varmail在Journal模式下,性能提升达到50%,这得益于独立的日志数据SLC缓存空间的使用。独立的日志SLC缓存空间,在写入日志数据的时候,即使在SLC缓存耗尽的情况下,由于其无须做真正的数据搬移就能释放SLC空间,保证了日志数据总是能写入到SLC空间,从而提升了整个系统性能。

3.3 写放大数据对比

测试使用FIO生成如表3所示测试序列。

表3 FIO测试负载

基于上面的负载,分别做两个测试:一个测试是脚本不断运行,其间没有空闲时间;另一个测试是脚本中间加入足够多的空闲时间。两者的差异是,前者由于设备一直处于工作状态,没有后台操作来清空热数据的SLC缓存空间,所以冷热数据几乎都会被直接写到TLC空间;而后者,设备有空闲时间,它会在空闲的时候把SLC缓存上的数据搬到TLC空间,所以主机写入的热数据,几乎全部会写入到SLC缓存中。测试结果如图9、图10所示。

与传统SLC缓存方案相比,本文提出的基于文件系统特征的SLC缓存方案能大大减小写放大,从而提升闪存的寿命。同样的SLC缓存方案,我们可以看到,当系统有空闲时间的时候,系统写放大会比没有空闲时间的时候要大。那是因为,当系统没有空闲的时候,主机写入的数据在SLC缓存写满后,会被直接写到TLC中;而当系统有足够多的空闲时间,主机写入的数据(热数据)几乎被全部写入到SLC缓存中,之后被后台垃圾回收把数据从SLC缓存空间搬移到TLC空间。根据前面的分析(式(1)),主机写入到SLC缓存空间的数据越少,SLC缓存导致的写放大越小,反之亦然,实验结果和理论分析相符。

4 结 语

传统SLC缓存方案解决了基于TLC存储空间突发写入性能不足的问题,但它会引入比较大的写放大,从而影响系统写入寿命;另外,当SLC缓存耗尽的时候,系统性能急剧下降的问题没有得到解决。本文提出的基于文件系统特征的SLC缓存方案,把文件数据分为热数据、冷数据和日志数据,尤其是针对日志数据使用独立的SLC缓存空间,大大减小了系统的写放大,同时也提升了当SLC缓存空间耗尽下的系统写入性能。值得注意的是,即使对非日志文件系统,本文提出的热数据进入SLC缓存、冷数据直接写入到TLC主空间的策略,也能减少不必要的数据(没有性能需求的数据)写入到SLC缓存空间,这样有助于改善热数据性能和减小系统的写放大。

猜你喜欢
数据类型存储设备日志
一名老党员的工作日志
华人时刊(2021年13期)2021-11-27 09:19:02
详谈Java中的基本数据类型与引用数据类型
扶贫日志
心声歌刊(2020年4期)2020-09-07 06:37:14
如何理解数据结构中的抽象数据类型
数码世界(2020年5期)2020-06-23 00:14:36
游学日志
Windows 7下USB存储设备接入痕迹的证据提取
基于Flash芯片的新型存储设备数据恢复技术研究
用批处理管理计算机USB设备的使用
一种基于粗集和SVM的Web日志挖掘模型
防止USB接口泄密
个人电脑(2006年11期)2006-11-25 04:36:46