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