随着存储技术的发展和人们对存储性能的不懈追求,高性能存储的探索开始向内存通道迁移。非易失性双列直插式内存模块(Non-Volatile Dual In-Line Memory Module,NVDIMM)便在这种趋势下应运而生。NVDIMM使用了DIMM的封装,可以与标准DIMM插槽兼容,并且通过标准的DDR总线进行通信,NVDIMM是持久内存的一种具体实现。在2019年1月的SINA大会上,持久内存与NVDIMM工作组对持久内存的典型属性做了如下规定:非易失性,可以按字节寻址(Byte Addressable)操作,小于1μs的延时,以及集成密度高于或等于DRAM。
根据电子器件工程联合委员会(Joint Electronic Device Engineering Council,JEDEC)标准化组织的定义,有三种NVDIMM的实现,分别是:NVDIMM-N、NVDIMM-F和NVDIMM-P。
NVDIMM-N是目前市场上主流且已经实现商用的持久内存,有8GB、16GB和32GB等容量可选。它将同样容量的DRAM和NAND Flash放在同一个内存模块中,另外还有一个超级电容。计算机的微处理器可以直接访问DRAM,支持按字节寻址和块寻址。当没有掉电时,它的工作方式和传统的DRAM相同,因此读写延时和DRAM相同,为几十纳秒级。当掉电时,超级电容将作为后备电源,为把数据从DRAM复制到NAND Flash中提供足够的电能,当电力恢复时,再把数据重新加载到DRAM中。NVDIMM-N的工作方式决定了它的Flash部分是不可寻址的。由于NVDIMM-N同时使用两种存储介质,成本急剧增加。但是,NVDIMM-N为业界提供了持久内存的概念和实例。
NVDIMM-F是使用了DDR3或者DDR4总线的NAND Flash。Flash只支持块寻址,它先通过模块上的多个控制器和桥接器,把来自DDR总线接口的信息转换成符合SATA协议的信息,再进一步将其转换成对Flash操作的指令。NVDIMM-F的总带宽取决于其模块上SATA控制器的数目,其中每个SATA-II协议接口的控制器的带宽最大可达到500MB/s。NVDIMM-F的延时为几十微秒,是SATA控制器和DRAM-SATA桥接器的延时总和。虽然多重协议间转换,以及在BIOS和操作系统上的改动为NVDIMM-F的性能带来了一些负面影响,但是它的容量可以轻松达到TB以上。
NVDIMM-P同时使用了DRAM和NAND Flash,但是其中NAND Flash的容量远大于DRAM的容量,DRAM作为缓存用于降低系统的读写延时及优化对NAND Flash的读写操作。NVDIMM-P支持DDR5接口,与DDR4相比提供了双倍带宽,并且提高了信道频率。NVDIMM-P支持按字节寻址和块寻址,它的容量可以达到TB,同时能把延时保持在10 2 纳秒级,通过合理地配置DRAM与NAND Flash,其成本比DRAM低。可见,NVDIMM-P在规避了NVDIMM-N和NVDIMM-F的缺点的同时,提供了近似于DRAM性能的持久内存方案。
英特尔在2018年5月发布了基于3D-XPoint技术的英特尔傲腾持久内存。它是一种使用了新型非易失性存储介质的NVDIMM,目前提供的容量有128GB、256GB和512GB,大于传统的内存条容量。它与DRAM采用相同的通道接口,可以与DRAM搭配使用。其搭载的至强可扩展微处理器每颗最多支持6根持久内存,所以一个典型的支持双路英特尔至强系列处理器的服务器最多可以支持12根持久内存,持久内存容量最高可以达到6TB。它使用DDR-T协议进行通信,允许异步命令和数据时序。它使用大小为64B的缓存行作为访问粒度,类似于DDR4内存。
英特尔傲腾持久内存可以配置多种操作模式,包括内存模式(Memory Mode)、应用程序直接访问模式(App Direct Mode)(也被称为AD模式),以及在两者之间分配比例滑动的混合模式。
在内存模式中,持久内存被当作超大容量的易失性内存来使用,而DRAM则被微处理器用作写回型缓存(Write-back Cache),这个由DRAM构成的缓存由主机的内存控制器管理。在内存模式下,持久内存与DRAM一样,数据是掉电易失的,因为每个电源周期都会清除易失性密钥。DRAM被称为近内存(Near Memory),而持久内存被称为远内存(Far Memory)。从性能角度来看,如果读写操作命中近内存,将会获得DRAM级别的读写延时,即10ns级别的延时。反之,读写操作流向由持久内存构成的远内存,从而产生额外的延时,达到亚微秒级别的延时。值得注意的是,内存模式并非都适用于所有应用场景,需要根据具体的应用场景和工作负载的特性来判断。如果应用或负载需要超大内存,并且其中的热数据总量能基本容纳在DRAM中时,内存模式就非常适合。如果DRAM不足以容纳热数据,并且应用或者负载需要很高的内存带宽来访问较大的地址空间时,内存模式就不适合。有些内存数据库更适合使用下面介绍的AD模式。
在AD模式中,持久内存直接暴露给用户态的应用程序来使用。在这种模式下,持久内存是按字节寻址的,为保持缓存一致性,所存储的数据是持久非易失的,并且具有接近于内存的读写访问速度,同时提供了可执行DMA和RDMA的功能。AD模式需要特定的持久内存感知软件和应用程序的支持,如图1-6所示。应用程序通过持久内存感知文件系统(PMEM-Aware File System)将用户态的内存空间直接映射到持久内存设备上,从而应用程序可以直接进行加载(Load)和存储(Store)操作。这种形式也被称作DAX,意为直接访问。为了使开发者更加方便有效地基于持久内存进行应用程序开发,英特尔提供了用于在持久内存上进行编程的用户态软件库PMDK(Persistent Memory Development Kit),这部分内容将在本书的第4章进一步介绍。比较适合AD模式的应用场景包括:性能瓶颈在于磁盘I/O的应用、某些需要较高内存带宽来访问较大地址空间的内存数据库的应用、需要支持更大数据集和更多客户端或者线程数的应用等。此外,还可以将持久内存配置为应用程序直接使用的存储(Storage Over App Direct Mode),用户只需要通过驱动,就可以对持久内存进行像对硬盘一样的块操作。与传统企业级SSD相比,此模式可以提供更好的性能、更低的延时和更好的耐用性。
图1-6 AD模式