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

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版本中加入的各种修正以及说明。

▲目前绝大部分中高端SSD都支持NVMe技术

总的来说,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的工作并且支持更高的性能。

▲SSD在读写不同大小的区块时存在性能差异,比如小于4KB的数据性能会暴跌。

NVMe1.3规范引入了名称空间最优化IO边界的特性,允许SSD向主机系统通知读取和写入命令,最基本的要求是让其实现最佳性能。目前在这个特性支持下,已经有允许更小尺寸的块访问驱动器的情况,但是对于小于4KB的数据,传输性能非常差。

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

▲NVMe 1.4对命名空间做出了改进

在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以内。

▲西部数据SSD中的纠错方案

相比之下,读取恢复级别判定技术可以允许驱动器保存16个不同级别的错误的处理策略,只需要驱动器拥有2种不同的工作模式即可。这个功能将在每个NVM集的级别上进行配置。

接下来的技术是为了主动避免不可恢复的读取错误。NVMe 1.4加入了验证和获取LBA状态(Get LBA status)两个命令。其中验证命令比较简单,这个命令除了将数据返回给主机系统之外,它还可以执行正常读取所需要的一切操作。如果读取命令返回错误,那么验证命令也将返回;如果读取命令成功完成,那么验证命令也会成功完成。这个命令的优势在于,其可以在不受主机接口带宽瓶颈的影响下,对存储的数据进行底层清理成为可能。一些SSD将通过移动或者重写降级的数据来响应可修复的ECC错误,验证命令也可以完成相同的行为。

总的来说,验证命令将减少对文件系统级别校验和清除/验证的需求。另外,在验证命令执行的过程中,每个执行位置都会加入一个位标记,这个标记将指示SSD是应该恢复快速失败还是应该努力恢复数据,位标记的功能和读取恢复级别判定功能有很相似。

获取LBA状态命令允许驱动器向主机提供一个区块列表。在这个区块列表中,它包含的内容是那些尝试读取或者验证命令后可能导致不可恢复的读取错误的块。SSD可能已经在自动后台扫描中检测到了ECC错误,或者在更严重的情况下,这个功能可以报告有哪些LBA受到了整个NAND通道的故障影响,从而可以避开这些区域。获取LBA状态命令还可以用于要求在返回可能不可恢复的区块列表之前,就预先扫描选定的数据范围。

另外,当主机系统发现损坏或者数据丢失的LBA状态特性时,或者发出读取、验证命令后收到错误,发现数据丢失时,这个命令还可以将其他地方的数据副本(比如RAID或者备份数据)重新写入到相同的LBA中,然后正常使用这些逻辑块。SSD将在必要的时候彻底封闭受损的物理块避免再次丢失数据。

未完待续……详见《微型计算机》2019年8月上刊。

对本篇待续内容感兴趣的读者请给我们留言,大家有兴趣我们会继续放出后续内容。

本站选取的不少文章素材均来源于互联网,所载内容仅供参考!如有文章无意中侵犯您的权益,请联系我们予以更正。相关合作请发信至78163952@qq.com。