陳 波 陸游游 蔡 濤 陳游旻 屠要峰 舒繼武
1(江蘇大學計算機科學與通信工程學院 江蘇鎮(zhèn)江 212013) 2(清華大學計算機科學與技術系 北京 100084) 3(中興通訊股份有限公司 南京 210012)(chenbo_9312@163.com)
近年來,新興的非易失存儲器[1-3](non-volatile memory, NVM)具有字節(jié)可尋址、非易失、存儲密度高和訪問延遲低等特性,其通過內存總線連接CPU的NVM形態(tài)也被稱為持久性內存(persistent memory, PM).NVM的出現(xiàn)重新定義了計算機體系結構中易失性與非易失性的界限,以往由系統(tǒng)軟件保障的數(shù)據(jù)一致性轉變?yōu)橛蒀PU硬件保障.另一方面,遠程直接內存訪問(remote direct memory access, RDMA)因其高速、超低延時、零拷貝和內核旁路的網(wǎng)絡傳輸特性,逐漸被應用到數(shù)據(jù)中心.RDMA可以實現(xiàn)應用程序間點對點的通信,同時避免了上下文切換、冗余內存拷貝和內核網(wǎng)絡協(xié)議棧等開銷.持久性內存和RDMA的出現(xiàn)為構建新型存儲系統(tǒng)[4-12]提供了新的機遇.
持久性內存和RDMA具有的新特性對存儲系統(tǒng)的一致性設計提出了2項挑戰(zhàn):1)現(xiàn)代處理器利用多核和內部緩存來提高整體運行速度,通常采用亂序執(zhí)行技術,導致最終寫入內存的數(shù)據(jù)并非是預期的結果,針對持久性內存會出現(xiàn)數(shù)據(jù)一致性的問題.此時,為了將數(shù)據(jù)順序地寫入持久性內存,CPU需要主動執(zhí)行數(shù)據(jù)刷寫指令,然而此過程開銷高昂,降低CPU的處理能力,影響持久性內存和RDMA的性能優(yōu)勢;2)RDMA的通訊過程需要注冊內存,且提供了單向原語可以繞過服務器端CPU直接讀寫已注冊的內存.為了性能考慮,RDMA會將數(shù)據(jù)先寫入至末級高速緩存,由于CPU不能及時將數(shù)據(jù)刷寫至持久性內存,因此,一旦出現(xiàn)系統(tǒng)崩潰,原始數(shù)據(jù)將無法有效恢復.
對于數(shù)據(jù)的一致性策略,現(xiàn)有的存儲系統(tǒng)要么完全不考慮數(shù)據(jù)一致性例如Octopus[13],要么使用常見的Redo/Undo[14]日志機制、Log-Structure技術或影子分頁[15](shadow paging)技術等來保障操作的原子性.然而,使用Redo/Undo日志會導致數(shù)據(jù)重復寫問題,在加重數(shù)據(jù)持久化開銷的同時,還會浪費帶寬和加速持久性內存磨損;而影子分頁技術采用異地更新數(shù)據(jù)塊的方法,將原有指向舊數(shù)據(jù)塊的指針更新指向新的數(shù)據(jù)塊,但這將有可能導致所有的數(shù)據(jù)更新蔓延到根節(jié)點[15].針對服務器端不可感知客戶端寫入數(shù)據(jù)的問題,一種可行的方案是采用客戶端執(zhí)行RDMA send原語發(fā)送數(shù)據(jù)給服務器端,服務器端將數(shù)據(jù)寫到指定的地址,然后執(zhí)行數(shù)據(jù)持久化操作,但此方式引入了冗余拷貝[16].
為此,本文提出并實現(xiàn)了一種分布式持久性內存文件系統(tǒng)的一致性機制CCM,該機制主要包括:首先提出并實現(xiàn)了一種基于操作日志的一致性保障策略,將元數(shù)據(jù)地址和數(shù)據(jù)的地址與大小寫入操作日志,并原子地修改操作日志的尾指針且持久化,這樣系統(tǒng)崩潰后,可通過持久化的操作日志進行恢復,這樣可保證元數(shù)據(jù)和數(shù)據(jù)的一致性.然后,設計了一種客戶端對服務器端遠程寫一致性策略,該策略中客戶端使用RDMA write-with-imm原語遠程寫入服務器端內存,此原語附帶客戶端標識符,服務器端可以感知其攜帶的客戶端標識符,進而服務器端CPU可以定位需要刷寫的地址,對客戶端寫入的數(shù)據(jù)執(zhí)行持久化操作,保證數(shù)據(jù)的持久化.最后,實現(xiàn)了一種服務器端的數(shù)據(jù)異步持久化,通過對元數(shù)據(jù)、數(shù)據(jù)和操作日志執(zhí)行異步刷寫,降低了持久化操作的開銷.
為保證系統(tǒng)發(fā)生故障后能恢復一致性的狀態(tài),現(xiàn)有的持久性內存存儲系統(tǒng)一般使用日志的方式來保障一致性,也有不少系統(tǒng)未考慮一致性這個問題.下面從持久性內存文件系統(tǒng)一致性機制和面向RDMA的分布式持久性內存文件系統(tǒng)一致性機制2個方面介紹相關工作.
1) 持久性內存文件系統(tǒng)一致性機制
本文的一致性指的是系統(tǒng)斷電或故障后數(shù)據(jù)仍舊一致.目前在單機上的典型的持久性內存文件系統(tǒng)一致性研究工作有:NOVA[17]是加利福利亞大學圣地亞哥分校提出的基于混合內存的日志結構文件系統(tǒng),它巧妙地結合了日志結構組織方式與易失/非易失性內存的特性,利用日志結構修改的原子性和混合內存快速地隨機訪問性能設計并實現(xiàn)了一套強一致性的操作接口.它為每個索引節(jié)點分配一個日志,提高了文件系統(tǒng)讀寫和恢復階段的并發(fā)性能,針對多個索引節(jié)點間的操作,它采用了Journaling的方式保障數(shù)據(jù)修改的原子性.BPFS[18]是微軟公司提出的字節(jié)尋址的持久性內存文件系統(tǒng),它通過修改CPU緩存控制器和內存控制器等硬件的方式來保障數(shù)據(jù)寫入的順序性,并利用硬件級別的原子寫操作和影子技術實現(xiàn)了數(shù)據(jù)塊的原地更新,保障數(shù)據(jù)的一致性.但是針對跨目錄間的數(shù)據(jù)移動拷貝操作它需要較大的空間記錄原子操作的更新,開銷較大.PMFS[19]是英特爾公司為持久性內存設計的輕量級文件系統(tǒng),針對元數(shù)據(jù)和數(shù)據(jù)分別采用Journaling和寫時復制技術來保障一致性,然而不能同時保障元數(shù)據(jù)和數(shù)據(jù)修改的一致性.Ext4-DAX[20]繞過操作系統(tǒng)的頁緩存,可以更高效地讀寫持久性存儲設備.針對元數(shù)據(jù)的修改采用Journaling保障一致性,針對數(shù)據(jù)的修改未提供類似的機制,所以不能保障數(shù)據(jù)修改的原子性.Aerie[21]是惠普公司提出的面向持久性內存的文件系統(tǒng)操作接口,實現(xiàn)了應用程序直接讀寫持久性內存而無需內核的介入,然而其未考慮數(shù)據(jù)的一致性.除此之外,Wu等人[22]提出的面向持久性內存的文件系統(tǒng)SCMFS,構建在虛擬內存空間之上,并利用內存管理單元將文件系統(tǒng)的地址映射至持久性內存的物理地址,同樣未考慮文件系統(tǒng)的一致性.這些工作均是單機的持久性內存文件系統(tǒng)一致性機制研究工作.
2) 面向RDMA持久性內存文件系統(tǒng)一致性機制
在面向RDMA的分布式持久性內存系統(tǒng)下,Islam等人[23]結合RDMA和持久性內存的特性在HDFS基礎上實現(xiàn)了分布式文件系統(tǒng)NVFS,它利用RDMA的高性能特性設計并實現(xiàn)了一套高效的網(wǎng)絡通信接口,利用字節(jié)尋址的持久性內存構建緩沖池,將寫前日志和計算的中間結果保存在NVM,這極大提高了系統(tǒng)整體性能,然而它未考慮數(shù)據(jù)的一致性.Lu等人[13]設計并實現(xiàn)了分布式持久性內存文件系統(tǒng)Octopus,它將文件系統(tǒng)的讀寫操作與RDMA讀寫原語相結合起來,實現(xiàn)了一套高性能的遠程過程調用和讀寫接口.同時,利用RDMA的讀寫和原子操作實現(xiàn)了分布式事務機制,充分發(fā)揮RDMA的性能優(yōu)勢,減少了傳統(tǒng)事務操作中網(wǎng)絡通信和CPU處理所帶來的開銷.然而,它未考慮本地的數(shù)據(jù)和元數(shù)據(jù)一致性.
上述研究工作在一致性方面的相關工作總結如表1所示:
Table 1 Related Works About Consistency表1 一致性機制相關工作
本文提出了一種分布式持久性內存文件系統(tǒng)的一致性機制CCM,其整體系統(tǒng)結構如圖1所示:分為客戶端和服務器端,服務器端的設計由存儲管理、遠程過程調用和一致性組成.
Fig.1 Architecture of CCM圖1 一致性機制結構圖
服務器端存儲管理主要包含元數(shù)據(jù)和數(shù)據(jù)管理、Hash索引管理和日志管理3個方面.1)元數(shù)據(jù)和數(shù)據(jù)管理:存儲于持久性內存,其中元數(shù)據(jù)區(qū)存儲著數(shù)據(jù)文件大小,修改時間和數(shù)據(jù)地址等信息,數(shù)據(jù)區(qū)存儲著文件和目錄數(shù)據(jù)塊,存儲方式如圖2所示,采用寫時復制方式,相比于Log-Structure組織方式,能減少垃圾回收的開銷.服務器端各數(shù)據(jù)區(qū)組成分布式持久共享內存池,從而能不依賴本地文件系統(tǒng)直接管理數(shù)據(jù)對象,減少了IO請求在內存中的拷貝.2)Hash索引管理:存儲于DRAM,存儲著元數(shù)據(jù)的索引信息,通過Hash表索引文件或目錄的元數(shù)據(jù),其中每一個條目包含文件名,文件索引節(jié)點和指向具有相同Hash值的下一個條目,通過文件全路徑可以計算出元數(shù)據(jù)的索引信息,進而得到索引節(jié)點的物理地址.3)日志管理:用于保存文件系統(tǒng)操作的日志,存儲于持久性內存.
Fig.2 The layout of metadata and data圖2 元數(shù)據(jù)和數(shù)據(jù)組織方式
如圖1所示,客戶端與服務器端通信的方式是采用RPC機制,本文使用RDMA write_with_imm原語構建RPC機制,imm_data的內容是客戶端標識符,保證全局唯一性,相比于RDMA write原語,可以減少服務器端CPU輪詢消息緩存區(qū)的時間開銷.在數(shù)據(jù)讀寫密集的場景下服務器端CPU容易出現(xiàn)瓶頸[16],本文將使用客戶端主動讀寫數(shù)據(jù)的方式,即客戶端發(fā)送讀寫請求至服務器端,服務器端將該請求的元數(shù)據(jù)(讀寫內存地址信息)返回給客戶端,客戶端主動讀寫服務器端內存,這種方式的好處是:利用RDMA硬件特性將服務器端CPU的處理負載均攤到客戶端.
面向RDMA的分布式持久性內存文件系統(tǒng)的一致性問題主要來源2個方面:1)CPU不能保障將數(shù)據(jù)從高速緩存順序持久化至持久性內存,因此,需要軟件系統(tǒng)執(zhí)行硬件指令強制刷寫數(shù)據(jù)至持久性內存;2)客戶端使用RDMA直寫操作繞過服務器端CPU將數(shù)據(jù)直接寫入服務器端的內存,此時服務器端CPU沒有感知到內存的寫入操作,因此也無法執(zhí)行對應的持久化操作.此外,強制持久化的硬件指令開銷高昂,例如,CLFLUSH指令延遲大約200 ns[24],這極大浪費了CPU的處理帶寬.
針對服務器端CPU無法主動執(zhí)行刷寫操作的問題,本文設計了一種客戶端對服務器端遠程寫一致性策略,可以獲取客戶端的寫入操作.針對持久化操作開銷高的問題,本文實現(xiàn)了一種服務器端的數(shù)據(jù)異步持久化,該方法通過對元數(shù)據(jù)、數(shù)據(jù)和操作日志執(zhí)行異步持久化來降低持久化操作引入的開銷.
我們面向分布式持久性內存文件系統(tǒng)實現(xiàn)了一致性機制CCM,其關鍵技術包括3個方面:1)基于操作日志的一致性保障策略;2)客戶端對服務器端的遠程寫一致性;3)服務器端的數(shù)據(jù)異步持久化.
Fig.3 Operation log圖3 操作日志
操作日志記錄著每一次操作的元信息,其內容如圖3所示,記錄著該操作的類型、日志長度、Inode號、元數(shù)據(jù)首地址和數(shù)據(jù)首地址及大小.具體執(zhí)行過程是:客戶端向服務器端執(zhí)行讀寫操作,服務器端將該操作的元信息寫入日志并持久化,原子更新日志尾指針并持久化,此保障此次操作的一致性.
例如追加寫文件A,首先服務器端將舊版本元數(shù)據(jù)和數(shù)據(jù)拷貝至新的地址,并對新版本元數(shù)據(jù)進行修改,此時,操作日志記錄操作的類型為追加寫,元數(shù)據(jù)地址為新版本元數(shù)據(jù)的首地址,數(shù)據(jù)地址為新版本數(shù)據(jù)的首地址和文件A即將追加寫入的數(shù)據(jù)大小,然后將待寫入數(shù)據(jù)的地址信息返回給客戶端,客戶端根據(jù)該地址信息寫入數(shù)據(jù).本系統(tǒng)的一致性依賴于操作日志的尾指針是否持久化,需要保證在所有刷寫操作完成之后原子更新日志尾指針并持久化.當系統(tǒng)崩潰時重放日志可恢復到一致性狀態(tài),如果日志寫入一半,系統(tǒng)崩潰,由于之前的日志狀態(tài)是一致的,持久性內存的分配信息可恢復,不會出現(xiàn)持久性內存泄漏的問題.
Fig.4 Remote data flushing圖4 遠程寫感知的流程圖
RDMA中客戶端主動寫操作流程是客戶端向服務器端發(fā)送寫請求,服務器端接收請求后將該請求的元數(shù)據(jù)返回給客戶端,客戶端接收元數(shù)據(jù)后執(zhí)行RDMA write原語,將數(shù)據(jù)寫入服務器端對應的地址.然而,客戶端執(zhí)行RDMA write原語寫服務器端內存的方式存在一個問題,即服務器端CPU對客戶端遠程寫數(shù)據(jù)的不可感知性,當系統(tǒng)崩潰時,無法保證服務器端的數(shù)據(jù)持久化.
因此,本文設計了一種客戶端對服務器端的遠程寫一致性策略,使服務器端能感知客戶端的寫入操作,其流程如圖4(a)所示,客戶端在接收到元數(shù)據(jù)后,使用RDMA write_with_imm原語執(zhí)行遠程寫,該原語與RDMA write類似,不同點是當執(zhí)行遠程寫時,服務器端接收隊列消費一個接收請求,獲得一個32 b的imm_data和感知客戶端的寫入操作,進而執(zhí)行持久化操作.存在另一種方式,使得服務器端也可感知客戶端的寫入操作,如圖4(b)所示,客戶端利用RDMA send原語發(fā)送數(shù)據(jù)至服務器端,然后服務器端將數(shù)據(jù)從接收緩沖區(qū)拷貝至指定的地址.相比于RDMA send原語,使用RDMA write_with_imm原語執(zhí)行遠程寫操作可減少1次內存拷貝開銷.
Fig.5 The detailed process of flushing data圖5 數(shù)據(jù)刷寫過程
在數(shù)據(jù)持久化過程中,CPU刷寫操作的開銷非常高昂,等待服務器端完成刷寫操作會產生較高的延遲,本文不阻塞主線程的執(zhí)行,通過數(shù)據(jù)異步持久化,避免了延遲的產生,提高了服務器端CPU的處理效率.異步持久化后的狀態(tài)信息由客戶端維護,即當客戶端發(fā)起請求時,服務器端通過判斷操作日志當前尾指針與上次尾指針的地址大小,將上一次異步請求的持久化狀態(tài)返回給客戶端,讓客戶端獨立管理操作一致性的狀態(tài)信息.
現(xiàn)在分析不同場景下服務器端使用異步刷寫保障一致性的方法.數(shù)據(jù)刷寫過程如圖5所示.1)當執(zhí)行至遠程寫數(shù)據(jù)或異步刷寫數(shù)據(jù)時系統(tǒng)崩潰,將部分或全部元數(shù)據(jù)、數(shù)據(jù)或日志寫入持久性內存,但操作日志尾指針未修改,則重放操作日志會恢復至上一次一致性狀態(tài),此次操作的所有記錄無效;2)當執(zhí)行完修改操作日志尾指針時系統(tǒng)崩潰,由于尾指針未執(zhí)行持久化刷寫操作,結果和步驟1相同;3)當執(zhí)行完刷寫操作日志尾指針或更新Hash表時系統(tǒng)崩潰,此時操作日志的尾指針已持久化,表明此次操作所有數(shù)據(jù)已持久化,通過重放日志可以重新執(zhí)行此操作,恢復當前一致性狀態(tài).
執(zhí)行異步持久化時,本文為1~16 KB的小文件實現(xiàn)了Batch刷寫方法,即基于寫入次數(shù)或寫入數(shù)據(jù)量批處理優(yōu)化方法,該方法的好處是可以減少異步線程的調度開銷,提高系統(tǒng)性能.
由于一致性機制會影響系統(tǒng)的性能,本節(jié)實驗將從3個方面對分布式持久性內存文件系統(tǒng)的一致性機制進行測試.1)對比測試客戶端對服務器端的遠程寫帶寬的性能;2)測試服務器端數(shù)據(jù)的異步持久化對寫帶寬的性能影響;3)同類數(shù)據(jù)一致性機制寫帶寬性能測試.
在實驗測試中,本文測試的IO大小為1 KB~1 MB,定義1~16 KB的文件為小文件,超過16 KB定義為大文件.使用的實驗環(huán)境配置如表2所示:客戶端和服務器端配置為相同運行環(huán)境,當前還缺乏商用的持久性內存設備,本文測試環(huán)境使用CLWB和PCOMMIT指令模擬持久性內存操作延遲.
Table 2 Experiment Configuration表2 實驗環(huán)境配置
本節(jié)主要測試客戶端對服務器端的遠程寫帶寬,并與客戶端使用RDMA send原語發(fā)送數(shù)據(jù)至服務器端的一致性策略進行比較,實驗結果如圖6所示,客戶端使用RDMA write-with-imm原語對服務器端遠程寫一致性策略在IO大小為1 KB~1 MB時,帶寬傳輸速率提升9%~45%,主要原因是該策略減少一次內存拷貝開銷.客戶端使用RDMA send原語將數(shù)據(jù)發(fā)到給服務器端時,服務器端CPU需從緩沖區(qū)將數(shù)據(jù)拷貝到數(shù)據(jù)區(qū),這一次的內存拷貝影響了服務器端CPU的處理能力.
Fig.6 Write bandwidth of RDMA verbs圖6 RDMA不同原語寫帶寬測試
本節(jié)實驗使用的IO大小范圍為1 KB~1 MB,實驗結果如圖7所示,在IO大小為1 MB時,異步持久化的寫帶寬相比同步刷寫模式提升了7倍左右,這是由于同步刷寫大文件耗時長從而影響了服務器端CPU的處理能力,而異步線程刷寫過程大文件并不影響主線程的執(zhí)行效率.當IO大小為1~16 KB之間時,異步持久化的寫帶寬性能低于同步刷寫,主要是異步線程占用的資源過多,為此本文設計了Batch的優(yōu)化方法,明顯提高了小文件刷寫的性能,當IO大小為4 KB和16 KB時,寫帶寬性能分別提高2.5倍和1.4倍.
Fig.7 Write bandwidth of sync and async圖7 同步和異步寫帶寬測試
綜合以上優(yōu)化方法,服務器端使用數(shù)據(jù)異步持久化后,實驗結果如圖8所示,采用write-with-imm原語的一致性機制CCM相比使用send-recv原語的一致性機制具有更高的寫帶寬,當IO大小為256 KB和1 MB時,前者較后者寫帶寬性能提升29%和35%,主要原因是前者減少1次內存拷貝,在RDMA作為網(wǎng)絡通信方式時,該拷貝所帶來的時間開銷會嚴重影響服務器端的處理效率.在IO大小為1 MB時,分布式持久性內存文件系統(tǒng)的一致性機制CCM寫帶寬達到5 582 MBps,與Octopus(5 629 MBps)相比,性能影響控制在1%以內,相比于原生的網(wǎng)絡帶寬(6 305 MBps),寫帶寬性能達到88%.
Fig.8 Impact of consistency mechanism圖8 一致性機制對寫帶寬的影響測試
Fig.9 Write bandwidth of consistency mechanism圖9 不同一致性機制寫寬帶測試
本節(jié)實驗的對比對象為Ordered Journaling一致性機制,實驗結果如圖9所示,當IO大小為1 MB時,Ordered Journaling的一致性機制寫帶寬為5 389 MBps,相比于Octopus,對寫帶寬性能的影響為5%,而本文所設計的一致性機制CCM的寫帶寬為5 582 MBps,相比于Octopus,對寫帶寬性能的影響為1%,這主要是因為Ordered Journaling機制會存在元數(shù)據(jù)重復寫的開銷,而CCM設計了基于操作日志的一致性保障策略,避免了多余的寫操作.
非易失性內存具有字節(jié)尋址、低功耗和讀寫性能接近DRAM等特性,有望代替DRAM成為新的主存器件.RDMA能有效提高吞吐率、降低網(wǎng)絡通信延遲,為設計高效的分布式文件系統(tǒng)提供了支撐.本文的工作建立在我們之前的工作Octopus之上,為分布式持久性內存文件系統(tǒng)提供一致性保障.本文設計了一種客戶端對服務器端遠程寫一致性策略和實現(xiàn)了服務器端的數(shù)據(jù)異步持久化.實驗結果表明,相比于Octopus,分布式持久性內存文件系統(tǒng)一致性機制對寫帶寬性能的影響控制在1%以內.