陳游旻 朱博弘 韓銀俊 屠要峰 舒繼武
1(清華大學(xué)計算機科學(xué)與技術(shù)系 北京 100084)2(中興通訊股份有限公司 南京 210012)
新型的非易失內(nèi)存(non-volatile memory, NVM),例如相變存儲器(phase change memory, PCM)[1-3]、阻變存儲器(resistive random-access memory, ReRAM)[4]、3D-Xpoint等,能夠提供與DRAM相近的訪問性能,同時還能像磁盤一樣持久性地存儲數(shù)據(jù).其中,通過內(nèi)存接口與CPU相連,從而具有字節(jié)可尋址能力的非易失內(nèi)存被稱作持久性內(nèi)存(persistent memory, PM).2019年4月,英特爾公司正式發(fā)布了基于3D-Xpoint技術(shù)的傲騰持久性內(nèi)存(Optane DC persistent memory)[5],這是迄今為止全球首款大規(guī)模商用的持久性內(nèi)存器件,其單條最高容量可達512 GB,訪問帶寬及延遲相比于固態(tài)硬盤具有一到多個數(shù)量級的提升.
持久性內(nèi)存為構(gòu)建高效的存儲系統(tǒng)提供了性能保障.然而,現(xiàn)有的持久性內(nèi)存存儲系統(tǒng)軟件或直接從傳統(tǒng)軟件改進而來[6-7],或依舊借鑒了面向傳統(tǒng)磁盤或固態(tài)硬盤的設(shè)計思想[8-10],從而導(dǎo)致持久性內(nèi)存的硬件特性沒能被很好地利用,其硬件性能很難得到充分發(fā)揮.例如,傳統(tǒng)硬盤和固態(tài)硬盤的最小訪問粒度分別為扇區(qū)(512 B)和頁(4 KB),因此,傳統(tǒng)文件系統(tǒng)通常以4 KB的數(shù)據(jù)頁為最小粒度管理文件數(shù)據(jù).然而,現(xiàn)有的持久性內(nèi)存文件系統(tǒng)依舊沿用了該設(shè)計,以4 KB為最小粒度管理文件數(shù)據(jù)讀寫,并通過寫時復(fù)制機制(copy-on-write, CoW)保證數(shù)據(jù)寫入的原子性[9-10],使持久性內(nèi)存的字節(jié)尋址特性未能得到充分發(fā)揮.通過應(yīng)用負載分析,發(fā)現(xiàn)大量應(yīng)用有一定比例的寫操作具有“不對齊”、“小寫”等特性,頁粒度的寫時復(fù)制機制將引入嚴重的數(shù)據(jù)寫放大效果,從而影響文件系統(tǒng)的整體性能.
本文提出了一種數(shù)據(jù)頁混合管理機制(hybrid data page management, HDPM),通過選擇性使用寫時復(fù)制機制和日志結(jié)構(gòu)(log-structure)管理文件數(shù)據(jù),從而避免非對齊寫或者小寫造成的寫放大問題.具體地,HDPM通過同時維護一個固定粒度的持久性內(nèi)存塊和一個日志結(jié)構(gòu)管理各文件數(shù)據(jù)頁:其將對齊的寫操作數(shù)據(jù)直接存入固定粒度的持久性內(nèi)存塊中,而將非對齊的寫操作數(shù)據(jù)以日志項的形式追加到日志結(jié)構(gòu)末尾,從而避免了傳統(tǒng)寫時復(fù)制機制引入的額外拷貝操作,消除了寫放大問題.為避免影響讀性能,HDPM引入逆向掃描機制,從日志結(jié)構(gòu)末尾逆向掃描,從而保證在數(shù)據(jù)頁重構(gòu)過程中不引入額外的數(shù)據(jù)拷貝.為避免日志結(jié)構(gòu)無限增長,HDPM提出一種多重垃圾回收機制,在單個日志結(jié)構(gòu)過大時,通過讀操作在重構(gòu)數(shù)據(jù)頁時主動回收日志結(jié)構(gòu),當持久性內(nèi)存空間受限時,則通過后臺線程使用免鎖機制異步釋放日志空間,從而消除垃圾回收對系統(tǒng)整體性能的影響.
本文的主要貢獻有3個方面:
1) 提出了一種數(shù)據(jù)頁混合管理機制HDPM,通過選擇性地將對齊和不對齊的數(shù)據(jù)存放到持久性內(nèi)存塊和日志結(jié)構(gòu),避免了額外的數(shù)據(jù)拷貝開銷.
2) 提出逆向掃描機制降低文件讀取時的拷貝開銷;提出多重垃圾回收機制,高效回收日志空間.
3) 通過微觀和宏觀的實驗分析,HDPM相比于傳統(tǒng)途徑能顯著提升寫入性能.其中,小粒度寫入操作負載下,HDPM的寫入延遲比NOVA低58%;Filebench多線程測試顯示,HDPM相比于NOVA提升吞吐率33%.
本節(jié)主要介紹持久性內(nèi)存的基本硬件特性、文件系統(tǒng)中常見的原子性更新機制的基本工作原理,以及典型的應(yīng)用負載分析.
持久性內(nèi)存通過內(nèi)存總線直接與CPU相連,CPU可通過內(nèi)存指令直接讀寫持久性內(nèi)存.持久性內(nèi)存的出現(xiàn)徹底顛覆了傳統(tǒng)的存儲體系結(jié)構(gòu),從“內(nèi)存+外存”的2級結(jié)構(gòu)變成了內(nèi)存級存儲的單層結(jié)構(gòu)[11].持久性內(nèi)存還帶來了2個層面的變化:1)讀寫不對稱性,持久性內(nèi)存的寫性能往往不及讀性能,例如,傲騰持久性內(nèi)存的讀帶寬最高可達39.4 GBs,而寫帶寬最高只有13.9 GBs[12];2)持久性-易失性邊界發(fā)生變化,傳統(tǒng)情況下需要通過軟件方式將數(shù)據(jù)從易失性內(nèi)存(dynamic random-access memory, DRAM)搬運到持久性的磁盤或固態(tài)硬盤,而在持久性內(nèi)存架構(gòu)下,該邊界位于CPU緩存和持久性內(nèi)存之間,且數(shù)據(jù)到達持久性內(nèi)存的過程完全由硬件控制.CPU會通過打亂內(nèi)存讀寫操作來提升訪存性能,因此,數(shù)據(jù)到達持久性內(nèi)存的順序往往并不能按照程序?qū)懭氲拇涡蜻M行,彼此有依賴關(guān)系的數(shù)據(jù)寫入會因為亂序執(zhí)行導(dǎo)致掉電故障時出現(xiàn)不一致的情況.為此,需要額外執(zhí)行強制緩存刷新指令(如clflushopt,clwb等)將數(shù)據(jù)主動逐出緩存.然而,這些緩存刷寫指令開銷大,對系統(tǒng)性能影響十分嚴重.
為保證文件數(shù)據(jù)在發(fā)生系統(tǒng)崩潰或斷電故障時要么寫入完成,要么未執(zhí)行,文件系統(tǒng)需要額外的機制來保證其原子執(zhí)行.常見的原子性更新機制包括日志(journal)、寫時復(fù)制、日志結(jié)構(gòu)(log-structure)等.
其中,日志方式將存儲空間分成數(shù)據(jù)區(qū)和日志區(qū),在更新數(shù)據(jù)前,先將舊版本或新版本數(shù)據(jù)寫入日志,待持久化完畢后再原地更新數(shù)據(jù).若在此過程中發(fā)生故障,可根據(jù)日志狀態(tài)重做或撤回寫入操作,實現(xiàn)數(shù)據(jù)更新的原子性.日志機制的缺陷是所有的數(shù)據(jù)均需寫2次,對寫性能影響嚴重.圖1展示了寫時復(fù)制機制的過程,該方案需將原數(shù)據(jù)頁中未修改的數(shù)據(jù)先拷貝到新的數(shù)據(jù)頁中,然后再將新寫入的數(shù)據(jù)寫到新數(shù)據(jù)頁中.該方案在對齊寫場景下性能優(yōu)異,避免了所有的拷貝開銷;然而,針對非對齊寫,其額外拷貝開銷甚至可能比日志方式還高.日志結(jié)構(gòu)與日志機制完全不同:日志結(jié)構(gòu)將整個存儲空間組建成一個日志,而不是像日志機制一樣將存儲空間劃分為數(shù)據(jù)區(qū)和日志區(qū);進而,所有的更新數(shù)據(jù)都被追加到日志末尾,并借助相應(yīng)的索引結(jié)構(gòu)引導(dǎo)數(shù)據(jù)讀取.為防止日志任意增長,還需要垃圾回收機制消除日志中的舊版本數(shù)據(jù).在基于磁盤的日志結(jié)構(gòu)文件系統(tǒng)中,每次追加日志項時仍需要按頁對齊,額外拷貝無法完全消除;然而,在字節(jié)可尋址的持久性內(nèi)存中無需再按頁對齊日志項,日志結(jié)構(gòu)可以緊湊地排布在持久性內(nèi)存中,因而避免任何額外拷貝.
Fig. 1 Copy-on-write mechanism圖1 寫時復(fù)制機制
為理解寫時復(fù)制機制在真實應(yīng)用中造成的影響,我們進一步分析了多個真實負載的數(shù)據(jù)寫入特性.如圖2所示,其橫坐標代表對一個4 KB數(shù)據(jù)頁實際更新的數(shù)據(jù)量大小,縱坐標代表其累計分布(CDF).觀察可見,Iphoto,Usr1,Usr2等負載具有超過30%的寫操作為非對齊寫,而Facebook和Twitter也具有10%左右的非對齊寫操作,僅TPCC表現(xiàn)出良好的對齊寫特性.通過一定的真實負載分析,我們發(fā)現(xiàn)真實負載均不同程度地存在非對齊寫操作,現(xiàn)有的寫時復(fù)制機制將引入額外的拷貝開銷.
Fig. 2 CDF of in-page update size圖2 頁內(nèi)更新數(shù)據(jù)大小累積分布圖
本節(jié)首先描述HDPM的系統(tǒng)整體架構(gòu),然后逐一介紹HDPM的設(shè)計細節(jié),具體包括混合數(shù)據(jù)頁管理機制,基于逆向掃描的文件讀取流程,以及高效的多重垃圾回收機制.
圖3上半部分展示了HDPM的系統(tǒng)總體架構(gòu):應(yīng)用程序通過POSIX標準讀寫接口訪問文件系統(tǒng),其中,混合數(shù)據(jù)頁管理模塊(2.2節(jié))用于處理文件寫入流程,逆向掃描讀取模塊(2.3節(jié))用于處理文件讀取流程.持久性內(nèi)存空間被切分成固定大小的持久性內(nèi)存塊,用于存放數(shù)據(jù)頁和元數(shù)據(jù).為方便實現(xiàn),文件的inode采用了塊映射機制,即為每個數(shù)據(jù)頁存放一個映射條目(如圖3下部分).與傳統(tǒng)的塊映射機制不同的是,每個映射條目包含2個指針,分別指向一個寫時復(fù)制頁和一個日志結(jié)構(gòu),用于支持混合的數(shù)據(jù)頁管理.當然,HDPM不局限于使用塊映射機制進行數(shù)據(jù)塊索引,廣泛使用的范圍索引(extent)方式同樣適用于HDPM,本文將不再贅述.上述日志結(jié)構(gòu)由一個或多個持久性內(nèi)存塊串接而成,當日志結(jié)構(gòu)空間不足時,將分配一個新的內(nèi)存塊串接到日志尾部,用于存放新的數(shù)據(jù).當日志結(jié)構(gòu)的長度超過閾值,或剩余空間不足時,將觸發(fā)多重垃圾回收機制(2.4節(jié)),選擇性地在前臺或后臺清除日志結(jié)構(gòu)引入的舊版本數(shù)據(jù).
Fig. 3 Overall architecture of HDPM圖3 HDPM總體架構(gòu)
混合數(shù)據(jù)頁管理旨在選擇性利用寫時復(fù)制頁和日志結(jié)構(gòu)存儲寫入數(shù)據(jù),從而避免額外的冗余拷貝開銷.
當寫入的數(shù)據(jù)恰好整頁對齊,HDPM直接通過寫時復(fù)制機制存儲數(shù)據(jù):首先從空閑空間中分配1個新的數(shù)據(jù)頁,將數(shù)據(jù)寫入新數(shù)據(jù)頁,并通過硬件指令將所寫數(shù)據(jù)從CPU緩存逐出,從而實現(xiàn)數(shù)據(jù)的持久化存儲;然后將映射表對應(yīng)映射條目的第1個指針指向新的數(shù)據(jù)頁,使得新寫入數(shù)據(jù)可以被其他讀者讀取到;最后將舊數(shù)據(jù)頁釋放回收.可以注意到,該過程未發(fā)生任何額外的拷貝開銷,且數(shù)據(jù)可原子地從舊版本切換到新版本(原子地修改指針),崩潰一致性得到保障.
當寫入數(shù)據(jù)不能整頁對齊,HDPM則將數(shù)據(jù)追加到日志結(jié)構(gòu)中.圖4描述了日志結(jié)構(gòu)的布局,它是由若干個持久性內(nèi)存塊串接而成.每個日志結(jié)構(gòu)的起始位置預(yù)留了一個日志頭指針,用于指向最后一個有效日志項.特別地,日志項使用了倒序排布方式,即元數(shù)據(jù)放置在數(shù)據(jù)之后,用于支持逆向掃描文件讀取(2.3節(jié)).每個日志項的元數(shù)據(jù)包含2個字段,分別為日志項包含的數(shù)據(jù)在文件數(shù)據(jù)塊中對應(yīng)的偏移和大小.向日志結(jié)構(gòu)追加數(shù)據(jù)時,首先在日志末尾初始化一個日志項,將數(shù)據(jù)、元數(shù)據(jù)拷貝到該日志項,然后更新日志頭指針指向最新的位置.當日志空間不夠時,則重新申請一個新的內(nèi)存塊,并鏈接到日志尾部.通過引入該日志結(jié)構(gòu),在發(fā)生非對齊寫操作時依舊無需執(zhí)行額外的拷貝操作,且更新原子性得到保證.值得注意的是,當一個數(shù)據(jù)頁發(fā)生過一次或多次非對齊寫之后,如果緊接著執(zhí)行一次整頁對齊的寫操作,則整個日志空間將變?yōu)榕f數(shù)據(jù),因此日志空間可以被釋放回收.
Fig. 4 Layout of log-structure圖4 日志結(jié)構(gòu)布局圖
HDPM引入的日志結(jié)構(gòu)與傳統(tǒng)日志式文件系統(tǒng)(log-structured file system, LFS)[13]完全不同:LFS將整個磁盤組織成一個全局大日志,所有文件數(shù)據(jù)均追加到日志末尾,相反,HDPM將每個數(shù)據(jù)頁組織成一個小日志.在未對某數(shù)據(jù)頁發(fā)生非對齊寫時,其對應(yīng)的日志結(jié)構(gòu)為空,因此,HDPM不引入額外的空間浪費.該設(shè)計具有3方面的優(yōu)勢:
1) 多核并發(fā).傳統(tǒng)的全局大日志在慢速磁盤場景下可以工作得很好,這是因為磁盤內(nèi)部的旋轉(zhuǎn)式機械部件天然地支持順序訪問,這與順序地將數(shù)據(jù)追加到日志尾部的訪問模式完全吻合.然而,持久性內(nèi)存可以支持更高的并發(fā),且隨機和順序訪問性能差異不明顯,如果依舊使用全局大日志抽象持久性內(nèi)存空間,多個線程將從同一個日志頭部競爭存儲空間,嚴重影響擴展性.相反,HDPM為每個數(shù)據(jù)頁配備一個日志結(jié)構(gòu),多個線程之間的競爭概率將大幅降低,能夠更好地利用持久性內(nèi)存高帶寬特性.
2) 文件讀取性能影響小.傳統(tǒng)日志式文件系統(tǒng)或需要在內(nèi)存中構(gòu)建復(fù)雜的索引結(jié)構(gòu),用于輔助查找日志中的目標數(shù)據(jù),或需要多次日志跳躍查找,這極大地限制了文件讀取的性能.HDPM的混合數(shù)據(jù)頁管理機制無需額外的索引機制,且避免了大量的日志掃描,僅需從一個小日志中便可拼合出最新數(shù)據(jù).
3) 垃圾回收.傳統(tǒng)的日志式文件系統(tǒng)需要全局掃描磁盤檢測盤內(nèi)垃圾占比,并挑選垃圾比例最高的數(shù)據(jù)塊進行合并整理,以騰出空閑空間.此過程將引入大量的掃描操作,垃圾回收開銷較高,且影響前臺應(yīng)用的運行.相比之下,為每個數(shù)據(jù)頁配備一個日志結(jié)構(gòu)具有更好的數(shù)據(jù)局部性:執(zhí)行垃圾回收時只需挑選出最長的日志,將內(nèi)部有效數(shù)據(jù)合并,并寫到寫時復(fù)制頁即可,無需額外的騰挪過程,垃圾回收的過程將更加簡潔高效(2.4節(jié)).
HDPM的另一個設(shè)計原則是在引入日志結(jié)構(gòu)后不影響正常的文件讀取性能.根據(jù)2.2節(jié)所述,數(shù)據(jù)頁在寫時復(fù)制頁和日志結(jié)構(gòu)中的新舊程度具有如下關(guān)系:日志結(jié)構(gòu)尾部的數(shù)據(jù)比日志結(jié)構(gòu)頭部的數(shù)據(jù)要新,且日志結(jié)構(gòu)頭部的數(shù)據(jù)比寫時復(fù)制頁中的數(shù)據(jù)要新.因此,一種直觀的數(shù)據(jù)讀取方案為:首先將寫時復(fù)制頁中的數(shù)據(jù)拷貝到用戶緩沖區(qū),然后在日志中從頭至尾掃描,將相關(guān)的日志項拷貝到緩沖區(qū),直至日志末尾.然而,當該數(shù)據(jù)頁發(fā)生大量的重復(fù)寫入時,日志結(jié)構(gòu)中將有多個日志項的數(shù)據(jù)彼此重疊,從而造成額外的拷貝開銷,降低文件讀取性能.
為解決該問題,HDPM引入一種逆向掃描的文件讀取方案.HDPM將日志結(jié)構(gòu)的內(nèi)存塊鏈接方式設(shè)計為雙向鏈表,并將日志項進行倒序排布,用于支持文件讀取時從日志尾部向頭部掃描,從而避免上述的額外拷貝開銷.具體而言,首先根據(jù)讀請求的大小及偏移確定是否包含當前日志項,如果包含,則將其拷貝到用戶緩沖區(qū),并記錄已讀取區(qū)間;否則,從日志結(jié)構(gòu)前移一個日志項并重復(fù)判斷.若當前日志項在讀取區(qū)間內(nèi),且之前已經(jīng)記錄該區(qū)間已經(jīng)被成功讀取,則直接忽略該日志項,這是因為日志尾部的數(shù)據(jù)是最新的版本,無需額外拷貝舊版本數(shù)據(jù).當記錄的已讀取區(qū)間完全覆蓋了讀請求的覆蓋區(qū)間,則停止掃描并返回數(shù)據(jù).若掃描完整個日志結(jié)構(gòu)依舊無法覆蓋整個讀區(qū)間,則進一步從寫時復(fù)制頁中讀取相應(yīng)數(shù)據(jù).
為避免各數(shù)據(jù)頁對應(yīng)的日志結(jié)構(gòu)增長過快,占用過多的持久性內(nèi)存空間,需要及時將日志結(jié)構(gòu)進行合并整理,消除文件舊版本數(shù)據(jù),并回收持久性內(nèi)存空間.然而,傳統(tǒng)的日志清理機制需要通過掃描存儲設(shè)備探測垃圾數(shù)據(jù),并通過鎖機制強制阻塞前臺服務(wù),從而實現(xiàn)安全的垃圾回收過程,該過程會嚴重影響系統(tǒng)性能.為此,HDPM提出一種多重垃圾回收機制,其包括在正常讀寫流程中的機會性垃圾回收和后臺免鎖模式的垃圾回收.
如2.2節(jié)所述,在正常寫操作過程中,當發(fā)生整頁對齊寫操作時,可直接將對應(yīng)日志空間進行回收,這將一定程度上緩解日志的空間占用.進一步,HDPM還在讀操作中引入機會性垃圾回收流程.在HDPM執(zhí)行正常的數(shù)據(jù)頁讀取時,首先檢查其對應(yīng)的日志結(jié)構(gòu)長度,若該日志結(jié)構(gòu)超過某閾值,則對該數(shù)據(jù)頁進行完整的逆向讀取,整理出最新版本的數(shù)據(jù)頁信息,并寫回到寫時復(fù)制頁,同時回收相應(yīng)的日志空間.此過程會一定程度影響當前讀操作的性能,然而,通過定期整理過長的日志結(jié)構(gòu),有助于提升后續(xù)的數(shù)據(jù)讀取性能.
上述前臺垃圾回收機制只能回收部分的持久性內(nèi)存空間,因此還需要專門的后臺垃圾回收機制.為避免傳統(tǒng)垃圾回收機制阻塞文件系統(tǒng)正常讀寫流程,HDPM引入一種基于Epoch技術(shù)[14]的免鎖垃圾回收方法.如2.2節(jié)所述,HDPM在更新文件時,可以通過修改指針將數(shù)據(jù)從舊版本原子地切換到新版本,因此,后臺垃圾回收機制同樣可以使用原子指令修改指針,用于日志結(jié)構(gòu)的合并整理及回收.然而,后臺的垃圾回收機制使用免鎖機制回收持久性內(nèi)存塊,而不阻塞文件系統(tǒng)讀寫流程,有可能前臺的讀線程正在讀取已經(jīng)被回收的持久性內(nèi)存區(qū)域.此過程中如果已被回收的內(nèi)存塊迅速被重新分配,并用于服務(wù)新的數(shù)據(jù)寫入,則讀線程可能讀到錯誤的數(shù)據(jù).Epoch技術(shù)正是用于避免上述問題,其具體實現(xiàn)流程如下.
HDPM引入一個全局的Epoch計數(shù)器,其初始值為0,同時為每個正在訪問文件系統(tǒng)的進程分配一個本地計數(shù)器.每當各進程發(fā)起系統(tǒng)調(diào)用開始訪問文件系統(tǒng)之前,首先將全局計數(shù)器與本地計數(shù)器的值進行比對,如果不相等,則將本地計數(shù)器設(shè)置為與全局計數(shù)器相等.后臺垃圾回收線程將所有的空閑持久性內(nèi)存塊通過2個空閑鏈表進行管理,分別對應(yīng)到當前的Epoch值和上一個Epoch值.后臺線程定期執(zhí)行垃圾回收:每次執(zhí)行垃圾回收時,首先將全局寄存器加1,然后將回收的空閑塊增加到當前活躍的空閑鏈表中.當所有進程的本地計數(shù)器都為最新值時,上一次活躍的空閑鏈表內(nèi)所包含的數(shù)據(jù)頁將不再有進程訪問,此時可以安全地被重新分配并使用.在實際回收過程中,后臺線程根據(jù)各日志結(jié)構(gòu)的長度確定回收的優(yōu)先級別,即優(yōu)先回收長度較大的日志結(jié)構(gòu).
通過上述Epoch機制,垃圾回收過程完全無鎖化,因而不會阻塞前臺系統(tǒng)執(zhí)行,其對系統(tǒng)性能影響極小.
HDPM引入了混合數(shù)據(jù)頁管理、基于逆向掃描的文件讀取機制以及多重垃圾回收機制.這些技術(shù)一定程度給文件系統(tǒng)帶來了額外的計算開銷,但是,這些開銷相比于其帶來的性能提升十分微小.例如,引入的混合數(shù)據(jù)頁管理只需要CPU通過寫入的尺寸和偏移進行一次額外的邏輯判斷(納秒量級);同時,維護一個日志結(jié)構(gòu)的開銷與維護傳統(tǒng)的CoW機制的開銷相當,而這種做法的效果卻是有效降低持久性內(nèi)存的數(shù)據(jù)寫入量(微妙量級).同樣,逆向讀取避免數(shù)據(jù)的額外拷貝(微妙量級),而反向掃描的開銷所占總體執(zhí)行時間(納秒量級)的比例很小.多重垃圾回收機制是HDPM相比于NOVA額外引入的開銷.然而,多重垃圾回收能夠同時在前臺和后臺進行.其中,大量的垃圾回收操作能夠直接被讀操作吸收,即在讀取文件數(shù)據(jù)頁的過程中自然地完成垃圾回收操作,而非常少的一部分垃圾數(shù)據(jù)留給了后臺進行回收.同時,HDPM僅在空閑(系統(tǒng)負載低)的情形下執(zhí)行后臺回收.綜上,多重垃圾回收技術(shù)基本不影響文件系統(tǒng)的前臺處理性能.
HDPM包含的技術(shù)可以廣泛地應(yīng)用到現(xiàn)有的持久性內(nèi)存文件系統(tǒng)中.作為示例,本文基于NOVA[10]實現(xiàn)了HDPM的各技術(shù)細節(jié).
NOVA將每一個inode組織為一個日志結(jié)構(gòu),因此,HDPM依然沿用NOVA的設(shè)計,僅將映射表的每個條目改為使用2個指針.NOVA在常規(guī)情況下并不會掃描inode的日志結(jié)構(gòu)進行元數(shù)據(jù)查詢,而是同時在DRAM中為每個文件構(gòu)建一棵Radix樹,用于映射表的索引查詢.因此,HDPM也同時在每個Radix樹的葉子節(jié)點額外增加一個指針,用于指向各數(shù)據(jù)頁的日志結(jié)構(gòu).
為保證文件系統(tǒng)崩潰一致性,HDPM需要嚴格按照順序持久化已經(jīng)更新的數(shù)據(jù).與NOVA相似,HDPM使用Non-temporal指令持久化數(shù)據(jù),使用clflushopt指令持久化指針.其中,Non-temporal指令可以繞過CPU緩存,實現(xiàn)數(shù)據(jù)的即時持久.在更新數(shù)據(jù)和更新指針之間,添加mfence指令,用于強制執(zhí)行持久化的順序性,保證數(shù)據(jù)的一致性更新.
本節(jié)將從微觀測試、宏觀測試、關(guān)鍵技術(shù)3個方面對比HDPM和現(xiàn)有系統(tǒng),并詳細分析其性能差異.
本實驗使用的實驗平臺配置信息如表1所示.特別地,本實驗使用了Intel最近推出的Optane DC持久性內(nèi)存作為非易失內(nèi)存存儲介質(zhì),其單條容量為256 GB,總?cè)萘窟_768 GB.為兼容持久性內(nèi)存設(shè)備,相應(yīng)的CPU、主板、BIOS均為專門配備.Optane可配置為2種工作模式,分別為APP-Direct模式和內(nèi)存模式.由于文件系統(tǒng)需直接管理持久性內(nèi)存空間,因此本實驗采用APP-Direct模式.HDPM基于NOVA進行改造,因此本實驗將重點與NOVA[10]進行性能對比.作為參考,HDPM同時也與Ext4,Ext4-DAX[6]等傳統(tǒng)的文件系統(tǒng)進行了對比.
Table 1 Platform Configuration表1 實驗平臺配置信息
Fig. 5 Latency of write syscall with varying IO sizes圖5 寫系統(tǒng)調(diào)用在不同IO尺寸下的延遲
Fig. 6 Latency of read syscall with varying IO sizes圖6 讀系統(tǒng)調(diào)用在不同IO尺寸下的延遲
為測試HDPM在真實負載下的性能表現(xiàn),本文選取了Filebench[15]中的2個代表性負載Webproxy和Varmail進行測試.本文采用了與文獻[10]中相同的配置參數(shù)進行測試:Webproxy負載的文件平均大小為64 KB,讀操作平均IO大小為1 MB,寫操作為16 KB,讀寫比例為5∶1,總文件數(shù)量為10萬個.Varmail負載的文件平均大小為32 KB,讀操作平均IO大小為1 MB,寫操作為16 KB,讀寫比例為1∶1,總文件數(shù)量為10萬個.可見,Webproxy為讀密集型負載,而Varmail則包含大量小尺寸同步寫操作.在測試過程中,通過逐漸增加客戶端線程數(shù)量來測試Filebench的總體吞吐.我們發(fā)現(xiàn),當線程增加到10之后,總性能不再上升,這一方面是因為Optane持久性內(nèi)存的寫入帶寬有限,在10個線程后其帶寬趨于飽和;另一方面,F(xiàn)ilebench原本針對磁盤設(shè)計,其內(nèi)部同于性能統(tǒng)計、數(shù)據(jù)測試的模塊本身設(shè)計擴展性不好.因此,本實驗未給出10個線程之后的實驗數(shù)據(jù).
從圖7中可見,Ext4-JBD的性能最差,而其他3個系統(tǒng)的總體吞吐十分接近,這主要是因為Webproxy為讀密集負載,系統(tǒng)間性能差異不明顯.
Fig. 7 Webproxy throughput with varying number of threads圖7 不同線程下Webproxy吞吐
同時,從圖8中可以發(fā)現(xiàn),在寫密集應(yīng)用下,NOVA的總體吞吐遠高于Ext4-DAX和Ext4-JBD,這主要是因為NOVA專門針對持久性內(nèi)存重新設(shè)計了軟件棧以及數(shù)據(jù)管理策略.而HDPM則表現(xiàn)出最好的性能,在10個線程下HDPM的總體吞吐比NOVA高33%.這主要是因為Varmail包含了較多非對齊寫入操作,HDPM有效降低了非對齊寫入操作引入的拷貝開銷.同時可以注意到,在線程數(shù)量增大時,HDPM相比于NOVA的性能優(yōu)勢更加明顯.這主要受Optane DC帶寬的影響.在線程數(shù)量較少情況下,Optane DC的帶寬不是瓶頸,HDPM與NOVA之間的性能差異完全取決于各操作延遲.由于Filebench本身具有較大的軟件開銷,文件系統(tǒng)層次的操作延遲占比不高,HDPM優(yōu)化技術(shù)帶來的延遲降低歸結(jié)到系統(tǒng)層面效果不明顯.但當線程數(shù)量上升之后,HDPM與NOVA之間的性能差異變大.HDPM通過混合的數(shù)據(jù)頁管理能夠更加高效地處理非對齊小寫,從而有效降低了數(shù)據(jù)總寫入量,節(jié)省了Optane DC的寫入帶寬,此時Optane DC的帶寬決定了總吞吐,因而HPDM擁有更加明顯的性能優(yōu)勢.
Fig. 8 Varmail throughput with varying number of threads圖8 不同線程下Varmail吞吐
Fig. 9 Read latency with varying number of overwrites圖9 不同重復(fù)寫次數(shù)下的讀取延遲
為理解在讀操作中引入的逆向掃描技術(shù)帶來的性能優(yōu)勢,我們關(guān)閉了這一技術(shù),并實現(xiàn)了HDPM wo opt版本,該方案將之前的逆向掃描改為順序掃描,該掃描過程在遇到多次重復(fù)寫時,會依次將目標數(shù)據(jù)拷貝到用戶緩沖區(qū),從而造成額外開銷.本實驗中,依次對文件中的某數(shù)據(jù)塊重復(fù)寫入N次,然后測試2個版本的系統(tǒng)的讀取性能,其評測結(jié)果如圖9所示.可發(fā)現(xiàn),在重復(fù)寫入次數(shù)變化時,HDPM的讀取延遲基本不發(fā)生變化,而HDPM wo opt的讀取延遲顯著上升.因此,在數(shù)據(jù)讀取中,有效降低額外的拷貝次數(shù)對提升系統(tǒng)整體讀取性能有極大的幫助.
持久性內(nèi)存直接通過內(nèi)存總線接入處理器,存儲訪問延遲極低,且處理器可以按照字節(jié)粒度訪問持久性內(nèi)存.這些硬件上的差異促使了新的文件系統(tǒng)設(shè)計.
1) 一致性保障.微軟研究院于2019年提出的字節(jié)尋址的持久性內(nèi)存文件系統(tǒng)BPFS[8],通過短路影子頁(short-circuit shadow paging)方式提供數(shù)據(jù)的原子性更新,同時提出一種硬件Epoch提交策略降低緩存刷新的開銷.英特爾公司于2014年提出的NVM直寫文件系統(tǒng)PMFS[9],采用原子的原地更新及細粒度日志機制保證元數(shù)據(jù)更新的原子性,通過undo日志和寫時復(fù)制的混合方式保證數(shù)據(jù)的一致性.加州大學(xué)圣地亞哥分校將傳統(tǒng)日志結(jié)構(gòu)文件系統(tǒng)進行重新設(shè)計和擴展,研制出日志結(jié)構(gòu)持久性內(nèi)存文件系統(tǒng)NOVA[10].NOVA將每個文件inode組織為一個日志,因此,其對單個inode的修改操作可以直接在日志尾部原子追加;重命名等操作通常涉及對多個日志結(jié)構(gòu)的更新,因此NOVA還采用輕量級的日志技術(shù)保證多操作的原子性.與PMFS相同,NOVA對文件數(shù)據(jù)使用寫時復(fù)制技術(shù).雖然上述系統(tǒng)在不同程度上結(jié)合了持久性內(nèi)存的字節(jié)尋址特性,并通過不同的手段解決了文件系統(tǒng)一致性管理.然而,上述所有系統(tǒng)均使用了基于頁粒度的寫時復(fù)制技術(shù),這會造成額外的拷貝開銷.北京航空航天大學(xué)提出的noseFS[16]則通過構(gòu)建額外的B+樹維護更細粒度的持久性內(nèi)存頁,從而降低寫時復(fù)制機制引入的拷貝開銷,然而,B+樹的維護管理同樣造成額外的時間及空間開銷.
2) 降低軟件開銷.操作系統(tǒng)管理的頁緩存在持久性內(nèi)存中將造成冗余的數(shù)據(jù)拷貝,嚴重影響性能.因而,Ext4,BtrFS等傳統(tǒng)文件系統(tǒng)均兼容了直接訪問模式(direct access, DAX).通過這種方法,應(yīng)用程序可以直接訪問非易失內(nèi)存中存儲的文件數(shù)據(jù),而不需要將數(shù)據(jù)額外拷貝到頁緩存中.PMFS,NOVA等專門為持久性內(nèi)存設(shè)計的文件系統(tǒng)則通過內(nèi)存映射的方式繞開了文件系統(tǒng)頁緩存.然而,操作系統(tǒng)本身依舊十分笨重,其系統(tǒng)調(diào)用引入的現(xiàn)場切換開銷,虛擬文件系統(tǒng)(virtual file system, VFS)引入的軟件開銷等在面向持久性內(nèi)存時也變得愈發(fā)嚴重.因此,維斯康星大學(xué)麥迪遜分校于2014年提出一種用戶態(tài)的持久性內(nèi)存文件系統(tǒng)Aerie[17],從而使得應(yīng)用程序可以直接在用戶態(tài)訪問文件數(shù)據(jù),而不引入額外的操作系統(tǒng)開銷.Strata[18]同樣也是一個用戶態(tài)文件系統(tǒng),不同的是,Strata同時管理多種存儲設(shè)備(硬盤、固態(tài)硬盤、持久性內(nèi)存等),通過合理的調(diào)度,Strata在性能、容量等方面均表現(xiàn)優(yōu)異.
3) 多核擴展性.在多核場景下,如何設(shè)計可擴展的文件系統(tǒng)以充分利用持久性內(nèi)存的高吞吐特性變得十分重要.NOVA在改造傳統(tǒng)日志式文件系統(tǒng)時,重點考慮了多核擴展性.NOVA將每個inode組織為一個日志,而不是仿造傳統(tǒng)方式構(gòu)建一個全局大日志,通過這種方式,有效避免了并發(fā)向單個日志追加記錄難擴展的問題.另外,NOVA僅將元數(shù)據(jù)放入日志結(jié)構(gòu),而數(shù)據(jù)部分則單獨管理,這有效降低了垃圾回收的開銷.最后,NOVA將空閑空間切分到不同的處理器核心,不同線程在分配內(nèi)存空間時,僅從本地空閑空間進行分配,從而避免了額外的全局鎖開銷.通過上述設(shè)計,NOVA具有極強的擴展性.HDPM也采用了類似的設(shè)計理念,通過多個日志結(jié)構(gòu)降低競爭.
持久性內(nèi)存展現(xiàn)出與傳統(tǒng)存儲設(shè)備(如硬盤、固態(tài)硬盤)完全不同的硬件特性,這為構(gòu)建高效的持久性內(nèi)存存儲系統(tǒng)提出了新的挑戰(zhàn).本文提出一種混合數(shù)據(jù)頁管理機制HDPM,通過選擇性使用寫時復(fù)制機制和日志結(jié)構(gòu)管理文件數(shù)據(jù),充分發(fā)揮持久性內(nèi)存字節(jié)可尋址特性,從而避免了傳統(tǒng)單一模式在遇到非對齊寫或者小寫造成的寫放大問題.為保持讀性能不受影響,HDPM引入逆向掃描機制,在重構(gòu)數(shù)據(jù)頁時不引入額外數(shù)據(jù)拷貝.HDPM還提出一種多重垃圾回收機制,在不同階段、不同時機進行高效的日志合并整理.實驗顯示,HDPM能夠顯著提升寫入性能.