Intel于 2019 年 4 月发布了傲腾持久性内存(Optane DC persistent memory),这是目前市场上唯一商用的持久性内存(Pmem)存储设备。同时也在操作系统层面开发了一系列用于管理Pmem的工具,提供了丰富完备的文档。Pmem官方网站
但是Intel于2022年11月结束傲腾业务,但是承诺在已经卖出去的傲腾内存生命周期内,仍然维护PMDK。公告:PMDK 更新和我们的长期支持策略
就是虽然傲腾Pmem基本上已经算是寄了,但是对于新型的CXL扩展内存设备而言,在操作系统层面的支持与管理还是有参考价值。下面简单介绍一下傲腾Pmem及其可配置的两种访问模式:Memory mode(内存模式) 和 App Direct mode(应用直接访问模式)
持久性内存(persistent memory,Pmem)能够像磁盘一样持久地存储数据,具有接近 DRAM 的性能,同时还能提供远高于 DRAM 的存储密度。Pmem通过内存总线 与 CPU 互连,CPU 可以按字节粒度访问 Pmem。也就是说Pmem将传统外存的大容量持久存储与传统内存的低延迟字节寻址能力相结合。
经典的计算机存储器层次结构是由易失性内存(包括处理器缓存、DRAM 等)和持久性外存(包括机械磁盘、固态硬盘等)构成。
图引自:陈游旻. 持久性内存存储系统关键技术研究[D].清华大学,2021.DOI:10.27266/d.cnki.gqhau.2021.000070.
在如图1.2所示的存储金字塔中,存储层级越高,其距离处理器越近,容量越小、访问速度越高, 单位容量价格也就越贵。相变存储器(phase change memory,PCM)、3D XPoint等新型持久性内存的出现则打破了上述存储层级。持久性内存像 DRAM 一样通过内存总线与处理器直接相连,处理器可以通过内存指令按字节粒度访问持久性内存,且访问延迟与 DRAM 十分接近。另外,持久性内存还能像外存设备一样持久地存储数据,即使在系统掉电时数据也不会丢失。因此,持久性内存属于全新的一个存储层级。
在硬件层面:傲腾持久内存是NVDIMM-P的可商用实现,有关NVDIMM可见:【CXL】cxl-cli、ndctl、daxctl管理linux内核中NVDIMM设备子系统。其内部的持久化存储技术是3D XPoint技术,具体细节好像没有公开,不过可以在《持久内存架构与工程实践 (李志明等 著)》第二章找到一些有关如何持久化存储的相关内容。
在操作系统层面,其实这块有点乱,理了挺久,勉强有点眉目。商用的傲腾持久内存可配置两种访问模式:内存模式和App Direct模式。在App Dirdect模式下给Pmem部署文件系统后应该又可以将Pmem用作块存储(类似传统外存)和直接访问内存(类似传统内存)。现在的大部分研究基本都是聚焦在App Direct模式。
这是操作系统管理Pmem的模型图,后续进行说明。
图引自:张佳辰,胡泽瑞,赵盛,施文杰,王刚,刘晓光.VMFS:一种持久性内存统一管理系统[J].电子学报,2021,49(12):2299-2306.
内存模式:连接在同一个集成内存控制器上的DRAM 会作为持久内存的缓存工作。
该模式下DRAM无法直接访问,而是作为持久内存在直接映射缓存策略下的可写回缓存,持久内存作为大容量易失内存使用。
DRAM作为缓存命中时,性能可以与DRAM相当;
但是不命中时,开销为DRAM的访问开销加上持久内存的访问开销。
其最大的优势是用户程序不需要经过任何修改可直接运行,应用没有移植成本。
App Direct 模式:持久内存作为可持久化的存储设备使用,该模式下持久内存和相邻的DRAM都会被识别为操作系统可见的内存设备,持久内存是与DRAM分离的持久化设备,DRAM则用作主存储器。
持久内存上部署文件系统后,其访问时间比常规存储设备(如SSD)的访问时间短得多。
其缺点是,用户需要使用相应的编程模型规范对持久内存进行应用程序的编程,会有代码修改的人力成本。
图引自:陈游旻. 持久性内存存储系统关键技术研究[D].清华大学,2021.DOI:10.27266/d.cnki.gqhau.2021.000070.
该访问方式包括红框所圈的三个途径:
Linux 4.3 及更高的版本已经默认支持 NVDIMM 驱动,该驱动可以将持久性内存以设备的形式呈现给用户(例如/dev/pmem0)。
传统外存存储及网络设备均由操作系统统一接管,应用程序通过标准化系统调用接口陷入到内核访问硬件设备,操作系统则通过中断机制与外部设备进行交互。
用户空间和内核空间。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核(万一一不小心删除了操作系统的内存数据)。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。
以32位linux操作系统为例,寻址空间位2^32=4GB,将最高的1G字节称为内核空间,将较低的3G字节供各个进程使用,称为用户空间。用户空间和内核空间的区别。
所有的系统资源管理都是在内核空间中完成的。比如读写外设磁盘文件,分配回收内存,从网络接口读写数据等等。应用程序是无法直接进行这样的操作的,应用程序只有通过系统调用(诸如read、write等)、软中断、硬中断进入内核态。
而mmap这个系统调用,可以将外设的内存映射到用户空间中,使得应用程序可以直接用指针读写映射的内存段,提高了效率。
讲解mmap系统调用比较透彻的几个博客文章:
深入剖析mmap原理 - 从三个关键问题说起
内存映射原理和内核是如何实现的,完全分析mmap原理
以及《深入理解计算机系统》一书中的9.8节
认真分析mmap:是什么 为什么 怎么用
mmap - 用户空间与内核空间
彻底理解mmap()
这部分就是与上面有点模糊的部分,命名空间这个概念是傲腾里自定义的,App Direct模式在四种命名空间中工作,相当于在操作系统中以四种方式工作,简述如下:
参考:张昊. 基于RDMA与持久性内存的用户态文件系统的研究与实现[D].华东师范大学,2022.DOI:10.27149/d.cnki.ghdsu.2022.003963.