CMB的深入了解与实际应用

描述

1、什么是CMB

在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host Memory Buffer)的不同处在于所使用的内存地址位于控制器自己的内存中,而不是位于主机内存中,但它们使用队列的方式都是一样的。

2、如何获取CMB的配置信息

在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

3、CMB在NVMe PCIe驱动中的应用

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的写入上可能也会有一定的提升。

4、CMB在NVMe Over Fabric/TCP中的应用

因为CMB在PCIe上读操作比写操作慢很多,所以NVMe PCIe驱动中没有采用通过CMB读取CQ的办法。不过在NVMe的另外分支Over Fabric和Over TCP上,CMB可以更好地发挥自身优势,减少网络传输的交互次数,提高包含多个交换机的PCI Express结构拓扑的效率。

5、CMB的性能测试

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对齐访问。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分