李欣澤,孫大東,濮約剛,馬 帥
(中國航天科工集團(tuán)第二研究院七〇六所,北京 100854)
長(zhǎng)期以來,處理器訪問內(nèi)存與外存設(shè)備間存在巨大延遲,傳統(tǒng)的計(jì)算機(jī)體系結(jié)構(gòu)中一般將內(nèi)存和外存作為兩個(gè)獨(dú)立的部分,因此產(chǎn)生了分層存儲(chǔ)技術(shù),將那些處理器急需處理的數(shù)據(jù)通過預(yù)測(cè)等方法,提前放置在快速訪問的存儲(chǔ)層中。隨著新一代內(nèi)存技術(shù)的發(fā)展,尤其是非易失內(nèi)存的出現(xiàn),對(duì)計(jì)算機(jī)體系中的由處理器內(nèi)部緩存、內(nèi)存、外存3個(gè)層級(jí)的數(shù)據(jù)存儲(chǔ)架構(gòu)發(fā)起挑戰(zhàn)?;谧止?jié)尋址的非易失內(nèi)存(non-volatile memory,NVM),具有與動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dynamic random access memory,DRAM)相近的性能、高集成度和較低的靜態(tài)能耗等優(yōu)秀特性,為存儲(chǔ)系統(tǒng)的發(fā)展提供了重大機(jī)遇,吸引了研究人員的廣泛關(guān)注。NVM的出現(xiàn)有效彌合了內(nèi)存與外存之間的差距,模糊了二者之間的界限。然而NVM自身也存在局限性,例如有限的讀寫使用壽命、不對(duì)稱的讀寫延遲、較高的成本、無法與傳統(tǒng)內(nèi)存原位替代等,限制了NVM在工業(yè)界的應(yīng)用。
由于自身的屬性限制,當(dāng)前針對(duì)NVM的研究多采用DRAM模擬的方式開展,主要實(shí)現(xiàn)對(duì)NVM讀寫性能的模擬測(cè)試,而并未能實(shí)現(xiàn)NVM掉電后數(shù)據(jù)不丟的功能。若要實(shí)現(xiàn)后者,現(xiàn)階段往往需要針對(duì)NVM設(shè)備重新設(shè)計(jì)主板,成本高昂。同時(shí),現(xiàn)階段隸屬于ARM指令集的國產(chǎn)處理器,以及國產(chǎn)操作系統(tǒng)對(duì)非易失內(nèi)存的支持不夠友好。因此本文提出了一種非易失內(nèi)存模擬方法,基于國產(chǎn)通用服務(wù)器平臺(tái)和國產(chǎn)操作系統(tǒng),在軟件層面對(duì)DRAM等易失性內(nèi)存進(jìn)行模擬,使其具有非易失內(nèi)存掉電數(shù)據(jù)不丟的功能。為了在軟件層面實(shí)現(xiàn)對(duì)非易失功能的模擬,本文實(shí)現(xiàn)的模擬方法對(duì)操作系統(tǒng)內(nèi)核和設(shè)備驅(qū)動(dòng)進(jìn)行了相應(yīng)的修改,并開發(fā)了用戶態(tài)的應(yīng)用軟件,該模擬方法繞過了對(duì)硬件的調(diào)整與修改,可以在現(xiàn)有硬件條件不改變的情況下,支持服務(wù)器內(nèi)存實(shí)現(xiàn)非易失功能。
近年來,非易失存儲(chǔ)技術(shù)得到了快速發(fā)展,在尋址方式上主要分為塊尋址和字節(jié)尋址兩種[1]。塊尋址的非易失存儲(chǔ)設(shè)備以閃存(Flash)為代表,主要分為NOR Flash以及NAND Flash兩類,主要適用于外存;對(duì)于字節(jié)尋址的非易失存儲(chǔ)設(shè)備,主要適用于內(nèi)存,習(xí)慣上被稱之為持久性內(nèi)存(persistent memory,PM),與之類似的名詞還有存儲(chǔ)級(jí)內(nèi)存(storage class memory,SCM)等,目前學(xué)術(shù)界對(duì)字節(jié)尋址的非易失內(nèi)存設(shè)備統(tǒng)一稱為持久內(nèi)存。
字節(jié)尋址的非易失內(nèi)存設(shè)備主要包括磁性存儲(chǔ)器(Magnetic RAM,MRAM)、自選扭矩轉(zhuǎn)換隨機(jī)存儲(chǔ)器(Spin-Torque Transfer RAM,STT-RAM)、阻變存儲(chǔ)器(Resistive RAM,RRAM)、相變存儲(chǔ)器(Phase-Changed RAM,PCRAM or PCM)等。塊尋址和字節(jié)尋址的非易失存儲(chǔ)設(shè)備之間有廣泛的共同點(diǎn),例如較低的訪問時(shí)延以及非易失性,它們之間的區(qū)別也相對(duì)明顯,這些差異直接影響存儲(chǔ)器的基本指標(biāo),例如訪問延時(shí)、存儲(chǔ)密度、設(shè)備耐久以及每個(gè)存儲(chǔ)單元中存儲(chǔ)的位數(shù)等等[2]。表1展示了DRAM與部分非易失存儲(chǔ)器的特性對(duì)比。
表1 DRAM與部分非易失存儲(chǔ)器的部分特性[3]
閃存與持久內(nèi)存處在不同的發(fā)展階段,關(guān)于持久內(nèi)存的研究大部分在實(shí)驗(yàn)室中進(jìn)行,而閃存的一些研究成果已經(jīng)被商業(yè)化,廣泛應(yīng)用于固態(tài)硬盤(solid state disk,SSD)中,取得了優(yōu)秀的成果[4]。對(duì)于持久內(nèi)存的應(yīng)用方面,非易失雙列直插存儲(chǔ)模塊(non-volatile dual inline memory module,NVDIMM)是目前唯一商用的持久性內(nèi)存存儲(chǔ)器件[5],NVDIMM采用閃存和DRAM混合的方式,使用電容供電或者后備電源供電的方式保證DRAM數(shù)據(jù)掉電不丟。2015年,英特爾和鎂光公司聯(lián)合發(fā)布了3D-XPoint技術(shù)[6],并于2019年發(fā)布了基于DIMM接口的傲騰內(nèi)存[7](Optane DC Persistent Memory)。隨著非易失存儲(chǔ)器技術(shù)的進(jìn)一步發(fā)展與應(yīng)用,基于該技術(shù)構(gòu)建持久性主存存儲(chǔ)系統(tǒng)是滿足應(yīng)用日益增長(zhǎng)的性能需求的有效方法。
雖然NVM的出現(xiàn)有效彌合了內(nèi)存與外部存儲(chǔ)之間的差距,模糊了內(nèi)外存之間的界限,但是因其自身的局限性,例如有限的設(shè)備壽命、昂貴的成本以及不對(duì)稱的讀寫延遲等,限制了NVM的規(guī)模化應(yīng)用[8]。因此,為了滿足研究人員對(duì)NVM的需求,一個(gè)折中的辦法是在現(xiàn)有的存儲(chǔ)介質(zhì)上進(jìn)行一定程度的修改來模擬NVM。一些工作通過調(diào)整內(nèi)存的訪問時(shí)延、帶寬等方式來模擬非易失內(nèi)存,Duan等提出的HME[9]基于NUMA架構(gòu)實(shí)現(xiàn)了對(duì)混合內(nèi)存結(jié)構(gòu)(DRAM+NVM)的讀寫帶寬以及延遲的模擬,主要通過判斷cache是否命中來區(qū)分不同的寫操作類型。這些工作往往需要特定的硬件支持,或者僅對(duì)于特定的內(nèi)存結(jié)構(gòu)有效,在一定程度上缺乏可擴(kuò)展性和可移植性。
因此為了使研究人員盡量減少對(duì)現(xiàn)有硬件的修改與調(diào)整,從而快速開展針對(duì)NVM的研究工作,一些工作在相對(duì)通用內(nèi)存結(jié)構(gòu)上進(jìn)行非易失內(nèi)存模擬。Hu等提出的NVM Streaker[10]不需要復(fù)雜的硬件以及對(duì)操作系統(tǒng)的支持,通過硬件參數(shù)配置層以及軟件干擾機(jī)制實(shí)現(xiàn)非易失內(nèi)存模擬,其優(yōu)勢(shì)在于通過硬件參數(shù)的配置可以實(shí)現(xiàn)多種NVM的靈活模擬。這些工作的局限性也較為明顯,多使用x86指令架構(gòu)的英特爾處理器,在隸屬ARM指令架構(gòu)的FT2000+/64等國產(chǎn)處理器上沒有相應(yīng)的支持,擴(kuò)展性和可移植性不佳。
目前關(guān)于NVM的模擬工作,主要針對(duì)NVM讀寫時(shí)延[11]、磨損情況[12]等性能指標(biāo)的模擬,對(duì)于實(shí)驗(yàn)室中的研究工作具有重要的意義,但是在實(shí)際的工程應(yīng)用中,非易失內(nèi)存模擬技術(shù)并未關(guān)注非易失存儲(chǔ)設(shè)備最基本的“非易失”功能,即關(guān)機(jī)時(shí)保存數(shù)據(jù)以及開機(jī)時(shí)恢復(fù)數(shù)據(jù),因此無法滿足實(shí)際工程應(yīng)用中對(duì)非易失存儲(chǔ)設(shè)備的需求。
本方法主要是在DRAM等易失性內(nèi)存上模擬非易失存儲(chǔ)功能,因此需要操作系統(tǒng)將DRAM當(dāng)作非易失內(nèi)存看待??偟膩碚f,本方法較傳統(tǒng)方法相比,進(jìn)一步實(shí)現(xiàn)的核心功能為關(guān)機(jī)時(shí)數(shù)據(jù)保存以及開機(jī)后數(shù)據(jù)恢復(fù)功能。在數(shù)據(jù)保存時(shí),應(yīng)用層程序需要讀取內(nèi)存條中的數(shù)據(jù)并寫入備用存儲(chǔ)介質(zhì)中,備用存儲(chǔ)介質(zhì)的功能類似于NVDIMM-N內(nèi)存條中Flash閃存的作用,即起到持久化數(shù)據(jù)存儲(chǔ)的作用;在數(shù)據(jù)恢復(fù)時(shí),應(yīng)用層程序讀取備用存儲(chǔ)介質(zhì)中的數(shù)據(jù),將其寫入DRAM中,起到存儲(chǔ)狀態(tài)恢復(fù)的作用。在具體實(shí)現(xiàn)中,本文實(shí)現(xiàn)的非易失存儲(chǔ)功能模擬使用DRAM+NVMe固態(tài)硬盤的架構(gòu),通過NVDIMM總線將DRAM注冊(cè)為非易失存儲(chǔ)設(shè)備,使用NVMe固態(tài)硬盤作為持久化數(shù)據(jù)存儲(chǔ)設(shè)備。
目前的國產(chǎn)操作系統(tǒng)并未實(shí)現(xiàn)對(duì)非易失內(nèi)存的支持,因此需要在國產(chǎn)操作系統(tǒng)上對(duì)非易失內(nèi)存進(jìn)行驅(qū)動(dòng)適配開發(fā)以及設(shè)計(jì)實(shí)現(xiàn)應(yīng)用層的訪問接口,同時(shí)對(duì)操作系統(tǒng)內(nèi)核進(jìn)行相應(yīng)的修改。
本方法的應(yīng)用層設(shè)計(jì)思路如圖1所示。
圖1 應(yīng)用層設(shè)計(jì)
非易失存儲(chǔ)設(shè)備的非易失性具體表現(xiàn)在系統(tǒng)掉電之后數(shù)據(jù)不丟,該功能可以拆解為關(guān)機(jī)時(shí)數(shù)據(jù)保存到備用的存儲(chǔ)介質(zhì)中以及開機(jī)時(shí)從備用存儲(chǔ)介質(zhì)中讀取數(shù)據(jù)并寫回到DRAM中。因此應(yīng)用層的設(shè)計(jì)分為兩個(gè)部分:一是開機(jī)恢復(fù)數(shù)據(jù),二是關(guān)機(jī)保存數(shù)據(jù),而這兩個(gè)部分的主要功能十分類似,區(qū)別僅在與開機(jī)恢復(fù)數(shù)據(jù)是從讀取備用存儲(chǔ)設(shè)備向內(nèi)存中寫入數(shù)據(jù),而關(guān)機(jī)保存數(shù)據(jù)是從內(nèi)存讀取數(shù)據(jù)向備用存儲(chǔ)設(shè)備寫入數(shù)據(jù),因此設(shè)計(jì)思路十分相似。
在關(guān)機(jī)保存數(shù)據(jù)和開機(jī)恢復(fù)數(shù)據(jù)的應(yīng)用層設(shè)計(jì)中,本方法將內(nèi)存劃分為固定大小的數(shù)據(jù)區(qū),對(duì)每個(gè)固定大小的數(shù)據(jù)區(qū),使用多個(gè)進(jìn)程來對(duì)其進(jìn)行更細(xì)粒度的訪問與寫入,在每個(gè)數(shù)據(jù)區(qū)中,每個(gè)進(jìn)程負(fù)責(zé)的更細(xì)粒度的數(shù)據(jù)塊的相對(duì)位置是固定的。舉例來說,進(jìn)程1負(fù)責(zé)每個(gè)數(shù)據(jù)區(qū)中相對(duì)地址為0-2 GB空間內(nèi)共2 GB大小數(shù)據(jù)塊的讀取與寫入,進(jìn)程2負(fù)責(zé)每個(gè)數(shù)據(jù)區(qū)中相對(duì)地址為2 GB~4 GB空間內(nèi)共2 GB大小數(shù)據(jù)塊的讀取與寫入,以此類推。
總之,在應(yīng)用層的設(shè)計(jì)中,需要內(nèi)核層提供數(shù)據(jù)區(qū)以及數(shù)據(jù)塊的虛擬地址,以及數(shù)據(jù)塊的總數(shù),因此在驅(qū)動(dòng)層的設(shè)計(jì)中,需要將這兩部分?jǐn)?shù)據(jù)通過ioctl接口提供給應(yīng)用層。
本節(jié)中提到的非易失內(nèi)存在物理層面上是DRAM內(nèi)存條,只是在操作系統(tǒng)層面將其視為非易失內(nèi)存,具體表現(xiàn)為將DRAM內(nèi)存條通過NVDIMM總線注冊(cè)為非易失內(nèi)存。本方法的驅(qū)動(dòng)層設(shè)計(jì)的整體架構(gòu)如圖2所示。
圖2 驅(qū)動(dòng)層設(shè)計(jì)整體架構(gòu)
本節(jié)接下來的內(nèi)容將詳細(xì)論述每個(gè)驅(qū)動(dòng)部分的具體功能與設(shè)計(jì)思路。
2.2.1 非易失內(nèi)存接口參數(shù)驅(qū)動(dòng)
非易失內(nèi)存內(nèi)核參數(shù)接口驅(qū)動(dòng)提供一種基于操作系統(tǒng)內(nèi)核參數(shù)的非易失內(nèi)存設(shè)備注冊(cè)方法,利用系統(tǒng)啟動(dòng)時(shí)內(nèi)核參數(shù)傳遞非易失內(nèi)存的地址空間信息,然后由操作系統(tǒng)內(nèi)核向NVDIMM總線完成非易失內(nèi)存的注冊(cè)。
基于內(nèi)核參數(shù)接口的非易失內(nèi)存注冊(cè)處理具體的實(shí)現(xiàn)思路是在內(nèi)核處理參數(shù)函數(shù)中新增加對(duì)于非易失內(nèi)存的支持,按照類似操作易失內(nèi)存的注冊(cè)流程使用非易失內(nèi)存。具體設(shè)計(jì)是將非易失內(nèi)存的物理地址空間和對(duì)應(yīng)的地址空間大小追加到內(nèi)核的引導(dǎo)參數(shù)之后,可以在內(nèi)核啟動(dòng)參數(shù)中多次添加非易失內(nèi)存配置項(xiàng)從而實(shí)現(xiàn)多個(gè)非易失內(nèi)存的注冊(cè)。在固件加載操作系統(tǒng)內(nèi)核并引導(dǎo)操作系統(tǒng)后,操作系統(tǒng)在啟動(dòng)內(nèi)核參數(shù)處理函數(shù)中檢測(cè)到非易失內(nèi)存配置參數(shù),隨后從內(nèi)核的普通內(nèi)存訪問空間中移除相應(yīng)大小的地址空間。將移除的地址空間插入到內(nèi)核的IOMEM資源列表中,并將該資源置為PMEM,檢測(cè)并添加非易失內(nèi)存設(shè)備。當(dāng)所有的非易失內(nèi)存設(shè)備添加完成后,遍歷IOMEM資源列表,查找是否具有標(biāo)記為PMEM的資源,向操作系統(tǒng)注冊(cè)一個(gè)設(shè)備名稱為PMEM的平臺(tái)設(shè)備。最后,操作系統(tǒng)非易失內(nèi)存的平臺(tái)設(shè)備驅(qū)動(dòng)初始化,依次遍歷IOMEM資源,通過NVDIMM總線的設(shè)備注冊(cè)接口將PMEM資源所表示的地址注冊(cè)為非易失內(nèi)存設(shè)備。
該驅(qū)動(dòng)實(shí)現(xiàn)了一種簡(jiǎn)單的非易失內(nèi)存注冊(cè)方法,方便非易失內(nèi)存的配置,而且也可用于在服務(wù)器沒有非易失內(nèi)存條的情況下使用普通內(nèi)存模擬非易失內(nèi)存,驗(yàn)證操作系統(tǒng)的非易失內(nèi)存相關(guān)的驅(qū)動(dòng)功能。
2.2.2 非易失內(nèi)存地址空間合并
非易失內(nèi)存地址空間合并的主要功能是實(shí)現(xiàn)將內(nèi)核的IOMEM資源列表中所有標(biāo)志為PMEM的內(nèi)存資源空間合并成一個(gè)地址空間。合并之后的一個(gè)地址空間對(duì)應(yīng)著一個(gè)namespace節(jié)點(diǎn)。通過namespace節(jié)點(diǎn)可以訪問所有的、離散的非易失內(nèi)存地址空間。這樣做可以兼容現(xiàn)有的工具以及用戶層程序的接口。從用戶層視角來看,非易失內(nèi)存是一整塊完整的內(nèi)存空間,而不必關(guān)心是否是離散的內(nèi)存地址空間。而對(duì)于內(nèi)核層的實(shí)現(xiàn),需要在Linux內(nèi)核層的非易失內(nèi)存驅(qū)動(dòng)中將離散的非易失內(nèi)存對(duì)應(yīng)的物理地址空間逐次注冊(cè)進(jìn)驅(qū)動(dòng)中,最后建立物理地址空間與虛擬地址空間之間的映射關(guān)系。圖3是非易失內(nèi)存地址空間合并。
圖3 非易失內(nèi)存地址合并
在非易失內(nèi)存的驅(qū)動(dòng)注冊(cè)非易失內(nèi)存物理地址空間時(shí),本方法只注冊(cè)一塊物理地址空間,其它物理地址空間不注冊(cè),但是統(tǒng)計(jì)所有的物理地址空間的大小,即將所有的物理地址空間進(jìn)行累加,將累加后的物理地址空間總大小作為申請(qǐng)空間的接口函數(shù)參數(shù)并申請(qǐng)一塊虛擬地址連續(xù)的虛擬地址空間。然后根據(jù)物理地址空間的首地址的升序原則,依次將每個(gè)物理地址空間與申請(qǐng)的虛擬地址空間對(duì)應(yīng)的偏移位置進(jìn)行映射。memmap預(yù)留地址空間,即通過grub參數(shù),將普通內(nèi)存條上的部分物理地址空間預(yù)留出來作為模擬NVDIMM內(nèi)存使用。預(yù)留出來多塊物理地址空間,將物理地址映射到申請(qǐng)的連續(xù)虛擬地址空間中。從用戶層來看,實(shí)際的非易失內(nèi)存分布情況對(duì)其透明,便于文件系統(tǒng)等其它系統(tǒng)軟件的開發(fā)。
非易失內(nèi)存的釋放與注冊(cè)一一對(duì)應(yīng),如果每次僅僅申請(qǐng)新的虛擬地址空間,而不進(jìn)行釋放,系統(tǒng)運(yùn)行一段時(shí)間后,會(huì)將空閑的虛擬地址空間耗盡,導(dǎo)致系統(tǒng)異常。所以在申請(qǐng)并且注冊(cè)了非易失內(nèi)存后,在退出的時(shí)候需要將注冊(cè)的虛擬地址空間釋放。而釋放的時(shí)候需要根據(jù)之前注冊(cè)的地址塊和空間大小進(jìn)行釋放。
2.2.3 非易失內(nèi)存設(shè)備驅(qū)動(dòng)設(shè)計(jì)
本方法實(shí)現(xiàn)的非易失內(nèi)存模擬實(shí)現(xiàn)了3種驅(qū)動(dòng)方式:分別是字節(jié)訪問設(shè)備驅(qū)動(dòng)、標(biāo)準(zhǔn)塊設(shè)備驅(qū)動(dòng)以及直接訪問塊設(shè)備。下面分別介紹其實(shí)現(xiàn)細(xì)節(jié):
字節(jié)訪問設(shè)備驅(qū)動(dòng)將非易失內(nèi)存注冊(cè)為字符設(shè)備,字符設(shè)備提供open和mmap操作接口,應(yīng)用程序打開字符設(shè)備后,可以通過mmap直接將非易失內(nèi)存映射到程序地址空間,按照類似memcpy/memset的方式使用非易失內(nèi)存。處理器直接使用LOAD和STORE指令讀寫非易失內(nèi)存對(duì)應(yīng)的物理地址空間,跳過Linux內(nèi)核的頁緩存和通用塊設(shè)備層,無需特殊的驅(qū)動(dòng)作為訪問中轉(zhuǎn),完全由應(yīng)用程序自己維護(hù)非易失內(nèi)存空間的數(shù)據(jù)組織管理,因此字符模式設(shè)備驅(qū)動(dòng)對(duì)應(yīng)用程序是非透明的,需要應(yīng)用程序針對(duì)非易失內(nèi)存進(jìn)行修改,能夠感知到非易失內(nèi)存設(shè)備的存在。圖4是字符設(shè)備驅(qū)動(dòng)。
圖4 字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)
非易失內(nèi)存標(biāo)準(zhǔn)塊設(shè)備驅(qū)動(dòng)在內(nèi)核中引入塊設(shè)備封裝層(block translate table,BTT),保證對(duì)非易失內(nèi)存每次更新一個(gè)塊設(shè)備扇區(qū)都是原子的,即對(duì)一個(gè)塊內(nèi)容的更新要么全部成功要么全部失敗,從而可以保證在系統(tǒng)突然掉電時(shí)對(duì)非易失內(nèi)存塊數(shù)據(jù)更新的原子特性。BTT的實(shí)現(xiàn)方法是建立一個(gè)邏輯的LBA和真實(shí)的LBA之間的映射表,每次更新的時(shí)候,先完成物理LBA的更新,然后再刷新BTT轉(zhuǎn)換表中塊邏輯LBA和塊真實(shí)LBA的對(duì)應(yīng)關(guān)系,通過BTT封裝層可以保證操作系統(tǒng)每次更新非易失內(nèi)存設(shè)備塊時(shí)都是完整的。標(biāo)準(zhǔn)塊設(shè)備驅(qū)動(dòng)對(duì)應(yīng)用程序提供標(biāo)準(zhǔn)的塊設(shè)備,支持現(xiàn)有的塊訪問模式,對(duì)應(yīng)用程序來說是透明的,應(yīng)用程序可以使用操作系統(tǒng)內(nèi)核里實(shí)現(xiàn)的軟RAID、鏡像、加密、壓縮等中間層驅(qū)動(dòng)所帶來的功能。
非易失內(nèi)存直接訪問塊設(shè)備類似標(biāo)準(zhǔn)塊設(shè)備,支持現(xiàn)有的塊訪問模式,但是支持文件系統(tǒng)繞過內(nèi)核的頁緩存直接訪問。操作系統(tǒng)的頁緩存主要是針對(duì)傳統(tǒng)的低速存儲(chǔ)介質(zhì)的內(nèi)核讀寫緩存機(jī)制,主要目的是提升存儲(chǔ)介質(zhì)的讀寫性能,然而對(duì)于高速低延遲的非易失內(nèi)存,其讀寫帶寬和延遲均接近普通內(nèi)存,此時(shí)再使用內(nèi)核的頁緩存機(jī)制并不能提升讀寫帶寬,反而會(huì)增加讀寫的延遲,而且由于使用普通內(nèi)存作為數(shù)據(jù)緩存,增加非易失內(nèi)存在異常掉電時(shí)數(shù)據(jù)不一致的風(fēng)險(xiǎn)。
2.2.4 數(shù)據(jù)保存恢復(fù)驅(qū)動(dòng)
在本方法中,將每個(gè)DRAM內(nèi)存條看作字符設(shè)備,提供open、read以及write等操作接口,應(yīng)用程序打開字符設(shè)備后,按照正常使用字符設(shè)備的方式讀取或者寫入非易失內(nèi)存。向內(nèi)核注冊(cè)并創(chuàng)建內(nèi)存條對(duì)應(yīng)數(shù)目的字符設(shè)備,隨后記錄IOMEM中的內(nèi)存條物理地址信息,包括起始物理地址、大小以及內(nèi)存條編號(hào)等等信息,之后根據(jù)記錄的內(nèi)存條信息以及內(nèi)核給出的DRAM信息,給每個(gè)內(nèi)存條分配一個(gè)相應(yīng)大小的虛擬地址空間,并在頁表中建立內(nèi)存條物理地址空間與虛擬地址空間之間的映射,最后根據(jù)記錄的內(nèi)存信息,將內(nèi)存條上的數(shù)據(jù)劃分為固定大小的數(shù)據(jù)區(qū),并記錄每個(gè)數(shù)據(jù)區(qū)的起始虛擬地址,通過ioctl將這些數(shù)據(jù)區(qū)起始虛擬地址提供給應(yīng)用層。圖5展示了數(shù)據(jù)保存恢復(fù)驅(qū)動(dòng)與應(yīng)用程序之間的交互。
圖5 數(shù)據(jù)保存恢復(fù)驅(qū)動(dòng)與應(yīng)用層的交互
本文基于國產(chǎn)處理器平臺(tái)飛騰2000+/64位設(shè)計(jì)以下實(shí)驗(yàn),對(duì)比了使用非易失模擬功能的易失性內(nèi)存機(jī)器與使用真實(shí)的NVDIMM-N非易失內(nèi)存機(jī)器之間的數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)恢復(fù)功能的執(zhí)行時(shí)間和讀寫性能,得到了這兩種情況下的數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)恢復(fù)時(shí)間等性能結(jié)果,并且分析了得到本文實(shí)驗(yàn)結(jié)果的原因。
實(shí)驗(yàn)中采用了兩臺(tái)NUMA架構(gòu)服務(wù)器,一臺(tái)支持NVDIMM-N非易失內(nèi)存條的使用,并對(duì)固件、基板管理控制器(baseboard manage controller,BMC)等進(jìn)行了調(diào)整與修改,另一臺(tái)使用普通的DRAM內(nèi)存條,并使用NVMe固態(tài)硬盤作為備用存儲(chǔ)介質(zhì)實(shí)現(xiàn)持久性數(shù)據(jù)存儲(chǔ),詳細(xì)配置分別見表2和表3。
本章接下來的部分將詳細(xì)說明關(guān)機(jī)階段數(shù)據(jù)存儲(chǔ)以及開機(jī)階段數(shù)據(jù)恢復(fù)等功能執(zhí)行時(shí)間的實(shí)驗(yàn)設(shè)計(jì)以及數(shù)據(jù)存儲(chǔ)恢復(fù)時(shí)讀寫性能的實(shí)驗(yàn)設(shè)計(jì),并且分別對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行分析。
表2 支持NVDIMM-N的主機(jī)配置
表3 使用本文模擬方法的主機(jī)配置
本文分別測(cè)量了使用非易失功能模擬以及使用真實(shí)的NVDIMM-N內(nèi)存條時(shí),數(shù)據(jù)保存以及恢復(fù)所消耗的時(shí)間。對(duì)于非易失功能模擬的執(zhí)行時(shí)間,可以通過統(tǒng)計(jì)進(jìn)程開始以及執(zhí)行結(jié)束的時(shí)間相減得到,對(duì)于使用真實(shí)的NVDIMM-N的執(zhí)行時(shí)間,可以通過連接串口統(tǒng)計(jì)關(guān)機(jī)數(shù)據(jù)保存以及開機(jī)數(shù)據(jù)恢復(fù)功能的開始和結(jié)束時(shí)間。實(shí)驗(yàn)過程中,進(jìn)行多次實(shí)驗(yàn)對(duì)每種功能的執(zhí)行時(shí)間取平均值,實(shí)驗(yàn)結(jié)果見表4。
表4 執(zhí)行時(shí)間對(duì)比/s
根據(jù)實(shí)驗(yàn)結(jié)果,使用非易失內(nèi)存模擬執(zhí)行數(shù)據(jù)保存以及數(shù)據(jù)恢復(fù)的執(zhí)行時(shí)間要小于使用NVDIMM-N內(nèi)存的執(zhí)行時(shí)間,通過分析,主要原因如下:第一,在非易失功能模擬方法中,使用了多進(jìn)程的設(shè)計(jì)思想,充分發(fā)揮了CPU的性能,加快了數(shù)據(jù)保存以及數(shù)據(jù)恢復(fù)的處理速度;第二,在實(shí)驗(yàn)中發(fā)現(xiàn),使用NVDIMM-N執(zhí)行數(shù)據(jù)保存和數(shù)據(jù)恢復(fù)時(shí),有很大可能出現(xiàn)執(zhí)行超時(shí)重新執(zhí)行的現(xiàn)象,表現(xiàn)在實(shí)際使用中,會(huì)出現(xiàn)長(zhǎng)達(dá)7 min到9 min不等的長(zhǎng)時(shí)延。出現(xiàn)這種情況的原因是復(fù)雜多樣的,其中比較重要的一點(diǎn)是前文曾經(jīng)提到的,使用非易失內(nèi)存時(shí)需要對(duì)服務(wù)器的硬件設(shè)計(jì)以及固件等進(jìn)行修改,而這些修改并不能完全保證非易失內(nèi)存使用的穩(wěn)定性,因此限制了非易失內(nèi)存在實(shí)際的工程應(yīng)用中效率的發(fā)揮。而使用純軟件的非易失功能模擬,在內(nèi)核層、驅(qū)動(dòng)層以及用戶層進(jìn)行開發(fā)與修改,會(huì)繞過對(duì)硬件的修改,簡(jiǎn)化實(shí)現(xiàn)模擬非易失存儲(chǔ)功能的難度。
上文的評(píng)價(jià)指標(biāo)是數(shù)據(jù)保存以及數(shù)據(jù)恢復(fù)的執(zhí)行時(shí)間,在一定程度上可以說明相比于使用NVDIMM-N內(nèi)存實(shí)現(xiàn)非易失功能,本文提出的使用DRAM+NVMe進(jìn)行非易失功能模擬方法在性能上有一定的優(yōu)勢(shì),但是針對(duì)時(shí)間指標(biāo)的驗(yàn)證粒度比較粗,因此,為了進(jìn)一步驗(yàn)證上述兩種實(shí)現(xiàn)非易失功能的性能差異,進(jìn)行對(duì)于讀寫性能的測(cè)試與驗(yàn)證,讀寫性能越高,也就表示在實(shí)現(xiàn)非易失功能時(shí)的效率越高。
本次實(shí)驗(yàn)中,針對(duì)不同的讀寫方式,測(cè)試設(shè)備的每秒讀寫次數(shù)(Input/Output Per Second,IOPS)以及傳輸帶寬來表示設(shè)備的讀寫性能。本次實(shí)驗(yàn)使用開源測(cè)試工具fio測(cè)試塊大小為4 kB,進(jìn)程數(shù)為8時(shí),上述兩種方法的IOPS以及傳輸帶寬。實(shí)驗(yàn)針對(duì)順序讀、順序?qū)?、隨機(jī)讀、隨機(jī)寫、順序讀寫隨機(jī)讀寫等6種IO方式進(jìn)行了測(cè)試,得出以下實(shí)驗(yàn)結(jié)果。圖6和圖7分別測(cè)試了模擬方法與實(shí)際的NVDIMM-N內(nèi)存設(shè)備在順序讀、順序?qū)?、隨機(jī)讀、隨機(jī)寫、順序讀寫以及隨機(jī)讀寫任務(wù)中的IOPS指標(biāo);圖8~圖10分別測(cè)試了模擬方法與實(shí)際的NVDIMM-N內(nèi)存設(shè)備在順序讀、順序?qū)?、隨機(jī)讀、隨機(jī)寫、順序讀寫以及隨機(jī)讀寫任務(wù)中的帶寬指標(biāo)。
圖6 模擬方法與NVDIMM-N設(shè)備IOPS對(duì)比(1)
圖7 模擬方法與NVDIMM-N設(shè)備的IOPS對(duì)比(2)
圖8 模擬方法與NVDIMM-N設(shè)備讀帶寬對(duì)比
圖9 模擬方法與NVDIMM-N設(shè)備寫帶寬對(duì)比
圖10 模擬方法與NVDIMM-N設(shè)備讀寫帶寬對(duì)比
根據(jù)上述實(shí)驗(yàn)結(jié)果,可以發(fā)現(xiàn)在順序讀和隨機(jī)讀方面,使用NVDIMM-N的性能要優(yōu)于使用DRAM+NVMe的非易失功能模擬方法,在順序?qū)?、隨機(jī)寫、順序讀寫以及隨機(jī)讀寫方面,使用DRAM+NVMe的非易失功能模擬方法的讀寫性能整體上優(yōu)于使用NVDIMM-N的讀寫性能,根據(jù)分析思考,主要原因是在使用非易失功能模擬時(shí),本質(zhì)上是通過NVDIMM總線將DRAM設(shè)備注冊(cè)為非易失內(nèi)存設(shè)備來使用DRAM的,而DRAM本身的讀寫性能整體上優(yōu)于NVDIMM-N等非易失內(nèi)存設(shè)備。
本文使用DRAM作為內(nèi)存,NVMe固態(tài)硬盤作為備用存儲(chǔ)介質(zhì),通過對(duì)應(yīng)用層、驅(qū)動(dòng)層以及內(nèi)核層的軟件層面上的修改,實(shí)現(xiàn)了一種非易失功能模擬方法,該方法繞過了對(duì)通用設(shè)備硬件的修改,在軟件層面實(shí)現(xiàn)了非易失功能。本文進(jìn)一步將使用非易失模擬功能的設(shè)備與真正的非易失內(nèi)存條NVDIMM-N設(shè)備進(jìn)行實(shí)驗(yàn)對(duì)比,驗(yàn)證了本文提出的方法在數(shù)據(jù)保存以及數(shù)據(jù)恢復(fù)功能上的執(zhí)行時(shí)間較短,讀寫性能整體上較優(yōu),在對(duì)非易失內(nèi)存有使用需要的工程實(shí)踐中具有應(yīng)用推廣價(jià)值。
本文將非易失內(nèi)存視為外部存儲(chǔ)設(shè)備使用,通過DRAM與NVMe之間的配合,可以替代NVDIMM-N設(shè)備而作為一個(gè)持久化數(shù)據(jù)存儲(chǔ)層,在一定程度上對(duì)非易失功能進(jìn)行了模擬。
但是NVDIMM-N等非易失內(nèi)存作為內(nèi)存使用的方向潛力巨大,有很大的可能改變現(xiàn)有的內(nèi)外存分層存儲(chǔ)架構(gòu),因此未來的工作可能要更加關(guān)注將非易失內(nèi)存作為運(yùn)行內(nèi)存使用,例如保存系統(tǒng)狀態(tài)等方面的工作。