在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host Memory Buffer)的不同处在于所使用的内存地址位于控制器自己的内存中,而不是位于主机内存中,但它们使用队列的方式都是一样的。
在NVMe SSD Controller 中有两个寄存器CMBLOC和CMBSZ是描述CMB的基本信息。在主机中可以使用NVMe-cli工具查看寄存器信息(nvme show-regs /dev/nvme0n1 -H)。
CMBLOC(Controller Memory Buffer Location),是指存储区的位置信息,其中OFST(Offset)表示存储区的偏移地址,单位是CMBSZ.SZ,注意要是4KB对齐。BIR(Base Indicator Register)则表示PCI BAR(基地址寄存器)的序号,。
CMBSZ(Controller Memory Buffer Size),是指存储区的大小信息。其中Size是指CMB中可用空间的长度,注意单位也是CMBSZ.SZ。Size Units(SZU)表示CMB的单位是多少,从下表中我们可以看到,只要device有足够的空间,CMB的大小可以配置得非常大的。
A -该设备的制造商已经在PCIe数据库中注册了其供应商ID和设备ID。这意味着你得到了一个人类可读的描述。
B—该设备有3个PCIe BAR: BAR0为16KB,是任何合法NVMe设备都必须具有的标准NVMe BAR。
第三个BAR是控制器内存缓冲区(CMB),它既可以用于NVMe队列,也可以用于NVMe数据。
F -由于这个设备是一个NVMe设备,它被绑定到标准的Linux内核NVMe驱动程序。
1. 将部分(或全部)NVMe队列放置在CMB而不是主机内存中,减少延迟。
2. 使用CMB作为DMA缓冲区允许卸载NVMe拷贝。可以提高主机性能,同时减轻主机CPU负担。
3.使用CMB作为DMA缓冲允许RDMA网卡直接将NVMe- of数据放入NVMe SSD中。减少延迟和CPU负载。
cmb_copy是一个示例应用程序,使用SPDK的api通过P2P dma在NVMe ssd之间复制数据。这绕过了CPU的内存和PCIe子系统。
A -从SSD A拷贝9MB到SSD B。
B—PCIe交换机上行端口的数据小于1MB。
C - SPDK命令行
p2pdma框架可以用来改进NVMe-of目标。这里我们展示了一个通用NVMe-oF系统的结果。
p2pdma可以减少CPU内存负载x50, CPU PCIe负载x25。NVMe offload还可以将CPU核心负载降低50倍。
NVMe cmb作为标准已经有一段时间了。然而,直到现在它们才开始变得可用,软件才开始使用它们。
2. 持久化内存区域增加了非易失性CMBs,也将需要(大量)软件支持。它们将在PCIe总线上启用一条通往持久内存存储的路径。
Enabling the NVMe™ CMB and PMR Ecosystem:
https://nvmexpress.org/wp-content/uploads/Session-2-Enabling-the-NVMe-CMB-and-PMR-Ecosystem-Eideticom-and-Mell....pdfnvmexpress.org/wp-content/uploads/Session-2-Enabling-the-NVMe-CMB-and-PMR-Ecosystem-Eideticom-and-Mell....pdf
p2pdma Linux kernel patches
https://github.com/sbates130272/linux-p2pmemgithub.com/sbates130272/linux-p2pmem
https://github.com/sbates130272/p2pmem-test
SPDK Peer-2-Peer DMAs:
https://spdk.io/doc/peer_2_peer.html
kernel p2pdma: https://www.kernel.org/doc/html/latest/driver-api/pci/p2pdma.html
支持NVME CMB设备
https://www.intel.com/content/www/u