NVM Express在2019年完成了NVMe 1.4规范的制定,新的NVMe协议带来了大量的全新特性,尤其在纠错、强化性能以及针对特殊领域和企业级领域的优化等方面更是令人关注,其中就包含了NVMe 1.4为高端企业级固态硬盘提供的一种新能力PMR。
所谓的PMR即为一块存储区,使用此功能将创建并控制一个称为持久性内存区域(PMR)的存储区域,该存储区可以映射到PCI Express总线上的地址空间上面,并且可被主机和其他设备访问。
PMR的主要特点是,在电源断电(power cycle),控制器复位以及PMR启用/禁用切换之后,写入PMR的数据也会保留。换句话说,此功能使SSD除了提供通过逻辑块地址(LBA)访问的存储区域外,还提供了另一个非易失性存储区域,并且这块存储区域假定的访问方法是内存访问而不是块访问。PMR对性能的要求很高,例如,稳定状态下的写带宽要比PCIe的写带宽度大得多,如果无法做到,协议上记载会有弹性缓冲区等可选项来填补带宽的间隙。
总的来说,PMR空间可以提供一种内存级读写速度、断电后数据不会丢失的存储区域。PMR功能上与NVDIMM相似,虽然PMR的性能和容量远比不上NVDIMM,但PMR有着与NVDIMM一样的优势,比起通过NVMe IO命令去读写一笔数据,并等待命令完成,读写PMR的操作就简单快捷多了。PMR具有非易失性、较低延迟、可Bytes寻址等特性,使数据管理具有更大的灵活性。它非常适合需要频繁访问复杂数据集的环境,以及因电源故障或系统崩溃导致停机的敏感环境。
PMR主要的优点包括:
1.访问延迟小于NAND闪存的访问延迟,接近于DRAM。
2.与NAND闪存相比,吞吐量大大增加。
3.比DRAM便宜。
4.可Bytes寻址,实时访问数据,允许超快速访问大型数据集。
5.断电后数据仍保留在内存中(就像使用闪存一样)。
那么,究竟如何才能实现这一强大的功能呢?随着PCIe Gen4的问世,PCIe的带宽迅速增长,常见的非易失性存储器件NAND闪存很难满足PMR要求的高速性能,而且原本NAND闪存就更适合用来块访问,不适合用于PMR指向的内存,因此,SSD不会直接使用NAND闪存来作为实现PMR的存储器件。
实际上在NVMe协议中并没有记载PMR的具体实现方法,但是从已有信息来看,可以使用所谓的新型内存SCM(Storage Class Memory)来实现PMR,例如利用Intel的Optane存储器。还有一种比较主流的实现PMR的思路是,将SSD内DRAM(的一部分)分配给这个区域,一般企业级NVMe固态硬盘自带有大容量的DRAM缓存,并且整个固态硬盘处于断电保护设计的保护之下,结合这两个特点,外加一定数量的常规NAND闪存,PMR就可以实现。
图2 使用部分DRAM用作PMR
NVMe一直在积极探索固态硬盘内DRAM的其他用途,PMR就是一个潜在的应用。绝大多数企业级固态硬盘都带有一定数量的DRAM内存,用来当做存放FTL表项的cache buffer,固态硬盘可以通过这些FTL表项来映射逻辑地址和闪存物理地址。此外,NVMe 1.2协议就定义了控制器内缓存CMB(Controller Memory Buffer)这一特性,旨在使部分SSD内的DRAM空间可以直接通过PCI地址空间被访问,这一特性使得NVMe传输IO命令所需的SQ,CQ可以直接驻存在SSD的DRAM内存里,而不是放在host的内存里,可以减少命令交互的延迟,并可以消除NVMe over Fabrics情况下SSD端对端之间DMA传输中的不必要的复制操作,使得传输的数据完全绕过host的DRAM。
图3 NVMe Controller中的CMB与PMR
NVMe 1.4的特性PMR的运作方式与CMB类似,host系统可以使用基础的PCIe传输直接读写此内存区域,而无需任何命令队列的开销。在实践中,通常希望将CMB用于支持正常的NVMe操作(如放置SQ/CQ/PRP等),作为一块DRAM buffer使用,但是PMR则不同,虽然PMR也是SSD内部的一段DRAM区域,但它主要是作为一大块通用的非易失存储供主机使用,典型的企业级SSD具有专门的断电保护电容器,这些电容器可以使PMR中的数据在发生意外断电时得以安全刷新到闪存中。在SSD断电时,PMR的内容将自动写入闪存,当host系统恢复上电时,host可以要求SSD重新加载PMR的内容。
用这种方法实现的PMR功能的典型应用场景是,接收大量(覆盖性)写入的场景,这种场景下PMR不会消耗任何除PMR容量大小之外的闪存,因为只有在断电的情况下,SSD才会去下刷保存PMR的数据,因此这非常适合用于记录数据库或系统的日志,因为日志会不断大量写入,而且写日志的操作很容易成为系统内的性能瓶颈,造成堵塞,而PMR恰恰是可以提供DRAM级别的读写速度,以及DRAM可覆盖写的特性。还有一种潜在的应用场景是就地执行技术XIP(execute-in-place),这种被人们津津乐道的能够大幅提高应用程序性能的技术可能会因为PMR的出现变得流行起来。
目前PMR在协议方面则较为简单,NVME 1.4规范只定义了一些控制PMR的寄存器,包括稳定状态下的写入带宽、弹性缓冲区的大小、PMR的状态、主机应等待PMR ready的超时时间等详细的设定项目。因此,想要有效地使用PMR,设备(驱动器)侧和主机(OS和库)侧对应的驱动程序都是必不可少的,目前Linux的相关驱动还处于规划阶段,未来对PMR驱动软件上的支持还有很长一段路要走。
NVMe 1.4在去年才刚刚发布,业界内对于PMR的应用也主要集中在企业级存储领域,并且大多仍处于研究、探讨阶段,因此有关于PMR这一新特性的可操作空间其实还很大,其应用潜力、前景有望进一步被发掘。