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