如何启用NVMeZNS

描述

如何启用NVMeZNS

ZNS的硬件变化

在较高层次上,为了启用ZNS,市场上的大多数SSD只需要更新固件。ZNS对SSD控制器或其他硬件组件没有任何新的要求,仅通过更改固件,就可以为现有SSD实现此特性。

硬件中的关键因素在于SSD被设计成只支持ZNS。首先,也是最重要的一点,只使用ZNS的SSD不需要像传统企业SSD那样过度配置。ZNS SSD同时负责执行磨损平衡,但不再需要为垃圾回收过程提供很大的备用区域。使用得当,ZNS允许主机软件避免SSD内部写入放大(Write Amplification,即WA)的几乎所有情况。企业级SSD通常使用高达28%的超额配置比率(在典型的3 DWPD模型上,每1024GB闪存可用800GB), ZNS SSD可以将几乎所有的容量暴露给主机系统,同时不会影响高持续写性能的能力。ZNS SSD仍然需要一些备用容量(如用于应对闪存耗尽时突然出现的故障),但西部数据表示,预计ZNS在过载比率方面可以降低大约10倍。

存储设备

对WA的更好控制也意味着在某些用例下QLC NAND是一个更可行的选择(否则需要TLC NAND)。企业存储工作负载经常导致WA因子为2-5倍。使用ZNS,SSD本身几乎不会引起WA,而合适的主机软件可以避免引起很多WA,因此总体效果是提高SSD寿命,弥补QLC相对于TLC较低的耐久性。即使在ZNS SSD中,QLC NAND从根本上还是比TLC慢,但是在SSD中几乎消除了后台数据管理,意味着基于QLC的ZNS SSD可以在QoS指标上与基于TLC的传统SSD竞争(尽管总吞吐量更低)。

ZNS支持的另一个主要硬件更改是DRAM需求的大幅降低。在传统的基于块的SSD中,闪存转换层(FTL)需要1GB的DRAM来处理1TB的NAND闪存,用来存储地址映射或间接表,记录当前存储每个逻辑块地址(LBA)的物理NAND闪存地址。1GB / 1TB是FTL以4kB粒度管理flash的结果。ZNS消除了这一需求,它让SSD管理每个区域数百MB的整个区域。追踪包含每个区域的物理NAND擦除块现在只需要很少的内存,甚至可以用控制器上的SRAM来完成,甚至可以用几十TB闪存的SSD。ZNS并不能让SSD完全不需要DRAM,因为SSD对每个区域需要存储的元数据比传统FTL需要为每个LBA存储量要大,同时SSD可能会使用一些DRAM缓存。

软件模型

为了与分区存储设备一起工作,为传统块存储设备编写的驱动程序(和其他软件)需要进行一些修改。最明显的是,主机软件必须遵守只能在区域内按顺序写入的新约束,但光这样还不够。分区存储还使主机软件负责更多的数据放置管理工作,处理这项工作首先要跟踪每个区域的状态。这比听起来要复杂得多,ZNS采用与主机管理的SMR硬盘相同的可能区域状态概念。技术上,分别对应SCSI和ATA命令集的ZBC和ZAC扩展:

存储设备

这7个圆圈中的每一个都表示ZNS SSD上某个区域的可能状态。这七个状态中的一些状态有一个明显的目的:空区(Empty)和满区(Full)被明显标识出来。

(一个区域在没有存储满其容量下,可以被置于Full状态。在这些情况下,将一个区域置于Full状态就像在烧录后完成光盘:在该区域被重置(擦除)之前,不能再写入任何内容。)

只读(Read Only)和离线(Offline)状态是当硬盘的闪存失败时使用的错误状态。虽然ZNS SSD减少了写放大,但仍需要在硬件层面上执行损耗均衡。只读和离线状态只在整个硬盘生命周期结束时才会出现。因此,许多以分区存储为目标的软件不会对这些状态做任何事情,一旦一个分区进入其中一种状态,就会简单地将整个设备视为死机。

现在还剩下三种状态:隐式打开(Implicitly Opened)、显式打开(Explicitly Opened)和关闭(Closed)。

处于这三种状态之一的区域被认为是活动的。在任何给定时间,硬盘往往会限制可以打开(显式或隐式)或活动区域的数量。产生这些限制是因为活动区域或开放区域需要一些额外的跟踪信息。对于每个活动区域,硬盘需要跟踪写指针,该指针指示该区域已经使用了多少容量以及对该区域的下一次写操作将在何处进行。写指针对于满区或空区不需要,因为满区不能接受更多的写操作,空区将从区域的开头写入。

存储设备

一个区域必须打开才能接受新的写操作。区域可以通过简单地发出写命令隐式地打开,也可以使用区域管理命令显式地打开(该操作实际上不写新数据)。

隐式和显式打开区域之间的区别在于:SSD控制器可以自由地自动关闭通过写命令隐式打开的区域;显式打开的区域只有在主机软件发出命令时才会处于关闭状态。

如果ZNS SSD打开的区域数量达到最大值,并且它们都是显式打开的,那么任何打开新区域的尝试都将失败。但是,如果其中一些区域只是隐式打开的,那么尝试打开一个新区域将导致SSD关闭其中一个隐式打开的区域。

开放区和关闭区之间的区别允许硬盘保持对内部资源的实际限制,以处理对区域新的写操作。在某种程度上,这只是从SMR硬盘的延续,但在闪存如何工作方面有一个相关的限制。现在,NAND闪存通常有大约16kB的页面大小,但是ZNS SSD仍然支持对单个LBA的写操作,通常是4kB(或512字节)。这意味着写入一个区域可以使闪存单元在一个部分编程的状态。即使在只执行页面大小和正确对齐的写操作时,由于SSD通常将页面映射到物理内存单元的方式,单元格可能会一直处于部分编程状态,直到进一步的写操作到达。

存储设备

处于部分编程状态的闪存单元很容易发生读取干扰错误,当试图从该单元或相邻单元读取时,可能会改变部分编程单元的电压。Open Channel SSD通过简单地禁止从这类页面读取来处理这个问题,但是分区存储模型试图避免对读取命令施加额外的限制。ZNS SSD通常会缓存最近写入的数据,这样读取命令就可以在不接触部分已编程的NAND页面的情况下进行处理。用于这种缓存的可用内存限制了开放区域的数量。

如果要关闭一个带有部分编程内存单元的开放区域,硬盘有两种选择:使用一些填充数据完成对这些单元的编程,跟踪区域中的漏洞,并希望主机后面不要尝试使用该区域的全部容量;或者硬盘可以一直缓冲最近写入的数据,甚至对于关闭区域也是如此。根据硬盘希望支持的活动区域数量,仍然允许ZNS SSD使用比传统SSD少得多的DRAM,因此这种方法在实践中更有可能被使用。既支持分区IO命名空间又支持块IO命名空间的SSD可能能够同时保持其所有区域处于活动状态或打开状态。

原则上,ZNS SSD可以将每个单独的闪存擦除块作为一个单独的区域,具体大小(可能是几兆字节)取决于底层闪存。这将意味着对单个区域的写入速度限制为对单个NAND闪存die的写入速度。对于最近的TLC NAND闪存,单模写入速度上升到大约82MB/s(三星第6代V-NAND),对于QLC单模写入速度低于10MB/s。在实际中,硬盘倾向于聚集多个擦除块(支持跨多个die和所有控制器通道)的区域大小,这样对单个区域的顺序写(或读)就可以像传统的基于FTL SSD所支持的那样快。

最近的一个带有512GB ZNS原型SSD的西部数据演示显示,该硬盘使用256MB的区域大小(总共2047个区域),但也支持2GB区域。在单个分区的命名空间中,所有区域将使用相同的区域大小,但是硬盘可以支持重新格式化命名空间以更改其区域大小,或者支持使用不同区域大小的多个命名空间。

提示

许多最新的NVMe特性允许SSD和主机软件交换关于数据布局、访问模式和生存周期的可选提示。这是主机的SSD驱动特性,而不需要双方都支持使用该信息。ZNS使区域成为主机必须直接处理的显式概念,但对SSD的其他一些内部操作采用提示方法。

ZNS SSD不执行传统SSD意义上的垃圾回收,但它们仍然负责损耗均衡。这意味着硬盘将不得不重新定位数据到不同的物理NAND擦除块,特别是如果硬盘存储的都是不太会被修改的数据。重写整个区域(比说,256MB)是一项相当大的后台工作,它会对处理来自主机的IO命令的延迟产生显著影响。ZNS SSD可以通知主机,它建议重新设置一个区域,因为它计划很快在该区域上做一些后台工作,并可以通知该项工作多久之后会开始进行。这为主机提供了重新设置区域的机会,如果仍然需要区域中的部分数据,则可能需要主机自己进行一些垃圾回收。(为了帮助处理这种情况,NVMe还添加了一个Copy命令,以便将不同的数据块收集到单个连续的数据块中,而不需要数据离开SSD。)

存储设备

类似地,ZNS SSD可以建议主机将活动区域移动到满状态,可以通过写满区域的剩余容量,或者发出区域Finish命令。

当主机软件同时注意以上提示并采取推荐的操作时,SSD就可以避免几乎所有对性能影响较大的后台操作或写放大操作。但是因为这些仅仅是暗示,如果主机软件忽略它们或者根本不符合要求,SSD仍然有义务在整个后台处理过程中保存用户数据。这可能会有一些副作用,例如在特殊情况下,硬盘必须将开放或活动区域移动到满状态,并且必须编写主机软件来容忍这些事件。完全消除写放大也是不可能的,例如,静态数据可能最终还是需要重写,以防止由于累积的读取干扰错误而产生不可纠正的错误。

支持多个写线程

在一个区域内按顺序写入数据的要求,对软件管理数据,特别是对现有数据的更新提出了明显的挑战。但是,当多个线程想要写入同一区域时,也会造成性能瓶颈。发送到SSD的每个写命令都需要定位到区域的写指针指向的LBA。当多个线程写入一个区域时,在线程检查写入指针的位置和写入命令到达SSD之间存在写入指针可以被另一个线程写入的竞争条件,将导致写入被SSD拒绝。为了防止这种情况发生,软件必须在线程之间同步,以正确序列化对每个区域的写操作。当有更多的线程在写线程时,所产生的锁开销往往会导致写性能下降,并且很难使队列深度超过1。

存储设备

为了解决这个限制,ZNS规范包括一个可选的append命令,可以用来代替write命令。append命令总是定位到区域的开头,但是当SSD开始处理该命令时,它将在写指针所在的位置写入数据。当通知该命令完成时,SSD将数据实际着陆的LBA主机。这消除了同步需求,并允许多个线程同时将新数据写入一个区域,而根本不需要core对core通信。缺点是主机软件变得更加复杂,现在它必须在事后记录数据位置,而不是在写入数据之前尝试分配空间。对于现有的IO API来说,即使是返回数据到达应用程序的地址也是一个挑战,因为它们通常只设置为返回错误代码给应用程序。

存储设备

append命令不是解决这种可扩展性挑战的唯一解决方案;它只是这个NVMe ZNS规范的初始版本中标准化的一个。在原型或非标准的分区SSD中已经提出和实现了其他解决方案。Radian内存多年来一直在其SSD上支持自己的分区存储形式。他们的解决方案是允许在写指针前一定距离内的无序写操作。SSD将缓存这些写操作,并将写指针提前定位到数据目前写入的第一个间隙。还有一项NVMe技术提案正在标准化,即ZRWA(Zone Random Write Area),允许在SSD缓存中对数据进行随机写入和就地覆盖。与Zone Append命令相比,这两种方法在SSD上都需要更多的资源,但可以证明,这使软件开发人员的工作更加轻松。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分