更可靠、更强悍:NVMe 1.4规范深度解读

2019-01-14 02:27张平
微型计算机 2019年16期
关键词:驱动器队列命名

张平

NVMe作为SSD的最主要传输标准,在各个方面都针对NAND颗粒的特性做出了优化。不过随着NAND适用范围变大以及应用程度加强,人们发现NVMe还存在很多可以加强、补足的地方。因此,新的NVMe 1.4规范顺应而出,带来了大量的全新特性,尤其纠错、性能加强以及为特殊领域和企业级的优化更是令人关注。今天,本文就解读一下NVMe 1.4的新特性。

说起来,NVMe的上一次重大更新还是在大约2年以前。在这段时间中,NVMe发布了新的SSD NVMe规范。不仅如此,NVMe组织还采用了不同的方法为NVMe规范添加新功能,比如将已经准备好的新功能单独批准,并作为技术提案发布,而不是捆绑在全新的主要更新规格中一次性发布。这样渐次发布的做法可以使得供应商在技术成熟后,马上便可以开始实施和部署这些新的功能,而不是针对草案进行操作。

这样的情况也出现在今天的NVMe 1.4中。NVMe 1.4版本包含了NVMe 1.3版本之后发布的所有28个新的技术提案,以及从1.3a版本开始,一直到1.3d版本中加入的各种修正以及说明。总的来说,NVMe 1.4相比NVMe 1.3,是一个更大的更新,因为其规范内容更多并且加入了对功能更深入的解釋。这样一来,虽然NVMe 1.4规范的页码就大幅度增加到403页(上一代NVMe 1.3d版本只有298页),但是易读性和可操作性更好了。

和之前版本类似的是,NVMe 1.4中加入的新功能和NVMe sSD的使用并非完全相关,部分内容只跟嵌入式系统或者超大规模部署的客户有关,因此大量的功能都不是必备的,而是可选的。相关的配套标准,比如NVMe管理界面和NVMe over Fabrics,都在不断地改进、发展,比如NVMe-MI的1.1版本在2018年12月获得了批准,NVMe over TCP已经成为NVMeof的第三个传输协议,并且加入了光纤通道和RDMA传输。而最基本的NVMe规范中的附加功能,往往被用于适应这些配套标准的变化。

新的可选功能需要操作系统中的SSD和NVMe驱动进行支持,如果没有驱动和技术的同时支持,驱动器将会退回到比较旧的功能级。为了更有效地使用新功能,还需要对蜘牛堆栈的上层进行一些修改,尤其是许多存储管理工具会通过了解SSD的参数和信息来提供对应的功能。这些软件更新的开发时间要比相关SSD固件的开发时间更长一些,因此对这些新特性的支持将在专用的环境中出现,并且早于通用的操作系统发布之前。

目前来看,NVMe SSD市场正处于从PCIe 3.0向PCIe 4.0过渡,同时实现性能改进的早期阶段。在这个阶段中,还不太需要对NVMe规范进行任何根本性的更改。但随着技术演进和更多应用的出现,NVMe还需要进一步加强它在性能方面的优势。有鉴于此,NVMe 1.4版本包含了一些性能方面的優化,这些优化依赖于更智能地了解存储的使用方式,以及SSD和王机系统之间更好的协作。另一大类则与功能、错误处理,以及RAID重建等有关系。本文将介绍这些新规范中值得关注的内容,但并不是所有内容的详细列表。需要声明的是,本文中给出的用例可能和最终硬件供应商的实际产品不符,毕竟目前规范刚推出,依旧还有很大的操作空间。

更多的块大小和对齐提示

NVMe的行为类似于常规块设备,扇区大小通常是512字节或者4KB。现代NAND的原始页面大小大于4KB,擦除块大小的单位更是MB。这种不匹配情况是SSD闪存数据转換层中绝大多数复杂处理和性能压力的来源。FTL允许软件在假设它们的存储块具有较小大小的情况下正常工作,但对如果能够对实际的块大小和页面大小更为匹配的话将会简化SSD的工作并且支持更高的性能。NVMe1.3规范引入了名称空间最优化IO边界的特性,允许SSD向主机系统通知读取和写入命令,最基本的要求是让其实现最佳性能。目前在这个特性支持下,已经有允许更小尺寸的块访问驱动器的情况,但是对于小于4KB的数据,传输性能非常差。

即便是在最糟糕的情形下,驱动器应该只是放弃对512B扇区的支持,转而采用默认的4KB扇区,但是在需要和旧操作系统兼容的情况下,关于哪些访问模式可以兼容性工作的提示可能会对实际的操作有所帮助。NVMe 1.4版本下的SSD能够和系统通讯并获得更详细的信息,使得诸如写和存储单元重分配(TRIM)等命令能够匹配相关页面的大小和擦除块的大小。

在NVMe 1.4版本下,驱动器可以报告命名空间首选写入对齐和命名空间首选的写入粒度,这些值只对NAND页面的一部分应用最小化的“读取——修改——写入”周期。同样的,命名空间首选的存储单元重分配对齐和命名空间首选的存储单元重分配粒度也适用于NVME的存储单元重分配命令,这个命令与ATA TRIM命令类似。对SSD来说,如果不增加写入放大,就很难处理覆盖小数据范围或大数据范围但没有对齐部分的存储单元重分配命令,否则这将会损害性能并增加写入放大。支持NVMe 1.4的Streams功能的驱动器还可以在使用Streams功能时,提供首选写入和取消分配粒度的提示,这些值通常是上述提示的倍数。

充分利用这些信息的责任现在将会落在操作系统和文件系统上,可以根据此信息设置RAID的条带大小和文件系统块的大小。对数据库之类的应用也需要注意到这一点,因为这类应用往往会试图绕过操作系统的大部分存储堆栈,然后自主优化存储性能,这一点在NVMe 1.4部署后需要进行调整。

更快度的错误检测和数据恢复机制

NVMe 1.4引入了一些新的功能来帮助处理不可恢复的读取错误和损坏的数据,尤其是在RAID和类似场景中,这项技术使得主机系统可以简单地从其他地方获取数据来更快地恢复损失的数据。

第一个技术被称为读取恢复级别判定,也就是Read Recovery Level。这项功能可以允许王机系统自行配置SSD恢复损坏区域数据的难度级别。我们知道SSD通常有多个错误校正层,一般来说上层比下层在数据恢复方面更为可靠,但是上层的速度会相应更慢且耗电量更高。在RAID 1或者类似场景中,主机系统通常倾向于快速获取错误,这样它既可以尝试从镜像的另一端读取相同的数据,也不用等待驱动器部分进行数据重读的尝试,然后再返回ECC校验这样较慢的方法。目前NVMe已经可以支持有时间限制的错误恢复,也就是TLER,这项技术只允许主机将错误处理时间限制在100ms以内。相比之下,读取恢复级别判定技术可以允许驱动器保存16个不同级别的错误的处理策略,只需要驱动器拥有2种不同的工作模式即可。这个功能将在每个NVM集的级别上进行配置。

接下来的技术是为了主动避免不可恢复的读取错误。NVMe 1.4加入了验证和获取LBA状态(Get LBAstatus)两个命令。其中验证命令比较简单,这个命令除了将数据返回给王机系统之外,它还可以执行正常读取所需要的一切操作。如果读取命令返回错误,那么验证命令也将返回;如果读取命令成功完成,那么验证命令也会成功完成。这个命令的优势在于,其可以在不受王机接口带宽瓶颈的影响下,对存储的数据进行底层清理成为可能。一些SSD将通过移动或者重写降级的数据来响应可修复的ECC错误,验证命令也可以完成相同的行为。总的来说,验证命令将减少对文件系统级别校验和清除/验证的需求。另外,在验证命令执行的过程中,每个执行位置都会加入一个位标记,这个标记将指示SSD是应该恢复快速失败还是应该努力恢复数据,位标记的功能和读取恢复级别判定功能有很相似。

获取LBA状态命令允许驱动器向主机提供一个区块列表。在这个区块列表中,它包含的内容是那些尝试读取或者验证命令后可能导致不可恢复的读取错误的块。S5D可能已经在自动后台扫描中检测到了ECC错误,或者在更严重的情况下,这个功能可以报告有哪些LBA受到了整个NAND通道的故障影响,从而可以避开这些区域。获取LBA状态命令还可以用于要求在返回可能不可恢复的区块列表之前,就预先扫描选定的数据范围。另外,当主机系统发现损坏或者数据丢失的LBA状态特性时,或者发出读取、验证命令后收到错误,发现数据丢失时,这个命令还可以将其他地方的数据副本(比文DRAID或者备份数据)重新写入到相同的LBA中,然后正常使用这些逻辑块。SSD将在必要的时候彻底封闭受损的物理块避免再次丢失数据。

持续存储区域

大多数NVMe SSD,除了NAND以外,还加入了DRAM颗粒。这些DRAM颗粒的主要目的之一是作为Flash翻译层表的缓存,这些表用于跟踪逻辑块的地址和物理闪存地址之间的映射。但是NVMe一直在探索使用DRAM或者其他更陕的方式去完成这个操作。在NVMe 1.2规范中,它引入了控制器内存缓冲区,这使得SSD的一些DRAM可以通过PCI地址空间直接访问。这个设计允许IO命令提交和完成的队列在SSD的内存而不是主机的CPU内存中存放,这将减少提交方的延迟,并目可以在NVMe over Fabrics的情况下切断一些不必要的复制,甚至诸如DMA之间SSD和网卡的数据交換允许完全绕过主机DRAM等。

在NVMe 1.4规范中,新的PMR也就是持续存储区域(PersistentMemory Region)功能以类似的方式运行,它可以直接接受外界数据的读写请求。主机系统可以使用基本的PCIe傳输直接读取或者写入PMR,无需任何命令队列的开销。当然,控制器内存缓冲区通常用于支持正常的NVMe操作,PMR这不会参与其中。但值得注意的是,由于PMR是一个通用的内存块,具有电源损耗保护电容器,它可以在主机电源意外断电的情况下,安全地刷新企业级S5D的内部缓存,此时PHR内的内容将自动写入闪存,并且在主机恢复时,可以要求SSD重新加载PMR中的内容。

PMR的性能和容量不会接近NVDIMM所能提供的数据,但是PMR可以提供一些类似的优势。比如访问PMR比构建NVMe IO命令并等待完成的速度要快很多,而且实现起来更为简单。PMR功能还能够接受非常大量的写入数据,同时它不会耗尽任何闪存,因此其内容只有在电源发生故障的时候才会保存到闪存中,这使得PMR成为存储数据库或者文件系统日志最好的地方,因为这些文件会不断地写入更新,并且非常容易成为性能瓶颈。

NVM集和耐久陸组

NVM集和耐久性组是两种新的高级组织结构,用于管理大于单个NVMe名称空间的存储池。由于高端企业级SSD对多个命名空间技术的需要,因此依赖于NVM集或者耐久性组的某些功能仅仅适用于多端口驱动器、虚拟化环境或者NVHe over Fabrics阵列,此时一个NVMe控制器的情况表现的像是在访问多个驱动器。但是,即使在单个NVM集、有耐久性要求的单个驱动器上,这些新功能依旧能起到一些作用。

Endurance Group,也就是耐久性组,它是NVM的集合,是由命名空间和未分配的存储组成起来的。每个耐久性组都是一个单独的存储池并执行自己的存储磨损。此外,耐久性组还拥有自己的专用备用池.驱动器也会报告每个区块的单独磨损数据。在具有多个耐久性组的驱动器上,可以完全磨损一个耐久性组并使得其成为只读组,其他的耐久性组依旧可以正常使用。

另外,特定的驱动器可以被设定为特定的NAND区域,也可以设置不同的NVM集或者耐久陸组,它们本质上是将其分割为多个相对独立的驱动器。这样不仅可以实现磨损管理的分离,而且可以提供严格的分区性能。云托管供应商可以将来自不同的客户的VM数据放在不同的NVM集或者耐久性组上,以确保来自某一个客户的繁忙工作不会损害另一个客户的数据延迟。

可预测的延迟模式

新的可预测的延迟模式功能允许主机暂时暂停SSD控制器正在执行的任何后台操作,确保此时不会立即处理从主机系统提交新的IO命令。在这种情况下,驱动器能够提供最佳、最一致的性能。SSD无法无限期地在这种状态下运行,并且最终需要离开性能模式并进行后台工作处理。此时驱动器可以提供运行评佔,确保自己在性能模式完成之前就切換回非确定性模式。

可预测的延迟模式通常用于主机软件可以跨多个驱动器进行负载平衡的环境。高优先级IO可以定向到当前处于确定性窗口的驱动器中优先处理,而非确定性窗口中的驱动器可以单独处理后台需求,或者用于处理低优先级的IO。在一组驱动器池中,每个驱动器都可以在确定性和非确定性操作之间交替运行,每个驱动器的窗口时间将取决于工作负载情况。如果负载均衡器工作正常,它将停止向驱动器发送对延迟敏感的IO命令,并目在驱动器达到其限制之前主动将其从确定性模式中呼出。此外,驱动器也可以配置成在达到阈值之前提供警告,因此主机系统无需经常检查状态指示器以查看驱动器是否接近离开确定性窗口。可预测的延迟模式给予每个NVM集配置,因此很多集的驱动器可以在任何给定时间的每个模式中都有一些延迟配置,并目在整个NVM集中进行负载平衡。

可预测延迟模式也不是用于控制驱动器何时执行后台工作的第一个NVMe功能,NVMe 1.4添加了非操作电源状态许可模式的功能,以便它可以在低功耗空闲状态下要求驱动器不进行后台工作。這里的目的是在使用电池供电或者关闭系统风扇的低功耗状态下推迟后台功能,这个功能不影响驱动器处于活动状态时的后台工作情况。

提交队列关联和命名空间写保护

NVMe SSD通常可以支持多个命令提交和完成队列。目前它的主要用途是为每个CPU核心提供自己的队列,这样驱动程序就不再需要从内核到内核的同步来执行普通的IO了。最近,Linux NVMe驱动程序也增加了将队列用于特殊目的功能支持,比如为高优先级命令创建专用的队列,这些命令会被轮询完成而不会等待中断,或者每个核心具有单独的队列读取命令。NVMe 1.4和之前提到的可预见的延迟模式为多个队列添加了另一个潜在的用例,那就是将一个队列和特定的NVM集进行关联。此外,NVMe 1.4还允许主机通知SSD的NVM队列设置计划,这样可以让SSD控制器在使用可预测延迟模式时有机会进一步降低延迟或者提高QoS,当然这项功能是可选的。

此外,在命名空间写保护方面,NVMe 1.4也作出了加强。NVMe命名空间可以是下列三种只读模式中的一种:只读直到下一个电源循环、只读直到写保护功能被禁用后的第一个电源循环、驱动器生命内永久只读。这样的设置为嵌入式或者高安全性系统的关键性数据安全提供了一系列的选项。一个典型的用例是将操作系统或者最小恢复系统放置在写保护的命名空间内,并且将用户数据和应用程序保存在常规的读写命名空间中。这是NVMe开始为客户端SSD提供多个命名空间时最引人瞩目的功能之一,因为这项功能已经普遍适用于普通移动和桌面操作系统。另外,受写保护的命名空间可以使得驱动器本身参与保护操作系统免受意外或者篡改,并且比现有的保护内存块功能简单很多。

NVMe的下一步

从技术发展角度来看,NVMe受到了开放式通道SSD的影响,这类SSD将全部或者部分闪存转換成移除驱动器并挂接在CPU上。NVMe的一些功能正在受到这种新的模式的启发,包括上文中关于最佳区块大小、数据对齐、NVM集和耐久性组的设计等方面。去年,微软还成立了ProjectDenali,对开放性通道固态内存进行了探讨,希望能够在低级控制和传统的块存储之间提供易用性的最佳平衡,最终的目标是生成能够被更广泛采用的新标准。

总的来说,人们希望可以在NVMe上构建计算存储设备的加速器和协处理器标准。目前已经有公司开始开发或者已经提供设备来承担处理器的压缩、加密、解密、搜索和AI推理等任务,并且是在数据存储位置附近进行这些计算任务。标准化这些设备接口的工作目前依旧处于起步阶段,但是在NVMe 1.5版本出现前的两三年内,其中一些想法可能会变得足够成熟,并能够真正成为计算存储的基础设施标准,我们期待在接下来的发展中能够看到这些新的进步。

猜你喜欢
驱动器队列命名
命名——助力有机化学的学习
队列里的小秘密
藏起驱动器号确保数据安全
基于多队列切换的SDN拥塞控制*
在队列里
有一种男人以“暖”命名
丰田加速驶入自动驾驶队列
压电陶瓷驱动器的迟滞特性
SiC基和Si基永磁同步电动机驱动器的比较
新型低电压大变形微驱动器数值求解及仿真