Zoned Storage - 介绍
分区存储设备
分区存储设备是一类存储设备,其地址空间被划分为具有不同于常规存储设备的写入约束的区域 zones。
原理
分区存储设备的区域 必须按顺序写入。 设备地址空间的每个zone 都有一个写入指针wp,用于跟踪下一次写入的位置。 区域中的数据不能被直接覆盖。 必须首先使用特殊命令(zone reset)擦除该区域。 下图说明了这一原理。

分区存储设备可以使用各种记录和media技术来实现。 当今最常见的分区存储形式在叠瓦式磁记录 (SMR) HDD 上使用 SCSI 分区块命令 (ZBC) 和分区 ATA 命令 (ZAC) 接口。 ZBC 和 ZAC 支持分区块存储模型; SMR 技术能够实现持续的面密度增长,以满足不断扩大的数据需求,并且需要分区块访问模型。
固态磁盘 (SSD) 存储设备还可以实现分区接口,以减少写入放大、减少设备 DRAM 需求并大规模提高服务质量。 NVMe Zoned NameSpace (ZNS) 是 NVMe 标准委员会在 NVMe 接口标准中增加分区存储接口的技术提案。
Linux 生态系统支持
由于区域的顺序写入限制,分区存储设备不是传统存储设备的plug-and-play 即插即用替代品。 需要特殊的软件和驱动程序来确保应用程序操作符合设备限制。
随着版本 4.10.0 的发布,对分区存储设备的支持被添加到 Linux® 内核中,并支持在不同级别(磁盘驱动程序、文件系统、设备映射器驱动程序)的分区存储,为支持应用程序提供了广泛的选项 . 这种支持基于分区块设备 (ZBD) 抽象。
一个zoned块设备是独立于设备访问协议和接口的分区存储设备的通用表示。 这种抽象是 Linux 内核支持分区存储的基础。
与 ZBD 设备抽象相关的接口是对传统 Linux 块设备接口的扩展。 ZBD 接口与设备驱动程序相结合,为内核子系统(例如文件系统)和用户应用程序提供了一个通用的区域管理接口,该接口与所有分区设备类型和访问协议兼容。
下图显示了包括 ZBD 接口在内的内核结构的简化视图。

Linux ZBD 接口实现提供了发现分区设备的区域配置的功能和管理区域的功能(例如区域重置)。 此外,Linux 内核 ZBD 支持还修改了内核块 I/O 堆栈,以确保满足设备访问约束(区域跨越命令、顺序写入顺序等)。
为分区存储而开发
有几种方法可以为分区存储设计系统应用程序,具体取决于一个人的系统结构和修改应用程序层和正在使用的 Linux 内核的能力。
- 拥有软件应用程序且不依赖于操作系统和文件系统来控制设备的用户可以直接使用设备接口协议通过直通接口发出区域管理命令。 在这种情况下,应用程序将需要使用新的命令集重新编写,并确保所有数据流都是连续的。 libzbc 库提供有助于使用这种方法实现应用程序的功能。
- 直接从应用程序层管理分区存储是一种有效的方法,但可能难以实施,特别是对于必须组合多个设备功能的用例(例如使用 I/O 优先级)。 应用程序级支持可以通过依赖内核 ZBD 支持来简化,该支持允许使用常规 POSIX 系统调用访问和管理分区设备。 虽然这不会从应用程序范围中移除分区设备访问限制,但可以简化顺序写入流和区域管理的实现。
- 如果用户在保留对 Linux 内核版本选择的控制权的同时缺乏应用程序级别的软件控制,则可以使用更高级的内核支持功能(例如符合 ZBD 的文件系统)来对应用程序隐藏分区存储访问限制。 用户还可以依赖设备映射器驱动程序将分区存储设备公开为常规块设备。 通过这样的解决方案,可以使用现有的文件系统而无需任何修改。
NVMe Zoned Namespaces (ZNS) SSDs
分区命名空间 (ZNS) SSD 代表了主机软件和基于闪存的 SSD 之间的新功能划分。 ZNS SSD 将其容量分组到区域中,每个区域可以按任意顺序读取,但必须按顺序写入。 这些特性允许 ZNS SSD 改进其内部数据放置,从而通过更高的写入吞吐量、更低的 QoS 和增加的容量来实现更高的性能。
注意 请参阅 ZNS: Avoiding the Block Interface Tax for Flash-based SSDs 以深入了解 ZNS SSD。 该文章发表于 USENIX ATC 2021。
概述
ZNS SSD 遵循分区存储模型。 这种基于标准的架构采用统一的存储方法,使 HDD 和 ZNS SSD 中的叠瓦式磁记录 (SMR) 能够共享统一的软件堆栈。 特别是对于 ZNS SSD,区域抽象允许主机将其写入与基于闪存的 SSD 的顺序写入所需属性对齐,从而优化在 SSD 介质上的数据放置。 请注意,介质可靠性的管理仍然是 ZNS SSD 的唯一责任,并且应该以与传统 SSD 相同的方式进行管理。

ZNS 分区存储模型
ZNS 命令集规范建立在为 SMR 硬盘引入的现有主机管理分区存储模型的基础上,采用 SCSI ZBC(分区块命令)标准和 ATA ZAC(分区 ATA 命令)标准。 定义了兼容的区域状态机,并定义了一组类似的区域块命令。
这些相似之处简化了主机存储堆栈和应用程序的实施,以同时支持主机管理的 SMR 硬盘和 ZNS SSD。
鉴于 ZNS SSD 通常是使用非易失性存储器实现的,ZNS 规范引入了额外的功能来启用这种类型的介质,如下所述。
Zone 类型
ZBC 和 ZAC SMR 硬盘可以选择性地公开许多接受随机写入操作的常规区域。 ZNS 规范没有定义这组可选的随机写入区域,因为 NVMe 支持多个命名空间,因此可以公开一个支持常规 I/O 访问的单独命名空间。
Zone容量和Zone大小
ZNS 规范引入了 Zone Capacity 的概念。 这个概念在 ZBC 和 ZAC 标准中没有定义。
与 ZBC 和 ZAC 标准类似,ZNS 将 Zone Size 定义为区域内逻辑块的总数。 Zone Capacity 是每个区域的附加属性,从每个区域的第一个逻辑块开始, 指示每个区域内可用逻辑块的数量,Zone Capacity 始终小于或等于Zone Size。
引入此新属性是为了允许Zone Size 保持为逻辑块数量的两倍(便于逻辑块到区域编号的转换),同时允许优化区域存储容量到底层介质特征的映射。 例如,在基于闪存的设备的情况下,Zone Capacity 可以与闪存擦除块的大小对齐,而不需要设备实现大小为 2 的幂次方擦除块。

由于再 Zone Capacity 和 zone 末端之间的逻辑块地址没有映射到任何物理存储块,因此对这些块的写访问将导致错误。 因此,在该区域中的读取与读取未写入块时的处理方式相同。
当写入块的数量等于zone capacity时,zone capacity小于zone size的区域将转换为 full 状态。
注意 控制器报告的总命名空间容量总是等于区域定义的逻辑块的总数。 换言之,该报告的容量包括区域容量低于区域大小的不可用逻辑块。 命名空间的可用容量等于所有区域容量的总和。 如果命名空间包含区域容量低于区域大小的区域,则此可用容量始终小于报告的命名空间容量。
Active区域
控制器实现通常需要分配内部资源(例如写入缓冲区)来执行区域的写入操作。 因此,对控制器可用资源总量的限制可能意味着对可以同时处于隐式打开或显式打开条件的区域总数的限制。 ZNS、ZBC 和 ZAC 标准中类似地定义了对开放区域的最大数量的潜在限制。
然而,ZNS 规范定义了对可以处于隐式打开、显式打开或关闭条件的区域数量的附加限制。 具有这种条件的任何区域都被定义为活动区域,并且对应于正在写入或仅部分写入的任何区域。 ZNS SSD 可能会对可以活动的区域的最大数量施加限制。 此限制始终等于或大于开放区域的最大数量限制。
这一新限制对用户应用程序施加了新的限制。 虽然命名空间的最大开放区域数仅限制了应用程序可以同时写入的区域数,但活动区域的最大数限制了应用程序可以选择用于存储数据的区域数。 如果达到活动区域的最大数量,则应用程序必须重置或完成一些活动区域,然后才能选择其他区域来存储数据。
与打开区域的最大数量限制类似,命名空间的活动区域的最大数量限制不会影响读取操作。 无论当前打开和活动区域的数量如何,始终可以访问任何未脱机的区域以进行读取。
Zone Append
NVMe 规范允许设备控制器以任意顺序执行多个可用提交队列中的命令。 这对主机 IO 堆栈有影响,即即使主机顺序提交针对区域的写入命令,这些命令也可能在处理之前重新排序,并违反顺序写入要求,从而导致错误。 主机软件可以通过将每个区域未完成的写入命令数限制为一个来避免此类错误。 这可能会导致性能下降,尤其是对于主要发出小型写入操作的工作负载。
为了避免这个问题,ZNS 规范引入了新的 Zone Append 命令。
区域追加命令是指定区域内的第一个逻辑块作为写入位置的写入操作。 执行命令时,设备控制器在指示的区域内写入数据,但在当前区域写入指针位置进行。 写入位置的这种变化是自动的,并且数据的有效写入位置通过命令完成信息指示给主机。 这种机制允许主机同时提交多个区域附加操作,并让设备以任何顺序处理这些操作。
下图说明了常规写操作和区域追加写操作之间的区别。

在上面的示例中,主机必须向同一个区域发出三个不同的数据 A (4KB)、B (8KB) 和 C (16KB) 写入操作。 使用常规写入命令,这只能在每个区域 的写入队列深度为 1 下安全地完成,即主机必须等待未完成的写入操作完成,然后才能发出下一个写入请求。 对于每个写请求,写位置必须等于区域写指针位置。 这导致数据以与发布时相同的顺序存储在区域中。
使用区域追加写操作,写队列深度限制被删除,主机可以同时发出所有三个写请求。 在完成所有写入请求后,区域写入指针位置与前一种情况相同,因为写入的数据总量相等。 然而,区域内写入数据的位置可能不对应于主机命令发出顺序,因为设备控制器可以自由地重新排序命令执行,因为它认为合适。 主机可以通过区域追加完成信息发现每个请求的有效写入位置。
分区存储技术详解:ZNS SSDs与Linux支持
分区存储设备,如ZNS SSDs,遵循顺序写入原则,利用分区存储模型优化写入性能和容量。Linux内核自4.10.0版本开始支持分区存储,提供Zoned Block Device (ZBD)抽象以兼容各种分区设备。ZNS SSDs引入Zone Capacity概念,允许更好的介质容量管理,并通过Zone Append命令提高写入效率。
919

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



