论文精读 | ZNS+:支持存储器内区块压缩的高级ZNS接口

论文标题:

Advanced Zoned Namespace Interface for Supporting In-Storage Zone Compaction

论文地址:

http://nyx.skku.ac.kr/?page_id=2808

本系列是对论文的要点笔记。


这篇文章针对当前日志文件系统LFS在段压缩方面的高消耗问题,提出了ZNS+以及其对应的文件系统技术,主机可以将数据的复制行为下放到SSD存储器层面异步处理从而避免阻塞,在ZNS+中,允许区块基于线程日志的块回收来取代块压缩。

总体介绍

在NVMe ZNS 命名空间接口中,逻辑地址空间被划分为大小固定的zone(zone storage介绍)。每个内存域内必须按顺序写入,并reset后重用。在F2FS的文章中有介绍,F2FS将section作为垃圾回收的单位,当触发垃圾回收的时候,会给主机带来额外开销,LFS机制下,一个脏段的废弃块必须通过段压缩来回收,它将该段中的有效数据移动到其他段,以使得段干净。合并的过程会调用大量的复制操作,特别是在文件系统利用率很高的情况下,倘若设备端不支持垃圾回收,主机端的垃圾回收是一个不得不执行的动作,由于主机端的块复制动作需要IO请求处理、主机到设备的数据传输、对读数据的页分配等主机端额外动作,主机端垃圾回收开销比设备端垃圾回收消耗更多。

有研究表明,F2FS在文件系统利用率为90%的情况下,压缩操作造成的性能损失约为20%。而且随着嵌入更多的闪存芯片来增加SSD的带宽,ZNS的采用更大的segment大小,段合并的开销也随之增加。要解决这个问题,我们可以考虑两种方法:压缩加速及压缩避免

压缩加速方面,文章提出了一种新的LFS-aware的ZNS接口,ZNS+以支持设备内区块压缩和稀疏顺序覆写。接口实现了一个新的函数zone_compaction和TL_open两个新命令,将块压缩过程中数据复制部分下放到SSD上执行,实现压缩加速。

压缩避免方面,LFS可以采用线程日志的回收方案,通过重写新数据来回收现有脏段中的无效空间,它不需要清洗操作,但会产生对段的随机覆写,与段压缩相比,线程日志显示出更小的写流量和更高的性能。然而,这一个随机写的特性并不被ZNS所允许,ZNS+提供命令TL_open来允许线程日志稀疏顺序覆写。

为适应ZNS+特性,文件系统还需要进行调整,首先,SSD内部数据复制操作根据源和目的逻辑块地址使用不同的顺序路径,例如,对于数据在一个闪存芯片内移动的,利用闪存的copyback回拷操作,无需片外传输,降低数据迁移延迟。为了充分利用回拷操作,文章还提出了一种分段压缩块分配方法,尝试使得目标和源数据的逻辑地址映射到同一闪存芯片上。其次,由于ZNS+同时支持两种段回收策略,文件系统应该综合考虑两者优缺点,选择合适的策略。

背景

2.1 SSD架构

现代SSD由多个闪存芯片组成,采用多通道、多路并行结构,有多个并行的闪存控制器(通道),每个控制器可以交错访问多个闪存芯片(方式)。每个闪存芯片chip有多个闪存擦除块block,每个块由多个页page组成,在相应的block块被擦除之前,page不能被覆写,因此SSD采用了错位更新的方案,采用一种特殊的固件闪存转换层FTL来管理逻辑到物理的映射,将逻辑地址转换为表明闪存芯片内的物理地址,在最近的产品中,闪存页大小通常大于逻辑块大小,多个逻辑上连续的块写入集群中一个物理flash页面。

闪存芯片一般支持回拷命令用于闪存芯片内部内存页之间的数据复制,无需片外传输。复制操作的基本单位是block。

2.2 ZNS SSD分区映射

通过一个逻辑块地址,如何找到数据存放在哪一个页上?这就需要了解ZNS SSD的分区映射了,首先,根据zone大小,一个zone可以映射到一个或多个闪存物理块,称为闪存物理块组(Flash Block Group,FBG),区块大小应当与内存块大小对齐以避免部分有效的闪存块存在。一个FBG需要并行地放在闪存芯片上,这样的一组闪存芯片定义为闪存芯片组Flash Chip Group,FCG(见下图),如果定义一个zone跨越的并行芯片数目称为区块交错度Dzone,定义一个SSD最大并行闪存芯片数定义为Dmax,显然Dzone<Dmax且Dmax需要能被Dzone整除才能使得一个SSD的所有并行闪存芯片都被划分为相同大小的闪存芯片组FCG。跨并行闪存芯片上的逻辑上连续的块的集合称为条带stripe。对于粗粒度的zone-FBG映射,一个FBG在不同闪存芯片中具有相同的页偏移量。

9cd81a56d16da6a181027e1221fb87d9.png

映射过程如上图,一个逻辑地址被划分为Zone ID(含FCGID)、StripeID、ChipID和块内偏移,FCGID、StripeID、ChipID的位长度由对应表示项目的数目决定,为项目数量对2的对数(位长度一定能完全无歧义地表示项目,如有上图每组有4个chip,chipID位需要2位),从逻辑块地址就可以实现zone内地址的直接映射。ZNS SSD只需要管理zone到FBG的映射关系,其余的直接通过逻辑地址映射,是一种粗粒度的映射

如上例,ZoneID段首先找到FCG后查表映射到对应的FBD,找到FBD后,剩余的逻辑地址直接映射出对应的stripe和chip,就定位到了数据所在的那一个连续块chunk地址,再结合块内偏移,确定数据位置。

ZNS+接口和文件系统支持

一般段压缩过程包括4个任务:“受害者”段选择一个压缩代价最低的段①、从目标段中分配连续的空闲空间②、有效数据拷贝③和元数据更新④,如下图3(a)所示:

3681d279f9a3b1057b00e6193150a4d0.png

其中最耗时间的是有效数据拷贝阶段的一读一写。如果受害段中的数据没有在内存中,需要多次读请求,如果读请求的大小与闪存芯片的并行度比较小,闪存芯片会有很多空闲间隔(上图左边idle),在所有读请求完成后,文件系统发出一个大的写请求来减少处理开销,因此必须等待所有读请求的完成,而不能在一个读请求完成后立即下发写请求(上图右边idle)。图3(b)展示了在ZNS+提供的方案下压缩过程,数据拷贝过程被卸载到SSD设备上进行,免除了页缓存分配、最大化闪存芯片利用率且同一芯片内可以利用回拷操作。

3.2 LFS-aware ZNS+接口

c6a4d62a14b083c062be1d7406b893ac.png

ZNS+支持三个新命令,zone_compaction用于请求设备级区块压缩IZC操作。作为比较,当前的ZNS标准的简单复制命令提供了一个连续的目标LBA范围,而在ZNS+接口中,目标范围可以是不连续的,可以指定一组LBAs。TL_open用于打开线程日志记录的区域,使用该命令打开的区块TL_opened可以在不复位的情况下被覆写,且请求可以是稀疏顺序的。主机可以调用identify_mapping命令来知道决定每个块的映射flash芯片的地址位域。

3.2.1 内部区域合并

在ZNS+存储过程中,分段压缩的过程如下:

(1) 缓存页面处理

第一步是检查受害者段中每个有效块对应的页面是否正在主机DRAM上缓存,如果缓存的页面是脏的,需要将其写入目标段并且从设备级段合并IZC操作中排除。如果缓存页是干净的,它可以通过写请求写入,也可以通过zone_compaction在设备内部复制。

(2) 拷贝卸载

将数据拷贝操作卸载到ZNS+SSD中,生成zone_compaction(source LBAs, destination LBAs)命令(第i个source复制到第i个destination),当F2FS启用了线程日志功能时,段压缩可以选择TL_opened段作为目标,其随机读写特性可以提高效率,目标LBAs可以是不连续的。

(3) IZC处理

ZNS+SSD处理zone_compaction命令,当一个块中 所有块都必须被复制时,它是可回拷的,采用回拷命令处理,否则按照flash读写操作处理。

zone_compaction命令的处理是异步的。主机发出的压缩命令会进入命令队列,主机不会等待命令完成。在完成预先发布的区域压缩之前,主机可以立即下发后续的IO请求,异步处理可以消除后续请求的等待时间来提高性能,由于LFS的checkpoint机制,异步命令完成前,Log不会被删除,不会损害文件系统的一致性。且在异步机制下,处理区域合并时对于待决的正常请求,可以进行重新排序,可以直接读的读请求可以直接处理。

3.2.2 稀疏顺序覆写

ZNS+支持稀疏顺序覆写,支持LBA顺序插入合并(LBA-ordered Plugging)和物理地址顺序插入合并(PPA-ordered Plugging)。

3ed13cd2a8a8b1d6a8c8843cf6bf5518.png

具体流程见上例,有一个segment1被映射到zone1上,查表zone1被映射到FBG6上,其存储如图中FBG6所示,当我们调用TL_open为这一个zone启用了线程日志ZNS+ SSD将重置写指针并分配一组新的FBG,称为LogFBG(保证在一个FCG中),新的数据将往LogFBG中写,如上例,SSD分配了FBG15作为新的FBG并维护其映射关系,这里的重置写指针并不会擦除数据,而在当TL_opened区块被线程日志覆写时,所有的有效块(上图中非阴影)都会被复制到LogFBG并保证同一个连续块chunk映射到同一个芯片上以支持回拷,分配的LogFBG段数量由TL_opened段数量决定,在F2FS中最大为6,因此LogFBG带来的 空间开销可以忽略不计。当TL_opened区块最终关闭时,LogFBG将替换原来的FBG。在上例中,LBA-ordered插入是指当SSD接收到对PQ的写入chunk0的请求时,通过FBG6可以知道chunk0中存在AB两个有效块,于是将AB和PQ合并,作为一个完整写入请求,写入到LogFBG中并移动WP,在处理完chunk0的写入请求后,SSD可以提前通过该区块的有效位图感知到chunk1都是有效块,可以跳过处理,直接一整个chunk复制到LogFBG,移动WP,为写入chunk2做准备,LBA-ordered的插入操作始终发生在WP处。但是我们可以观察到对于chunk3由于它是完全有效的,在WP还没到达前,就可以提前复制,这样flash块中的flash页面依旧是按顺序编写的,这就是PPA-ordered的插入操作,它不一定发生在WP处,它只考虑物理地址的顺序写约束。PPA-ordered的插入(plugging)检查提前对闪存块发出所有可能的插入操作,且这些操作会在对于芯片空闲时后台处理。

为什么线程日志记录可以提高性能?

①避免了数据重定位的元数据修改,②没有额外复制,③利用空闲的闪存芯片隐藏了内部插入的成本,④将插拔操作分布在正常的写请求之外。

3.3 ZNS+-aware LFS 优化

在文件系统层,ZNS+也做了部分优化,优化集中在提高回拷利用率及根据实际情况选择对应的回收方式上。

LFS存在回拷利用率低的情况,因为LFS在段合并的过程中,可能会出现跨芯片压缩的情况,如下图(a)。CD和KL发生了从chip1到chip0的传播。

d8b40386f9582245419b152cc66863dc.png

为了最大限度地利用回拷,文章提出了回拷感知的块分配,在分配过程中,文件系统在目标段保留和有效块数目相同的连续的空闲块,在分配时,为源段中每个完全有效的块分配相同芯片的目标块位置(FCGID和chipID可以提供这个信息),在处理完完全有效的目标块后,再填满所有空闲空间,如上图b。

在这个过程中,可能存在部分完全有效的块无法从一开始保留的空闲块中找到合适的位置的情况,为了最大化回拷利用率,可以再分配额外的块,但是最多可分配的额外块数量存在限制。

虽然线程日志可以降低块回收开销,但是其回收效率可能低于段压缩。所以为了提高整体效率,文章对此部分进行了相关建模,文件系统将估算成本,选择线程日志记录或简单的段合并操作

实验部分可以阅读原文。

结论

当前的ZNS接口为了简化SSD设计对主机存储回收开销较大,为了优化整体IO性能,需要将每个存储管理任务放置在最合适的位置,使主机和SSD能够协同工作,为了将块复制操作卸载到SSD,我们设计了ZNS+,它支持设备级区域压缩和稀疏顺序覆写,为了充分利用ZNS+的新特性,文章还提出了ZNS+感知的文件系统技术例如回拷感知的块分配和混合分段回收。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值