1、什么是CMB
在NVMe Express 1.2 Spec中開始支持一個特性,那就是CMB(Controller Memory Buffer),是指SSD控制器內(nèi)部的讀寫存儲緩沖區(qū),與HMB(Host Memory Buffer)的不同處在于所使用的內(nèi)存地址位于控制器自己的內(nèi)存中,而不是位于主機(jī)內(nèi)存中,但它們使用隊列的方式都是一樣的。
2、如何獲取CMB的配置信息
在NVMe SSD Controller 中有兩個寄存器CMBLOC和CMBSZ是描述CMB的基本信息。在主機(jī)中可以使用NVMe-cli工具查看寄存器信息(nvme show-regs /dev/nvme0n1 -H)。
1)CMBLOC(Controller Memory Buffer Location),是指存儲區(qū)的位置信息,其中OFST(Offset)表示存儲區(qū)的偏移地址,單位是CMBSZ.SZ,注意要是4KB對齊。BIR(Base Indicator Register)則表示PCI BAR(基地址寄存器)的序號,上圖中使用的是Bar0空間。
2)CMBSZ(Controller Memory Buffer Size),是指存儲區(qū)的大小信息。其中Size是指CMB中可用空間的長度,注意單位也是CMBSZ.SZ。Size Units(SZU)表示CMB的單位是多少,從下表中我們可以看到,只要device有足夠的空間,CMB的大小可以配置得非常大的。
例如Size Units是4KB,那么CMB大小是512x*4KB=2MB,偏移地址是0x100*4KB=1MB。
3)接下來的幾個bit就表示該設(shè)備支持CMB的哪些用途
a、Write Data Support(WDS),表示是否支持主機(jī)直接將data和meta_data發(fā)送到設(shè)備的CMB。Read Data Support(RDS),表示是否支持主機(jī)從設(shè)備的CMB中讀取data和meta_data。
b、PRP SGL List Support,表示是否支持主機(jī)將PRP list或者SGL list寫入到設(shè)備的CMB中。
c、Completion Queue Support(CQS)和Submission Queue Support(SQS)分別表示設(shè)備是否支持在CMB中實現(xiàn)Admin和IO的完成隊列和發(fā)送隊列。ssss
3、CMB在NVMe PCIe驅(qū)動中的應(yīng)用
1)通常在主機(jī)內(nèi)存中實現(xiàn)的發(fā)送隊列會要求控制器到主機(jī)內(nèi)存執(zhí)行PCIe的讀取操作來獲取隊列內(nèi)容。而基于CMB實現(xiàn)的發(fā)送隊列,則是主機(jī)將發(fā)送隊列中的命令直接寫入控制器的內(nèi)部存儲空間中,這樣減少了一個控制器從主機(jī)讀取命令的動作,可以減少命令執(zhí)行的延遲。目前,在Linux Kernel 4.15中,NVMe驅(qū)動已經(jīng)支持通過CMB發(fā)送SQ。
2)同樣,PRP list或SGL list需要在PCIe協(xié)議上需要進(jìn)行單獨的讀取操作,這也可以通過將PRP或SGL寫入控制器內(nèi)存緩沖區(qū)來減少控制器的讀取動作。
3)在協(xié)議中有提到讓主機(jī)將data或meta data寫入控制器內(nèi)存緩沖區(qū),而不是讓控制器從主機(jī)內(nèi)存中獲取數(shù)據(jù)或元數(shù)據(jù)。后面我們有實驗可以看到CMB在少量數(shù)據(jù)的寫入方面比較有利,所以CMB在meta data的寫入上可能也會有一定的提升。
4、CMB在NVMe Over Fabric/TCP中的應(yīng)用
因為CMB在PCIe上讀操作比寫操作慢很多,所以NVMe PCIe驅(qū)動中沒有采用通過CMB讀取CQ的辦法。不過在NVMe的另外分支Over Fabric和Over TCP上,CMB可以更好地發(fā)揮自身優(yōu)勢,減少網(wǎng)絡(luò)傳輸?shù)慕换ゴ螖?shù),提高包含多個交換機(jī)的PCI Express結(jié)構(gòu)拓?fù)涞男省?/p>
5、CMB的性能測試
1)運行環(huán)境:Ubuntu 18.04.1 LTS
2)內(nèi)核版本:4.15.0-45-generic
3)控制器芯片:Starblaze STAR1000
4) 說明:以下測試進(jìn)行NVMe和CMB的小數(shù)據(jù)讀寫測試對比。因為基于STAR1000的OC方案是4KBytes的physical_block_size,所以NVMe命令的最小數(shù)據(jù)長度是基于4K的,要實現(xiàn)小于4K的數(shù)據(jù)傳輸,則會損失一部分帶寬。以下的對比測試都是QD1的讀寫。
? 測試寫帶寬
? 測試寫IOPS
? 測試讀帶寬
? 測試讀IOPS
? 測試4K數(shù)據(jù)的穩(wěn)定性
從以上的測試可以看到:
在性能方面,CMB 64Bytes的寫帶寬能達(dá)到1.063GiB/s,對應(yīng)的IOPS是16.6M,最高的IOPS(8Bytes寫)能到19.07M,是NVMe命令實現(xiàn)的340倍;讀的性能相比寫要低一些,但是8Bytes讀的IOPS也能達(dá)到1.06M,是NVMe命令實現(xiàn)的23倍。相比NVMe命令的IOPS,CMB的讀寫延遲有明顯的優(yōu)勢。
在穩(wěn)定性方面,讀寫的抖動是很小的。
6
Open Channel SSD與CMB的結(jié)合
ss
目前憶芯科技的OCSSD與CMB結(jié)合應(yīng)用的一個場景就是持久性內(nèi)存(Persistent Memory),它具有非易失性、較低延遲、可Bytes尋址的特性,使數(shù)據(jù)管理具有更大的靈活性。它非常適合需要頻繁訪問復(fù)雜數(shù)據(jù)集的環(huán)境,以及因電源故障或系統(tǒng)崩潰導(dǎo)致停機(jī)的敏感環(huán)境?,F(xiàn)有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)異常掉電保護(hù)
目前Star-OCSSD為CMB提供的默認(rèn)掉電保護(hù)空間是2MiB(可以根據(jù)具體需求調(diào)整),固件會在掉電前保證將數(shù)據(jù)寫入到Nand Flash中,并在下一次上電時加載到CMB區(qū)域。
3)Byte訪問
當(dāng)前憶芯科技的STAR1000和STAR100P兩款控制器的CMB支持PCIe最大有效負(fù)載大小的burst傳輸,支持Byte訪問,也支持任意byte對齊訪問。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74002 -
SSD
+關(guān)注
關(guān)注
21文章
2857瀏覽量
117366 -
HMB
+關(guān)注
關(guān)注
0文章
6瀏覽量
9193
原文標(biāo)題:NVMe又有新花樣!CMB vs HMB
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論