- 项目新技术预研。OpenChannel SSD 和 ZNS SSD
- 主要是资料整理,并考虑应用此类硬件技术到 Ceph.
OC SSD & ZNS
Prepare
- NVM Express™ Specification: NVM Express™(NVMe™) 基础规范最初是为 SSD 设计的,用于帮助定义主机软件如何通过PCI Express®(PCIe®)总线与非易失性内存通信。它已经迅速发展成为各种形式的PCIe固态硬盘(SSD)的工业标准(U.2、M.2、AIC、EDSFF)。NVMe 基本规范提供了一个有效的接口,提供了更低的延迟,比串行ATA (SATA)等传统接口更适合 SSD。https://nvmexpress.org/developers/nvme-specification/
- 此规范目的在于充分利用PCI-E通道的低延时以及并行性,还有当代处理器、平台与应用的并行性,在可控制的存储成本下,极大的提升固态硬盘的读写性能,降低由于AHCI接口带来的高延时,彻底解放SATA时代固态硬盘的极致性能。NVMe是为SSD而生。在此之前SSD都用SATA接口。SATA接口采用AHCI规范,其已经成为制约SSD速度的瓶颈。AHCI只有1个命令队列,队列深度32;而NVMe可以有65535个队列,每个队列都可以深达65536个命令。NVMe也充分使用了MSI的2048个中断向量优势,延迟大大减小。
- Zoned Block Commands (ZBC):定义了SMR盘相关的术语和行为,成为SAS接口SMR盘所必须遵守的规范。
- Zoned-device ATA Commands (ZAC):与ZBC类似,是SATA接口SMR盘所必须遵守的标准。
参考文献
Open-Channel SSD
-
为什么使用 OC SSD?: 以 Ceph 为例。
- 传统的 FileStore 是基于本地文件系统设计的,在索引结构、空间管理、垃圾回收以及日志等方面,FileStore 的不同层级之间其实是有功能的冗余的,这种冗余带来的影响就是较高的软件开销。
- BlueStore 则 bypass 了文件系统,直接在用户空间分配和回收 SSD 的数据块,使用 RocksDB 来进行元数据的管理从而保证一致性,RocksDB 在定制的 BlueFS 上运行,相比于 FileStore,简化的 IO 路径带来了显著的性能提升。但在 BlueStore 和 FTL 中还是有功能冗余,导致两部分彼此隔离,而在实际进行决策的时候可能产生冲突。SSD 的性能和持久性还是未得到充分的利用。
-
Object Store Architecture in Ceph
-
普通 NVMe SSD
-
Open-Channel SSD
-
Open-Channel将本来位于NVMe SSD上Firmware中的对Flash管理和控制的部分功能,交给了Host上的应用软件。让应用根据自身的业务特点,对盘上的Flash进行有效的管理。很多情况下,Host上应用的管理,可以避免在垃圾回收等各类对前端应用IO请求的影响。
-
Open-Channel 向 Host 展示出内部 NAND 布局的细节,Host 可以决定数据实际存放的物理位置。这样,Host 就可以根据 IO 请求的发起方,将 IO 数据写到不同的位置,实现不同应用、用户数据的物理隔离,达到更好的 QOS 效果,如图所示。
-
但就从实际应用的部署情况来看,Open-Channel的使用者需要实现一个复杂的FTL(Flash Translation Layer), 替代SSD中本已健壮成熟的Firmware层实现的功能,来管理NAND flash和数据存放。而且Open-Channel Specification 仅仅定义了Open-Channel涉及的最为通用的部分。不同厂商的SSD产品特性不同,它们或者难以统一,或者涉及敏感内容,不便公开,实际Open-Channel产品往往在兼容Open-Channel Spec的基础上,各有一部分私有定义。不同业务方的需求独特,往往需要在自己的FTL内加入定制化的内容。因此,至今尚未有通用的Open-Channel SSD和针对独特业务的通用FTL。这些制约严重影响了Open-Channel的发展速度。
Ecosystem
LightNVM & PBLK
- 为了方便的管理和操作 Open-Channel SSD,LightNVM 应运而生。LightNVM 是在 Linux Kernel 中一个针对 Open-Channel SSD 的 Subsystem。LightNVM 提供了一套新的接口,用于管理 Open-Channel SSD,以及执行 IO 操作。为了和 Kernel 中现有的 IO 子系统协同工作,还存在 pblk(Physical Block Device)层。他在 LightNVM 的基础上实现了 FTL 的功能,同时对上层暴露传统的 Block 层接口,使得现有的文件系统可以通过 pblk 直接运行在 Open-Channel SSD 上。
- 目前 LightNVM 已经被合并入 Kernel 的主线。而对于用户态的程序来说,可以通过 liblightnvm 操作 Open-Channel SSD。
PPA Addressing
- Physical Page Addressing (PPA) Interface 物理页寻址。
- 通过这个接口暴露SSD的几何结构
- 逻辑/物理几何结构(取决于供应商)
- 性能
- 特定介质的元数据(需要的情况下)
- 控制器功能
- 展示分层的地址空间
- 编码并行的几何结构单元(PUs)到地址空间
- 编码并行的几何结构单元(PUs)到地址空间
- 向量 I/Os
- 读/写/擦除(有效访问给定的新的地址空间)
- 通过这个接口暴露SSD的几何结构
NVMe Device drivers
- 检测open-channel SSD 并实现 PPA 接口
- 启用 LightNVM 的 NVMe 设备驱动程序使内核模块可以通过 PPA I/O 接口访问 open-channel SSD。设备驱动程序将设备作为传统的 Linux 设备公开给用户空间,从而允许应用程序通过 ioctl(专用于设备输入输出操作的系统调用) 与设备进行交互。
PBLK
- 处理控制器和特定介质之间的约束 (例如,缓存必要的数据量来对Flash页进行编程)
- 将逻辑地址映射到物理地址(4KB粒度),并确保完整性,最终在面对关联映射表(L2P)崩溃时进行恢复
- 处理错误和垃圾回收
- 处理flush操作:因为典型的闪存页面大于4KB,flush会强制pblk的运行中数据在完成之前存储在设备上
Write Buffering
- 数据缓冲区,用于存储4KB用户数据入口(4KB对应于一个扇区的大小)
- 上下文缓冲区,用于存储 Per entry 元数据。
- 缓冲区的大小是闪存页大小(FPSZ),要写入的闪存页数(下/上页)和PU数(N)的乘积。如果FPSZ = 64KB,PP = 8,N = 128,则写缓冲区为64MB。多生产者-单消费者模型
Solution
QBLK
- 多队列缓冲
- 每个通道的地址管理
- 无锁地址映射
- 细粒度的刷回
OCStore
- 基于 OC SSD(华为定制的 OC SSD,32 flash channels,每个 block 包含 512 个 pages,每个页大小为 4KB) 和 PFTL 构建的对象存储,直接在原始闪存上管理对象,减少了对象存储、文件系统和FTL层的冗余功能。提供了流事务更新,这不仅确保了利用非覆盖flash写入特性的多页原子性,而且还为独立的I/O流提供隔离,同时支持对不同通道的并行访问。OCStore 还协调不同的通道来支持事务感知调度,从而减少事务级别的延迟,并为分布式存储提供较低的响应时间。显著降低了延迟和写流量。
Zoned Namespace
- OC SSDs 由于缺乏官方标准,一些供应商引入了不同的实现 OpenChannel SSD 接口的方法,导致实现支离破碎。为了防止这种情况发生,主要的供应商联合起来引入了一个新的 NVMe 标准,称为 Zoned Namespace (ZNS),该标准定义了在不使用 FTL 情况下管理 SSD 的接口。
Concepts
- Zoned Namespace(ZNS)是NVMe工作组为增加对定制化需求提供灵活性,而计划加入NVMe协议的新特性。
- Zoned Namespace中的zone名称,源自于为SMR硬盘(Shingled Magnetic Recording, 叠瓦式磁记录)所做的设计。相关标准化组织曾制定了ZBC(Zoned Block Commands,分区块命令集)与ZAC(Zoned-device ATA Commands, 区设备ATA指令集),来对SCSI和ATA协议进行拓展。所以zone所涉及的状态转换与软件栈,都与之前的SMR硬盘相符。
- 相对于正常的 NVMe Namespace, Zoned Namespace将一个Namespace的逻辑地址空间切分成一个个的zone。如图所示,zone是Namespace内的一种固定大小的子区间。每个zone都有一段LBA(Logical Block Address, 逻辑地址空间)区间,这段区间只能顺序写,而且如果要覆盖写,则必须显示的进行一次擦除操作。这样,namespace就可以把NAND内部结构的边界透露给外界。NVMe SSD也就能够将地址映射表等内部管理工作交由host去处理,从而减少写放大、选择合适的GC(Garbage Collection, 垃圾回收)时机。
States And Operations
-
Zone的基本操作有Read, Append Write,Zone Management 以及Get Log Page。Zone大小可以采用Open-Channel中Chunk的大小为单位,即与NAND介质的物理边界为单位。Zone Log Page也会与Open-Channel Spec 2.0中的Chunk Info Log相似。
-
与Open-Channel相比,最大的区别就是在Zoned Namespace中,Zone的地址是LBA(Logical Block Address, 逻辑块地址),Zone X的起始地址与Zone X-1的结束地址相连,Zone X的结束地址与Zone X+1的起始地址相连。Zone的容量总是小于等于Zone的逻辑大小。这样一来,Zone Namespace就可以避免Open-Channel里繁琐的各类地址转换。
-
Zone 状态:
- Emptyzone 内无有效数据
- Explicitly Openedzone 被 Management 命令显式的打开
- Implicitly Openedzone 处在打开状态,但并非是由 Management 命令打开的
- Closedzone 被 Management 命令显式的关闭
- Fullzone 处于写满状态
- Offlinezone 无法被读写
- 一个zone只有在Open状态下才可以写入数据;擦除可以使写满的zone回退到Empty状态;在zone的内部Nand介质达到磨损极限后处于Offline状态。它的正常工作状态变化过程为:Empty → Open → Full → Empty
- ZM(Zone Management,zone管理)command 有
ZM Open
,ZM Close
,ZM Reset
,ZM Finish
等,可以控制zone的状态变化。例如,在正常工作过程中,zone的状态变化需要ZM命令的参与:Empty → <ZM Open
> → Explicitly Opened → <Append Write Operations
>/<ZM finish
> → Full → <ZM Reset
> → Empty
ZNS SSD
限制
- 顺序写约束: 写操作需要按照顺序进行,就像SMR驱动器一样。
- 主机需要直接控制 Zones,如 Zones 打开、关闭、重置和 Zones 垃圾收集。
- 空间利用率较高的时候垃圾收集开销很大,随着利用率增加,垃圾收集的开销增加尤为显著
- 分组访问比单独访问快得多,因为每个 Zone 可能被映射到多个通道,可以利用内部并行性适当地增大 IO 大小来提升性能。
Ecosystem
- 业界也早已为SMR硬盘的推广,添加了很多软件生态。如图所示, 例如在Linux体系中, 有用户态函数库libzbc;文件系统中加入针对SMR的优化;SCSI/ATA驱动增加对SMR相关指令集的支持。
- Linux内核中块设备有对zone支持的zoned block device模型,通用设备映射器(Device Mapper)中加入的dm-zoned device mapper, 可以将一个zoned block device映射为不受追加写限制的通用块设备。开启此类映射需要用到两个工具命令,一个是Device Mapper的工具dmsetup,另一个是zoned block device 专用工具dmzadm (dm-zoned admin).
# dmzadm 格式化 zoned block device /dev/sdb
dmzadm –format /dev/sdb
# 创建通用块设备 -> /dev/mapper/dmz-sdb
dmsetup create dmz-sdb
- 文件系统诸如F2FS、BTRFS中已经有了对zoned block device的直接支持,所以它们可以直接操作zoned block device,绕过DM-zoned。如果一个NVMe SSD的一个Namespace是Zoned Namespace时,F2FS和BTRFS可以直接配置使用它,而无需额外的开发工作。
SPDK
- zonedev layer,它为FTL提供所有所需的操作集,从而屏蔽底层Open-Channel, Zoned Namespace, 以及其他各类第三方的非标准Spec的差异
- OC/Zonedev adapter: 考虑到Zoned Namespace将会被NVMe Spec接纳,zonedev layer 会以Zoned Namespace的定义为标准。Open-Channel设备则需再加入一个OC/Zonedev adapter去将Open-Channel的操作封装适配到zonedev layer中。
参考链接
- [1] Zoned Namespace: NVMe Spec对标Open-Channel的解决方案(上篇)
- [2] Zoned Namespace_NVMe Spec对标Open-Channel的解决方案(下篇)
- [3] DBLP: q=Open-Channel
- [4] A New LSM-style Garbage Collection Scheme for ZNS SSDs
- [5] Open-Channel SSD Read The Docs
- [6] ICDCS19 - Lu Youyou: OCStore: Accelerating Distributed Object Storage with Open-Channel SSDs
- [7] Souhu: 获NVMe Express认可,ZNS标准化又进了一步
- [8] ATC16 - Jiacheng Zhang: ParaFS: A Log-Structured File System to Exploit the Internal Parallelism of Flash Devices
- [9] FAST17 - LightNVM: The Linux Open-Channel SSD Subsystem
- [10] DATE2019 - QBLK: Towards Fully Exploiting the Parallelism of Open-Channel SSDs
- [11] ZONED STORAGE
- [12] 阿里云 - 【阿里云总监课】存储系统设计——NVMe SSD性能影响因素一探究竟
- [13] HotStoreage20 - A New LSM-style Garbage Collection Scheme for ZNS SSDs