1、 CMB在NVMe Express 1.2 Spec中开始支持的功能是什么,即CMB(控制器内存缓冲区),指SSD控制器内部的读写内存缓冲区。与HMB(主机内存缓冲区)的区别在于,使用的内存地址位于控制器的内存,而不是在主机内存中,但它们都以相同的方式使用队列。

2、如何获取CMB的配置信息NVMe SSD控制器中有两个寄存器,CMBLOC和CMBSZ是描述CMB的基本信息。您可以在主机中使用NVMe CLI工具来查看寄存器信息(nvme show-regs /dev/nvme0n1 -H)。

1) cmbloc(控制器内存缓冲区位置)是指存储区的位置信息,其中OFST(Offset)表示存储区的偏移地址,单位为CMBSZ。SZ注意,它是4KB对齐的。BIR(基址指示寄存器)表示PCI BAR(基址寄存器)的序列号,上图使用Bar0空间。

2) CMB SZ(控制器内存缓冲区大小)是指存储区域的大小信息。其中,大小是指CMB中可用空间的长度。注意单位也是CMBSZ。SZ尺寸单位(SZU)表示CMB的单位。从下表可以看出,只要设备有足够的空间,CMB的大小可以配置得很大。

例如,大小单位为4KB,则CMB大小为512x*4KB=2MB,偏移地址为0x100*4KB=1MB。

3)接下来的几个位表示器件支持CMB的哪些用途。

a、写数据支持(WDS),表示主机是否可以直接向设备的CMB发送数据和meta_data。读取支持(RDS)指示主机是否可以从设备的CMB读取数据和元数据。

b、PRP SGL列表支持,表明主机是否可以将PRP列表或SGL列表写入设备的CMB。

c、完成队列支持(CQS)和提交队列支持(SQS)分别表示设备是否支持CMB中Admin和IO的完成队列和发送队列。ssss

3、招商银行在NVMe PCIe驱动中的应用1)通常在主机内存中实现的发送队列将需要控制器从主机内存中读取PCIe以获得队列内容。基于CMB的发送队列是主机直接将发送队列中的命令写入控制器的内存空间,减少了控制器从主机读取命令的动作,减少了命令执行的延迟。目前在Linux内核4.15中,NVMe驱动已经支持通过CMB发送SQ。

2)同样,PCIe协议上需要单独读取PRP列表或SGL列表,也可以通过将PRP或SGL写入控制器的内存缓冲区来减少控制器的读取动作。

3)协议中提到,主机应该将数据或元数据写入控制器的内存缓冲区,而不是让控制器从主机内存中获取数据或元数据。后来我们可以看到,CMB在写入少量数据方面是有优势的,所以CMB也有可能提高元数据的写入。

4、 CMB CMB在NVMe的应用优于结构/TCP,因为CMB 在PCIe上的读取操作比写入操作慢得多,CQ不是由NVMe PCIe驱动程序中的CMB读取的。而在NVMe的其他分支上,Over Fabric和Over TCP,CMB可以充分发挥自身优势,减少网络传输的交互次数,提高多交换机PCI Express拓扑的效率。

5、 CMB 性能测试1)运行环境:Ubuntu 18.04.1 LTS

2)内核版本:4 . 15 . 0-45-通用

3)控制器芯片:Starblaze STAR1000

4)注:以下测试对比NVMe和招行的小数据读写测试。因为基于STAR1000的OC方案是4K字节的physical_block_size,所以NVMe命令的最小数据长度是基于4K的,要实现小于4K的数据传输,会损失一部分带宽。以下对比测试都是QD1的阅读和写作。

测试带宽

测试编写IOPS

测试带宽

试读IOPS

测试4K数据的稳定性

从上面的测试可以看出:

性能方面,CMB 64Bytes的写入带宽可达1.063GiB/s,对应的IOPS为16.6M,最高IOPS(8Bytes写入)可达19.07M,是NVMe命令的340倍。读的性能低于写,但8字节读的IOPS也能达到1.06M,是NVMe命令的23倍。与NVMe指挥的IOPS相比,中巴的读写延迟有明显的优势。

稳定性方面,读写抖动很小。

开放式固态硬盘和CMB的组合

悬浮物

目前OCSSD结合内存核心技术CMB的一个场景是持久内存,它具有非易失性、低延迟、字节可寻址的特点,使得数据管理更加灵活。它非常适合需要频繁访问复杂数据集的环境,以及因电源故障或系统崩溃而停机的敏感环境。现有的预防性维护方案具有以下特点:

1)易于使用的API

int nvm _ pm _ write(struct nvm _ pm _ dev * dev,void* buf,无符号整数长度,无符号整数偏移量)

int nvm _ pm _ read(struct nvm _ pm _ dev * dev,void* buf,无符号整数长度,无符号整数偏移量)

2)异常停电保护

目前Star-OCSSD为CMB提供的缺省断电保护空间为2MiB(可根据具体要求调整)。固件将确保数据在断电前写入Nand闪存,并在下次通电时加载到CMB区域。

3)字节访问

目前,内存技术的STAR1000和STAR100P控制器的CMB支持PCIe最大有效载荷大小的突发传输、字节访问和任意字节对齐访问。