李欣澤,孫大東,濮約剛,馬 帥
(中國航天科工集團第二研究院七〇六所,北京 100854)
長期以來,處理器訪問內存與外存設備間存在巨大延遲,傳統的計算機體系結構中一般將內存和外存作為兩個獨立的部分,因此產生了分層存儲技術,將那些處理器急需處理的數據通過預測等方法,提前放置在快速訪問的存儲層中。隨著新一代內存技術的發展,尤其是非易失內存的出現,對計算機體系中的由處理器內部緩存、內存、外存3個層級的數據存儲架構發起挑戰。基于字節尋址的非易失內存(non-volatile memory,NVM),具有與動態隨機存取存儲器(dynamic random access memory,DRAM)相近的性能、高集成度和較低的靜態能耗等優秀特性,為存儲系統的發展提供了重大機遇,吸引了研究人員的廣泛關注。NVM的出現有效彌合了內存與外存之間的差距,模糊了二者之間的界限。然而NVM自身也存在局限性,例如有限的讀寫使用壽命、不對稱的讀寫延遲、較高的成本、無法與傳統內存原位替代等,限制了NVM在工業界的應用。
由于自身的屬性限制,當前針對NVM的研究多采用DRAM模擬的方式開展,主要實現對NVM讀寫性能的模擬測試,而并未能實現NVM掉電后數據不丟的功能。若要實現后者,現階段往往需要針對NVM設備重新設計主板,成本高昂。同時,現階段隸屬于ARM指令集的國產處理器,以及國產操作系統對非易失內存的支持不夠友好。因此本文提出了一種非易失內存模擬方法,基于國產通用服務器平臺和國產操作系統,在軟件層面對DRAM等易失性內存進行模擬,使其具有非易失內存掉電數據不丟的功能。為了在軟件層面實現對非易失功能的模擬,本文實現的模擬方法對操作系統內核和設備驅動進行了相應的修改,并開發了用戶態的應用軟件,該模擬方法繞過了對硬件的調整與修改,可以在現有硬件條件不改變的情況下,支持服務器內存實現非易失功能。
近年來,非易失存儲技術得到了快速發展,在尋址方式上主要分為塊尋址和字節尋址兩種[1]。塊尋址的非易失存儲設備以閃存(Flash)為代表,主要分為NOR Flash以及NAND Flash兩類,主要適用于外存;對于字節尋址的非易失存儲設備,主要適用于內存,習慣上被稱之為持久性內存(persistent memory,PM),與之類似的名詞還有存儲級內存(storage class memory,SCM)等,目前學術界對字節尋址的非易失內存設備統一稱為持久內存。
字節尋址的非易失內存設備主要包括磁性存儲器(Magnetic RAM,MRAM)、自選扭矩轉換隨機存儲器(Spin-Torque Transfer RAM,STT-RAM)、阻變存儲器(Resistive RAM,RRAM)、相變存儲器(Phase-Changed RAM,PCRAM or PCM)等。塊尋址和字節尋址的非易失存儲設備之間有廣泛的共同點,例如較低的訪問時延以及非易失性,它們之間的區別也相對明顯,這些差異直接影響存儲器的基本指標,例如訪問延時、存儲密度、設備耐久以及每個存儲單元中存儲的位數等等[2]。表1展示了DRAM與部分非易失存儲器的特性對比。

表1 DRAM與部分非易失存儲器的部分特性[3]
閃存與持久內存處在不同的發展階段,關于持久內存的研究大部分在實驗室中進行,而閃存的一些研究成果已經被商業化,廣泛應用于固態硬盤(solid state disk,SSD)中,取得了優秀的成果[4]。對于持久內存的應用方面,非易失雙列直插存儲模塊(non-volatile dual inline memory module,NVDIMM)是目前唯一商用的持久性內存存儲器件[5],NVDIMM采用閃存和DRAM混合的方式,使用電容供電或者后備電源供電的方式保證DRAM數據掉電不丟。2015年,英特爾和鎂光公司聯合發布了3D-XPoint技術[6],并于2019年發布了基于DIMM接口的傲騰內存[7](Optane DC Persistent Memory)。隨著非易失存儲器技術的進一步發展與應用,基于該技術構建持久性主存存儲系統是滿足應用日益增長的性能需求的有效方法。
雖然NVM的出現有效彌合了內存與外部存儲之間的差距,模糊了內外存之間的界限,但是因其自身的局限性,例如有限的設備壽命、昂貴的成本以及不對稱的讀寫延遲等,限制了NVM的規模化應用[8]。因此,為了滿足研究人員對NVM的需求,一個折中的辦法是在現有的存儲介質上進行一定程度的修改來模擬NVM。一些工作通過調整內存的訪問時延、帶寬等方式來模擬非易失內存,Duan等提出的HME[9]基于NUMA架構實現了對混合內存結構(DRAM+NVM)的讀寫帶寬以及延遲的模擬,主要通過判斷cache是否命中來區分不同的寫操作類型。這些工作往往需要特定的硬件支持,或者僅對于特定的內存結構有效,在一定程度上缺乏可擴展性和可移植性。
因此為了使研究人員盡量減少對現有硬件的修改與調整,從而快速開展針對NVM的研究工作,一些工作在相對通用內存結構上進行非易失內存模擬。Hu等提出的NVM Streaker[10]不需要復雜的硬件以及對操作系統的支持,通過硬件參數配置層以及軟件干擾機制實現非易失內存模擬,其優勢在于通過硬件參數的配置可以實現多種NVM的靈活模擬。這些工作的局限性也較為明顯,多使用x86指令架構的英特爾處理器,在隸屬ARM指令架構的FT2000+/64等國產處理器上沒有相應的支持,擴展性和可移植性不佳。
目前關于NVM的模擬工作,主要針對NVM讀寫時延[11]、磨損情況[12]等性能指標的模擬,對于實驗室中的研究工作具有重要的意義,但是在實際的工程應用中,非易失內存模擬技術并未關注非易失存儲設備最基本的“非易失”功能,即關機時保存數據以及開機時恢復數據,因此無法滿足實際工程應用中對非易失存儲設備的需求。
本方法主要是在DRAM等易失性內存上模擬非易失存儲功能,因此需要操作系統將DRAM當作非易失內存看待。總的來說,本方法較傳統方法相比,進一步實現的核心功能為關機時數據保存以及開機后數據恢復功能。在數據保存時,應用層程序需要讀取內存條中的數據并寫入備用存儲介質中,備用存儲介質的功能類似于NVDIMM-N內存條中Flash閃存的作用,即起到持久化數據存儲的作用;在數據恢復時,應用層程序讀取備用存儲介質中的數據,將其寫入DRAM中,起到存儲狀態恢復的作用。在具體實現中,本文實現的非易失存儲功能模擬使用DRAM+NVMe固態硬盤的架構,通過NVDIMM總線將DRAM注冊為非易失存儲設備,使用NVMe固態硬盤作為持久化數據存儲設備。
目前的國產操作系統并未實現對非易失內存的支持,因此需要在國產操作系統上對非易失內存進行驅動適配開發以及設計實現應用層的訪問接口,同時對操作系統內核進行相應的修改。
本方法的應用層設計思路如圖1所示。

圖1 應用層設計
非易失存儲設備的非易失性具體表現在系統掉電之后數據不丟,該功能可以拆解為關機時數據保存到備用的存儲介質中以及開機時從備用存儲介質中讀取數據并寫回到DRAM中。因此應用層的設計分為兩個部分:一是開機恢復數據,二是關機保存數據,而這兩個部分的主要功能十分類似,區別僅在與開機恢復數據是從讀取備用存儲設備向內存中寫入數據,而關機保存數據是從內存讀取數據向備用存儲設備寫入數據,因此設計思路十分相似。
在關機保存數據和開機恢復數據的應用層設計中,本方法將內存劃分為固定大小的數據區,對每個固定大小的數據區,使用多個進程來對其進行更細粒度的訪問與寫入,在每個數據區中,每個進程負責的更細粒度的數據塊的相對位置是固定的。舉例來說,進程1負責每個數據區中相對地址為0-2 GB空間內共2 GB大小數據塊的讀取與寫入,進程2負責每個數據區中相對地址為2 GB~4 GB空間內共2 GB大小數據塊的讀取與寫入,以此類推。
總之,在應用層的設計中,需要內核層提供數據區以及數據塊的虛擬地址,以及數據塊的總數,因此在驅動層的設計中,需要將這兩部分數據通過ioctl接口提供給應用層。
本節中提到的非易失內存在物理層面上是DRAM內存條,只是在操作系統層面將其視為非易失內存,具體表現為將DRAM內存條通過NVDIMM總線注冊為非易失內存。本方法的驅動層設計的整體架構如圖2所示。

圖2 驅動層設計整體架構
本節接下來的內容將詳細論述每個驅動部分的具體功能與設計思路。
2.2.1 非易失內存接口參數驅動
非易失內存內核參數接口驅動提供一種基于操作系統內核參數的非易失內存設備注冊方法,利用系統啟動時內核參數傳遞非易失內存的地址空間信息,然后由操作系統內核向NVDIMM總線完成非易失內存的注冊。
基于內核參數接口的非易失內存注冊處理具體的實現思路是在內核處理參數函數中新增加對于非易失內存的支持,按照類似操作易失內存的注冊流程使用非易失內存。具體設計是將非易失內存的物理地址空間和對應的地址空間大小追加到內核的引導參數之后,可以在內核啟動參數中多次添加非易失內存配置項從而實現多個非易失內存的注冊。在固件加載操作系統內核并引導操作系統后,操作系統在啟動內核參數處理函數中檢測到非易失內存配置參數,隨后從內核的普通內存訪問空間中移除相應大小的地址空間。將移除的地址空間插入到內核的IOMEM資源列表中,并將該資源置為PMEM,檢測并添加非易失內存設備。當所有的非易失內存設備添加完成后,遍歷IOMEM資源列表,查找是否具有標記為PMEM的資源,向操作系統注冊一個設備名稱為PMEM的平臺設備。最后,操作系統非易失內存的平臺設備驅動初始化,依次遍歷IOMEM資源,通過NVDIMM總線的設備注冊接口將PMEM資源所表示的地址注冊為非易失內存設備。
該驅動實現了一種簡單的非易失內存注冊方法,方便非易失內存的配置,而且也可用于在服務器沒有非易失內存條的情況下使用普通內存模擬非易失內存,驗證操作系統的非易失內存相關的驅動功能。
2.2.2 非易失內存地址空間合并
非易失內存地址空間合并的主要功能是實現將內核的IOMEM資源列表中所有標志為PMEM的內存資源空間合并成一個地址空間。合并之后的一個地址空間對應著一個namespace節點。通過namespace節點可以訪問所有的、離散的非易失內存地址空間。這樣做可以兼容現有的工具以及用戶層程序的接口。從用戶層視角來看,非易失內存是一整塊完整的內存空間,而不必關心是否是離散的內存地址空間。而對于內核層的實現,需要在Linux內核層的非易失內存驅動中將離散的非易失內存對應的物理地址空間逐次注冊進驅動中,最后建立物理地址空間與虛擬地址空間之間的映射關系。圖3是非易失內存地址空間合并。

圖3 非易失內存地址合并
在非易失內存的驅動注冊非易失內存物理地址空間時,本方法只注冊一塊物理地址空間,其它物理地址空間不注冊,但是統計所有的物理地址空間的大小,即將所有的物理地址空間進行累加,將累加后的物理地址空間總大小作為申請空間的接口函數參數并申請一塊虛擬地址連續的虛擬地址空間。然后根據物理地址空間的首地址的升序原則,依次將每個物理地址空間與申請的虛擬地址空間對應的偏移位置進行映射。memmap預留地址空間,即通過grub參數,將普通內存條上的部分物理地址空間預留出來作為模擬NVDIMM內存使用。預留出來多塊物理地址空間,將物理地址映射到申請的連續虛擬地址空間中。從用戶層來看,實際的非易失內存分布情況對其透明,便于文件系統等其它系統軟件的開發。
非易失內存的釋放與注冊一一對應,如果每次僅僅申請新的虛擬地址空間,而不進行釋放,系統運行一段時間后,會將空閑的虛擬地址空間耗盡,導致系統異常。所以在申請并且注冊了非易失內存后,在退出的時候需要將注冊的虛擬地址空間釋放。而釋放的時候需要根據之前注冊的地址塊和空間大小進行釋放。
2.2.3 非易失內存設備驅動設計
本方法實現的非易失內存模擬實現了3種驅動方式:分別是字節訪問設備驅動、標準塊設備驅動以及直接訪問塊設備。下面分別介紹其實現細節:
字節訪問設備驅動將非易失內存注冊為字符設備,字符設備提供open和mmap操作接口,應用程序打開字符設備后,可以通過mmap直接將非易失內存映射到程序地址空間,按照類似memcpy/memset的方式使用非易失內存。處理器直接使用LOAD和STORE指令讀寫非易失內存對應的物理地址空間,跳過Linux內核的頁緩存和通用塊設備層,無需特殊的驅動作為訪問中轉,完全由應用程序自己維護非易失內存空間的數據組織管理,因此字符模式設備驅動對應用程序是非透明的,需要應用程序針對非易失內存進行修改,能夠感知到非易失內存設備的存在。圖4是字符設備驅動。

圖4 字符設備驅動設計
非易失內存標準塊設備驅動在內核中引入塊設備封裝層(block translate table,BTT),保證對非易失內存每次更新一個塊設備扇區都是原子的,即對一個塊內容的更新要么全部成功要么全部失敗,從而可以保證在系統突然掉電時對非易失內存塊數據更新的原子特性。BTT的實現方法是建立一個邏輯的LBA和真實的LBA之間的映射表,每次更新的時候,先完成物理LBA的更新,然后再刷新BTT轉換表中塊邏輯LBA和塊真實LBA的對應關系,通過BTT封裝層可以保證操作系統每次更新非易失內存設備塊時都是完整的。標準塊設備驅動對應用程序提供標準的塊設備,支持現有的塊訪問模式,對應用程序來說是透明的,應用程序可以使用操作系統內核里實現的軟RAID、鏡像、加密、壓縮等中間層驅動所帶來的功能。
非易失內存直接訪問塊設備類似標準塊設備,支持現有的塊訪問模式,但是支持文件系統繞過內核的頁緩存直接訪問。操作系統的頁緩存主要是針對傳統的低速存儲介質的內核讀寫緩存機制,主要目的是提升存儲介質的讀寫性能,然而對于高速低延遲的非易失內存,其讀寫帶寬和延遲均接近普通內存,此時再使用內核的頁緩存機制并不能提升讀寫帶寬,反而會增加讀寫的延遲,而且由于使用普通內存作為數據緩存,增加非易失內存在異常掉電時數據不一致的風險。
2.2.4 數據保存恢復驅動
在本方法中,將每個DRAM內存條看作字符設備,提供open、read以及write等操作接口,應用程序打開字符設備后,按照正常使用字符設備的方式讀取或者寫入非易失內存。向內核注冊并創建內存條對應數目的字符設備,隨后記錄IOMEM中的內存條物理地址信息,包括起始物理地址、大小以及內存條編號等等信息,之后根據記錄的內存條信息以及內核給出的DRAM信息,給每個內存條分配一個相應大小的虛擬地址空間,并在頁表中建立內存條物理地址空間與虛擬地址空間之間的映射,最后根據記錄的內存信息,將內存條上的數據劃分為固定大小的數據區,并記錄每個數據區的起始虛擬地址,通過ioctl將這些數據區起始虛擬地址提供給應用層。圖5展示了數據保存恢復驅動與應用程序之間的交互。

圖5 數據保存恢復驅動與應用層的交互
本文基于國產處理器平臺飛騰2000+/64位設計以下實驗,對比了使用非易失模擬功能的易失性內存機器與使用真實的NVDIMM-N非易失內存機器之間的數據存儲、數據恢復功能的執行時間和讀寫性能,得到了這兩種情況下的數據存儲、數據恢復時間等性能結果,并且分析了得到本文實驗結果的原因。
實驗中采用了兩臺NUMA架構服務器,一臺支持NVDIMM-N非易失內存條的使用,并對固件、基板管理控制器(baseboard manage controller,BMC)等進行了調整與修改,另一臺使用普通的DRAM內存條,并使用NVMe固態硬盤作為備用存儲介質實現持久性數據存儲,詳細配置分別見表2和表3。
本章接下來的部分將詳細說明關機階段數據存儲以及開機階段數據恢復等功能執行時間的實驗設計以及數據存儲恢復時讀寫性能的實驗設計,并且分別對實驗結果進行分析。

表2 支持NVDIMM-N的主機配置

表3 使用本文模擬方法的主機配置
本文分別測量了使用非易失功能模擬以及使用真實的NVDIMM-N內存條時,數據保存以及恢復所消耗的時間。對于非易失功能模擬的執行時間,可以通過統計進程開始以及執行結束的時間相減得到,對于使用真實的NVDIMM-N的執行時間,可以通過連接串口統計關機數據保存以及開機數據恢復功能的開始和結束時間。實驗過程中,進行多次實驗對每種功能的執行時間取平均值,實驗結果見表4。

表4 執行時間對比/s
根據實驗結果,使用非易失內存模擬執行數據保存以及數據恢復的執行時間要小于使用NVDIMM-N內存的執行時間,通過分析,主要原因如下:第一,在非易失功能模擬方法中,使用了多進程的設計思想,充分發揮了CPU的性能,加快了數據保存以及數據恢復的處理速度;第二,在實驗中發現,使用NVDIMM-N執行數據保存和數據恢復時,有很大可能出現執行超時重新執行的現象,表現在實際使用中,會出現長達7 min到9 min不等的長時延。出現這種情況的原因是復雜多樣的,其中比較重要的一點是前文曾經提到的,使用非易失內存時需要對服務器的硬件設計以及固件等進行修改,而這些修改并不能完全保證非易失內存使用的穩定性,因此限制了非易失內存在實際的工程應用中效率的發揮。而使用純軟件的非易失功能模擬,在內核層、驅動層以及用戶層進行開發與修改,會繞過對硬件的修改,簡化實現模擬非易失存儲功能的難度。
上文的評價指標是數據保存以及數據恢復的執行時間,在一定程度上可以說明相比于使用NVDIMM-N內存實現非易失功能,本文提出的使用DRAM+NVMe進行非易失功能模擬方法在性能上有一定的優勢,但是針對時間指標的驗證粒度比較粗,因此,為了進一步驗證上述兩種實現非易失功能的性能差異,進行對于讀寫性能的測試與驗證,讀寫性能越高,也就表示在實現非易失功能時的效率越高。
本次實驗中,針對不同的讀寫方式,測試設備的每秒讀寫次數(Input/Output Per Second,IOPS)以及傳輸帶寬來表示設備的讀寫性能。本次實驗使用開源測試工具fio測試塊大小為4 kB,進程數為8時,上述兩種方法的IOPS以及傳輸帶寬。實驗針對順序讀、順序寫、隨機讀、隨機寫、順序讀寫隨機讀寫等6種IO方式進行了測試,得出以下實驗結果。圖6和圖7分別測試了模擬方法與實際的NVDIMM-N內存設備在順序讀、順序寫、隨機讀、隨機寫、順序讀寫以及隨機讀寫任務中的IOPS指標;圖8~圖10分別測試了模擬方法與實際的NVDIMM-N內存設備在順序讀、順序寫、隨機讀、隨機寫、順序讀寫以及隨機讀寫任務中的帶寬指標。

圖6 模擬方法與NVDIMM-N設備IOPS對比(1)

圖7 模擬方法與NVDIMM-N設備的IOPS對比(2)

圖8 模擬方法與NVDIMM-N設備讀帶寬對比

圖9 模擬方法與NVDIMM-N設備寫帶寬對比

圖10 模擬方法與NVDIMM-N設備讀寫帶寬對比
根據上述實驗結果,可以發現在順序讀和隨機讀方面,使用NVDIMM-N的性能要優于使用DRAM+NVMe的非易失功能模擬方法,在順序寫、隨機寫、順序讀寫以及隨機讀寫方面,使用DRAM+NVMe的非易失功能模擬方法的讀寫性能整體上優于使用NVDIMM-N的讀寫性能,根據分析思考,主要原因是在使用非易失功能模擬時,本質上是通過NVDIMM總線將DRAM設備注冊為非易失內存設備來使用DRAM的,而DRAM本身的讀寫性能整體上優于NVDIMM-N等非易失內存設備。
本文使用DRAM作為內存,NVMe固態硬盤作為備用存儲介質,通過對應用層、驅動層以及內核層的軟件層面上的修改,實現了一種非易失功能模擬方法,該方法繞過了對通用設備硬件的修改,在軟件層面實現了非易失功能。本文進一步將使用非易失模擬功能的設備與真正的非易失內存條NVDIMM-N設備進行實驗對比,驗證了本文提出的方法在數據保存以及數據恢復功能上的執行時間較短,讀寫性能整體上較優,在對非易失內存有使用需要的工程實踐中具有應用推廣價值。
本文將非易失內存視為外部存儲設備使用,通過DRAM與NVMe之間的配合,可以替代NVDIMM-N設備而作為一個持久化數據存儲層,在一定程度上對非易失功能進行了模擬。
但是NVDIMM-N等非易失內存作為內存使用的方向潛力巨大,有很大的可能改變現有的內外存分層存儲架構,因此未來的工作可能要更加關注將非易失內存作為運行內存使用,例如保存系統狀態等方面的工作。