Intel不断在存储器这边布局:
- Intel于 2019 年 4 月发布了傲腾持久性内存(Optane DC persistent memory),这是目前市场上唯一商用的持久性内存(Pmem)存储设备。同时也在操作系统层面开发了一系列用于管理Pmem的工具,提供了丰富完备的文档。Pmem官方网站
- 同年发布了CXL(Compute Express Link)高速互连总线协议,是一种突破性的CPU到设备的互连。目前已经迭代到CXL3.0,其支持的type3扩展内存设备也有助于解决内存墙和IO墙的问题。
但是傲腾Pmem因为“过度宣传”、价格偏高等等原因,Intel于2022年11月结束傲腾业务,但是承诺在已经卖出去的傲腾内存生命周期内,仍然维护PMDK。公告:PMDK 更新和我们的长期支持策略
同时CXL逐渐成为业界唯一的设备间高速互连标准,Intel转而将更多的资源和精力投入到CXL的研究中,如果应用程序和操作系统用户空间中的抽象已根据 CXL 规范实现,Intel预计 PMDK 可以在功能上与 CXL 的type3扩展内存设备一起使用。
那么cxl-cli就是在原有管理NVDIMM设备(含Pmem)工具套件(ndctl、daxctl)中新增的,专门管理CXL设备的工具,下面简单介绍相关调研情况:
文章目录
- 一、NVDIMM简介
- 1. 背景与功能简介
- 2. 硬件连接方式
- 3. NVDIMM-N、NVDIMM-F、NVDIMM-P
- 4. 操作系统层面的访问方式
- 5. NVDIMM中几个相关概念
- 二、cxl-cli、ndctl、daxctl的一般命令
- 三、其他参考
一、NVDIMM简介
计算机系统中的两种主要存储设备:内存和外存。
- 内存的访问时延在ns级,称作易失性存储器,存储介质是DRAM;
- 外存的访问时延在us级,称作非易失性存储器,存储介质是闪存等,包括SSD固态硬盘、磁盘等。
1. 背景与功能简介
由于内存和外存之间的性能差距过大,业界提出了NVDIMM
技术,NVDIMM(Non-Volatile Dual In-line Memory Module)
是一种集成了非易失性存储器(NVM)和DRAM的存储模块,它能够在系统断电时保存数据,从而实现更快的启动速度和更可靠的数据存储,缩短了内存和外存之间的性能差距。
上图中间的NVM/PM
层便是NVDIMM
,因为NVDIMM
设备在功能表现上其实也就相当于是持久内存设备,关于傲腾持久内存和最新的NVDIMM-P
设备的区别,ChatGPT给出如下解释:
傲腾持久内存和NVDIMM-P都是集成了高速非易失性存储器(如3D XPoint)和DRAM的内存模块,它们在一定程度上可以被视为相似的技术。但是它们之间还是有一些区别的:
- 傲腾持久内存是英特尔公司推出的一种产品品牌,而NVDIMM-P则是一种通用的内存模块标准,可以由多家厂商生产。
- 傲腾持久内存是直接由英特尔生产和销售的内存模块,它具有英特尔的技术优势和支持,而NVDIMM-P则需要由厂商根据标准设计和生产,品质和性能可能有所不同。
- 傲腾持久内存需要特定的平台支持才能发挥最佳性能,如英特尔Xeon Scalable处理器和英特尔Optane SSD固态硬盘,而NVDIMM-P则可以在兼容标准的平台上使用。
- 傲腾持久内存具有更高的性能和更低的延迟,可以提供更高的IOPS和吞吐量,而NVDIMM-P则相对较为普及,价格相对较为亲民。
总之,傲腾持久内存和NVDIMM-P都是集成了高速非易失性存储器和DRAM的内存模块,它们的区别在于品牌、技术支持、平台兼容性、性能和价格等方面。(不保真但是我觉得大差不差)
2023.4.1:有论文提到,傲腾持久内存便是NVDIMM-P的可商用实现,底层是基于3D XPoint技术。
(PerMA-Bench: Benchmarking Persistent Memory Access)
2. 硬件连接方式
在硬件层面,NVDIMM
技术直接将NVM如闪存,插入内存插槽DIMM 上。CPU直接通过内存总线访问NVM,由此缩短CPU访存路径,使得在层次化存储系统中,NVDIMM
的性能远远超过了PCIe
接口的闪存固态盘的性能,其数据访问延迟可以降低至几百甚至几十纳秒。
CXL三种设备(智能网卡、GPU等加速器、内存扩展设备)都是插在传统PCIe插槽的。相比NVDIMM直接插在内存插槽的连接方式,CXL设备这种连接方式势必要延迟高一点,毕竟PCIe插槽距离CPU的物理距离更远。但是CXL这种方式兼容更多的设备,可扩展性高;另外,针对访存路径,CXL.mem子协议中有独特的实现,也提高了访存性能。
3. NVDIMM-N、NVDIMM-F、NVDIMM-P
NVDIMM
的标准由SNIA (Storage Networking Industry Association,全球网络存储工业协会)组织制定。NVDIMM
技术有三种标准: NVDIMM-N、NVDIMM-F与NVDIMM-P
,三种规范拥有着不同的产品形态、系统架构与工作机制等。
- NVDIMM-N 标准:在 2014 年第一次提出 NVDIMM-N 标准,主要针对 DRAM 的断电易失性,通过在 DRAM内存条上增加超级电容以及闪存介质,对断电时数据进行保护。在断电时,在电容的电源续航能力的作用下,NVDIMM-N设备内部控制器将DRAM中的数据迁移到闪存中,在突然断电的情况下保护数据,其性能和普通内存条是相同的。
- NVDIMM-F标准:2015年提出,NVDIMM-F原理是设计使用DIMM接口的闪存块设备,直接插入内存插槽,处理器直接通过内存总线访问设备,利用内存通道的高性能降低访问延迟。由于闪存介质本身性能限制,其性能仍低于普通内存,访问延迟在10微秒这个数量级,但是远远高于PCIe接口的闪存固态盘。
- NVDIMM-P标准:2016年提出,NVDIMM-P是一种综合NVDIMM-N 与NVDIMM-F的存储形态,想法是使用DRAM与闪存组成的混合存储架构,利用数据局部性原理,将DRAM作为闪存介质的高速缓存,其性能介于NVDIMM-N 以及NVDIMM-F之间,大约为100 纳秒,容量上还远大于NVDIMM-N,可以达到与NVDIMM-F一样的容量。
NVDIMM-P使用控制器连接DRAM 与闪存,这是一种混合存储架构,内部主控制器是开发NVDIMM-P设备的设计重点,决定着整个设备的性能。
4. 操作系统层面的访问方式
- 通过pmem方式使用
即按照持久内存的方式使用,CPU直接使用load/store指令访问NVDIMM设备(字节寻址),跳过OS内核空间的page cache、通用块层,也无需特别的驱动作为访问中转(因为此种访问方式是内存式访问)。这种访问方式下,需要应用程序自己管理NVDIMM存储空间,即将NVDIMM部分存储空间映射到用户空间,交由应用程序自己使用。
下图中最右边的虚线和右侧第二条线都是这种访问方式。不同的是右侧第二条访问线需要通过OS文件系统提供的接口访问,并且文件系统需支持DAX(direct access)机制(ext4,xfs已支持)——用户通过文件系统访问设备绕过page cache、通用块层,直接使用mmap将文件映射到应用程序地址空间中,而文件位于NVDIMM设备上。这样的好处在于用户可以使用文件系统实现的permission、quota等机制。
- 通过块设备(btt/sector)方式使用(BLK方式)
通过块设备方式来访问NVDIMM,这样的优势在于可以使用linux kernel实现的软raid、mirror、加密/压缩等中间层驱动所带来的功能。
- Pmem+块设备混合访问
上述具体细节可以继续阅读:
简书:nvdimm
Pmem官网:PMEM and BLK Modes
5. NVDIMM中几个相关概念
-
namespace
:在NVDIMM设备上,软件或者硬件可以将NVDIMM设备划分几个区域,这些区域就是namespace。- 这几个不同的区域可以采用不同的访问方式它们,分别是:Pmem方式、BLK方式和 Pmem+BLK方式,所以
namespac
有大小、范围和访问方式这三个基本属性。 - 通过
ndctl
工具可以查看、创建和修改主机上的NVDIMM的namespace
。
- 这几个不同的区域可以采用不同的访问方式它们,分别是:Pmem方式、BLK方式和 Pmem+BLK方式,所以
-
region
:一个或多个namespace
组成了一个region
,一个region内所有的namespace访问方式都必须是相同的。(访问方式只有:Pmem方式、BLK方式和 Pmem+BLK方式。) -
lable
:是一段持久存储区域,用于记录NVDIMM的哪一部分属于哪个namespace
,每个NVDIMM都有一个。
下图是Pmem官网给出的一个示例图片,三个NVDIMM设备组成了Region0,该Region上划分了一个Namespace0.0,该Namespace在OS内核上表现为一个/dev/pmem0,通过DAX文件系统向应用程序所在的用户空间提供一个持久内存池。Pmem官网:Namespaces
二、cxl-cli、ndctl、daxctl的一般命令
根据Pmem官网介绍,cxl-cli、ndctl、daxctl是用来管理NVDIMM设备的工具,其中ndctl、daxctl用来管理Pmem和Namespace,cxl-cli用来管理CXL设备。Pmem官网:Installing NDCTL, DAXCTL, and CXL-CLI Utilities
那这样来看,目前Intel应该是将CXL扩展内存设备看做linux内核中的一种
NVDIMM
设备子系统,但是,但是NVDIMM是插在内存插槽上,CXL设备是插在PCIe插槽上,按照插槽不同,两种设备应该不能混为一谈。
同时在高版本的Linux内核(6.3.0-rc3)中已经加入了适配的驱动程序,目前还在不断开发中(2023.3):
Linux内核文档:Compute Express Link Memory Devices
Linux内核文档:LIBNVDIMM Non-Volatile Devices
有关这三个工具的命令手册在Pmem官网:NDCTL User Guide都有较为详细的介绍,下面简单列举一些:
$ man -k ndctl # 显示与"libnvdimm"子系统设备(非易失性内存)相关的命令
ndctl-activate-firmware # 在内存设备上激活暂存的固件
ndctl-check-labels # 确定给定的DIMM是否具有有效的命名空间索引块
ndctl-check-namespace # 检查命名空间元数据的一致性
ndctl-clear-errors # 清除给定命名空间上的所有错误(坏块)
ndctl-create-namespace # 创建或重新配置命名空间
ndctl-destroy-namespace # 销毁给定的命名空间
ndctl-disable-dimm # 禁用一个或多个空闲DIMM
ndctl-disable-namespace # 禁用给定的命名空间
ndctl-disable-region # 禁用给定区域及其所有后代命名空间
ndctl-enable-dimm # 启用一个或多个DIMM
ndctl-enable-namespace # 启用给定的命名空间
ndctl-enable-region # 启用给定区域及其所有后代命名空间
ndctl-freeze-security # 设置给定DIMM拒绝未来的安全操作
ndctl-init-labels # 初始化DIMM或一组DIMM上的标签数据区域
ndctl-inject-error # 在命名空间偏移处注入媒体错误
ndctl-inject-smart # 在DIMM上执行智能阈值/注入操作
ndctl-list # 以json格式输出平台NVDIMM设备拓扑和属性
ndctl-load-keys # 将KEK和加密的密码短语加载到密钥环中
ndctl-monitor # 监视nvdimm对象的智能事件
ndctl-read-infoblock # 读取并可选地解析命名空间中的信息块
ndctl-read-labels # 读取DIMM或一组DIMM上的标签区域
ndctl-remove-passphrase # 停止DIMM在掉电时锁定并需要密码短语访问媒体
ndctl-sanitize-dimm # 对给定的NVDIMM执行加密破坏或覆盖
ndctl-setup-passphrase # 为NVDIMM设置和启用安全密码短语
ndctl-start-scrub # 启动地址范围擦除(ARS)操作
ndctl-update-firmware # 更新给定设备的固件
ndctl-update-passphrase # 更新NVDIMM的安全密码短语
ndctl-wait-overwrite # 等待覆盖操作完成
ndctl-wait-scrub # 等待地址范围擦除(ARS)操作完成。
ndctl-write-infoblock # 生成并写入信息块。
ndctl-write-labels # 将数据写入DIMM的标签区域。
ndctl-zero-labels # 将DIMM的标签区域清零。
$ man -k daxctl
daxctl # Linux内核设备-DAX功能的枚举和配置命令
daxctl-create-device # 创建devdax设备
daxctl-destroy-device # 销毁devdax设备
daxctl-disable-device # 禁用devdax设备
daxctl-enable-device # 启用devdax设备
daxctl-list # 在JSON格式中列出平台的Device-DAX区域、设备和属性
daxctl-migrate-device-model # 加入/sys/bus/dax设备模型,允许使用替代的Device-DAX实例驱动程序
daxctl-offline-memory # 关闭系统内存模式下的设备内存
daxctl-online-memory # 在系统内存模式下启用设备内存
daxctl-reconfigure-device # 将dax设备重新配置为不同的模式
$ man -k cxl
cxl # CXL平台的枚举和配置命令
cxl-list # 列出支持CXL的内存设备及其属性(以JSON格式)
cxl-read-labels # 从CXL memdev上读取标签区域
cxl-write-labels # 向memdev写入数据到标签区域
cxl-zero-labels # 在一组memdev上清除标签区域
cxl_new # 创建一个作为所有库操作句柄的新库上下文对象
libcxl # 通过sysfs(5)和ioctl(2)接口与CXL设备进行交互的库
三、其他参考
两个NVDIMM相关的PPT:
NVDIMM - CHANGES ARE HERE SO WHAT’S NEXT?
NVDIMM-N cookbook: A soup-to-nuts primer on using NVDIMM-ns to improve your storage performance
一个未曾谋面的师兄硕士论文:
张煜. NVDIMM固态盘的闪存芯片控制器与可靠性研究[D].国防科技大学,2017.DOI:10.27052/d.cnki.gzjgu.2017.000222.