【CXL】cxl-cli、ndctl、daxctl管理linux内核中NVDIMM设备子系统

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简介

计算机系统中的两种主要存储设备:内存和外存。

  • 内存的访问时延在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. 操作系统层面的访问方式

  1. 通过pmem方式使用

即按照持久内存的方式使用,CPU直接使用load/store指令访问NVDIMM设备(字节寻址),跳过OS内核空间的page cache、通用块层,也无需特别的驱动作为访问中转(因为此种访问方式是内存式访问)。这种访问方式下,需要应用程序自己管理NVDIMM存储空间,即将NVDIMM部分存储空间映射到用户空间,交由应用程序自己使用。

下图中最右边的虚线和右侧第二条线都是这种访问方式。不同的是右侧第二条访问线需要通过OS文件系统提供的接口访问,并且文件系统需支持DAX(direct access)机制(ext4,xfs已支持)——用户通过文件系统访问设备绕过page cache、通用块层,直接使用mmap将文件映射到应用程序地址空间中,而文件位于NVDIMM设备上。这样的好处在于用户可以使用文件系统实现的permission、quota等机制。
在这里插入图片描述

  1. 通过块设备(btt/sector)方式使用(BLK方式)

通过块设备方式来访问NVDIMM,这样的优势在于可以使用linux kernel实现的软raid、mirror、加密/压缩等中间层驱动所带来的功能。

  1. Pmem+块设备混合访问

上述具体细节可以继续阅读:
简书:nvdimm
Pmem官网:PMEM and BLK Modes

5. NVDIMM中几个相关概念

  • namespace:在NVDIMM设备上,软件或者硬件可以将NVDIMM设备划分几个区域,这些区域就是namespace。

    • 这几个不同的区域可以采用不同的访问方式它们,分别是:Pmem方式、BLK方式和 Pmem+BLK方式,所以namespac大小、范围和访问方式这三个基本属性。
    • 通过ndctl工具可以查看、创建和修改主机上的NVDIMM的namespace
  • 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.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值