在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)。
1)CMBLOC(Controller Memory Buffer Location),是指存储区的位置信息,其中OFST(Offset)表示存储区的偏移地址,单位是CMBSZ.SZ,注意要是4KB对齐。BIR(Base Indicator Register)则表示PCI BAR(基地址寄存器)的序号,上图中使用的是Bar0空间。
2)CMBSZ(Controller Memory Buffer Size),是指存储区的大小信息。其中Size是指CMB中可用空间的长度,注意单位也是CMBSZ.SZ。Size Units(SZU)表示CMB的单位是多少,从下表中我们可以看到,只要device有足够的空间,CMB的大小可以配置得非常大的。
例如Size Units是4KB,那么CMB大小是512x*4KB=2MB,偏移地址是0x100*4KB=1MB。
3)接下来的几个bit就表示该设备支持CMB的哪些用途
a、Write Data Support(WDS),表示是否支持主机直接将data和meta_data发送到设备的CMB。Read Data Support(RDS),表示是否支持主机从设备的CMB中读取data和meta_data。
b、PRP SGL List Support,表示是否支持主机将PRP list或者SGL list写入到设备的CMB中。
c、Completion Queue Support(CQS)和Submission Queue Support(SQS)分别表示设备是否支持在CMB中实现Admin和IO的完成队列和发送队列。ssss
1)通常在主机内存中实现的发送队列会要求控制器到主机内存执行PCIe的读取操作来获取队列内容。而基于CMB实现的发送队列,则是主机将发送队列中的命令直接写入控制器的内部存储空间中,这样减少了一个控制器从主机读取命令的动作,可以减少命令执行的延迟。目前,在Linux Kernel 4.15中,NVMe驱动已经支持通过CMB发送SQ。
2)同样,PRP list或SGL list需要在PCIe协议上需要进行单独的读取操作,这也可以通过将PRP或SGL写入控制器内存缓冲区来减少控制器的读取动作。
3)在协议中有提到让主机将data或meta data写入控制器内存缓冲区,而不是让控制器从主机内存中获取数据或元数据。后面我们有实验可以看到CMB在少量数据的写入方面比较有利,所以CMB在meta data的写入上可能也会有一定的提升。
因为CMB在PCIe上读操作比写操作慢很多,所以NVMe PCIe驱动中没有采用通过CMB读取CQ的办法。不过在NVMe的另外分支Over Fabric和Over TCP上,CMB可以更好地发挥自身优势,减少网络传输的交互次数,提高包含多个交换机的PCI Express结构拓扑的效率。
1)运行环境:Ubuntu 18.04.1 LTS
2)内核版本:4.15.0-45-generic
3)控制器芯片:Starblaze STAR1000
4) 说明:以下测试进行NVMe和CMB的小数据读写测试对比。因为基于STAR1000的OC方案是4KBytes的physical_block_size,所以NVMe命令的最小数据长度是基于4K的,要实现小于4K的数据传输,则会损失一部分带宽。以下的对比测试都是QD1的读写。
• 测试写带宽
• 测试写IOPS
• 测试读带宽
• 测试读IOPS
• 测试4K数据的稳定性
从以上的测试可以看到:
在性能方面,CMB 64Bytes的写带宽能达到1.063GiB/s,对应的IOPS是16.6M,最高的IOPS(8Bytes写)能到19.07M,是NVMe命令实现的340倍;读的性能相比写要低一些,但是8Bytes读的IOPS也能达到1.06M,是NVMe命令实现的23倍。相比NVMe命令的IOPS,CMB的读写延迟有明显的优势。
在稳定性方面,读写的抖动是很小的。
6
Open Channel SSD与CMB的结合
ss
目前忆芯科技的OCSSD与CMB结合应用的一个场景就是持久性内存(Persistent Memory),它具有非易失性、较低延迟、可Bytes寻址的特性,使数据管理具有更大的灵活性。它非常适合需要频繁访问复杂数据集的环境,以及因电源故障或系统崩溃导致停机的敏感环境。现有PM方案提供以下几个特性:
1)易用的API
▪ int nvm_pm_write(struct nvm_pm_dev* dev, void* buf,unsigned int length, unsigned int offset)
▪ int nvm_pm_read(struct nvm_pm_dev* dev, void* buf,unsigned int length, unsigned int offset)
2)异常掉电保护
目前Star-OCSSD为CMB提供的默认掉电保护空间是2MiB(可以根据具体需求调整),固件会在掉电前保证将数据写入到Nand Flash中,并在下一次上电时加载到CMB区域。
3)Byte访问
当前忆芯科技的STAR1000和STAR100P两款控制器的CMB支持PCIe最大有效负载大小的burst传输,支持Byte访问,也支持任意byte对齐访问。
全部0条评论
快来发表一下你的评论吧 !