賀慶建,蔡 濤,王 杰,牛德姣
(1.江蘇大學京江學院,江蘇鎮江212013;2.江蘇大學計算機科學與通信工程學院,江蘇鎮江212013)
計算機系統中各部件的發展很不均衡,傳統的磁盤和基于Flash 的固態硬盤(Solid State Drives,SSD)無法提供較高的隨機I/O性能,使得傳統存儲部件的讀寫速度遠低于計算部件的處理能力,無法解決日益嚴重的存儲墻問題。當前出現了一系列新型的NVM(Non-volatile Memory)存儲設備,如STTRAM(Shared Transistor Technology Random Access Memory)、相變存儲器(Phase Change Memory,PCM)、阻變式存儲器(Resistive Random Access Memory,RRAM)和鐵電隨機存取存儲器(Ferroelectric Random Access Memory,FeRAM)等,這些NVM 存儲設備具有支持以字節為單位的讀寫、較長的寫壽命、低功耗和接近動態隨機存儲器(Dynamic Random Access Memory,DRAM)的讀寫速度等優勢,成為解決存儲墻問題的重要手段。然而當前并沒有針對NVM 存儲設備構建的I/O棧,NVM存儲系統的效率也難以得到可靠保證。
計算部件的快速發展、多核心的普及以及新型存儲器件的發展都為系統達到高并發、高吞吐提供了條件,但也使得傳統軟件棧成為了系統瓶頸。這其中文件系統的設計對系統的性能有著較大影響。
傳統設備不具備NVM 存儲器件的管理和訪問特性,因此對數據流的處理也有較大差別。存儲系統的主要目標是為應用程序提供快速可靠的數據訪問,而這些特性的表現主要來自存儲器。數據組織形式一般以文件形式存在,以塊粒度傳輸,為了保證數據操作的有序性和數據的一致性,設計了以文件為單位的鎖機制,這確實可以提供可靠的一致性,但也導致了讀寫請求只能以串行方式訪問。而NVM 存儲器內部具有多路轉發通道,可以完成對文件的并發訪問,因此這種鎖機制無法利用NVM 這一特性;同時以塊粒度訪問造成了較大的讀寫冗余,大量額外時間開銷嚴重影響了NVM 存儲系統的I/O性能。因此,必須對現有文件系統的管理機制進行優化。
本文首先介紹了當前針對NVM 存儲系統設計與優化的相關研究;然后分析了基于鎖的文件系統存在的問題,并針對這些不足設計了無鎖的文件讀寫機制以及基于字節的讀寫接口;最后利用開源NVM 模擬器PMEM,實現了快速文件系統FPMRW,使用Filebench 通用測試工具對FPMRW 進行測試與分析,驗證了系統的有效性。
本文的主要工作如下:
1)針對NVM 存儲設備讀寫速度高的特性,設計了新型的快速文件系統,減少了存儲I/O軟件棧的開銷;
2)設計了無鎖化的讀寫機制,并應用到文件系統,提高了文件系統讀寫的并發度;
3)實現了一個快速文件系統的原型FPMRW,使用Filebench 進行了測試與分析,結果表明,相對EXT+PMEM 和XFS+PMEM,FPMRW能提高3%~40%的系統吞吐率。
當前的研究主要集中在通過相關技術發揮新型存儲器特性,以及通過文件系統等對數據的管理和訪問來提升系統的性能,因此設計開銷小、支持設備特性的文件系統具有重要意義。
NVM 具有很多新的特性,為了能將它高效地應用于系統,面臨很多的挑戰,因此需要改變傳統存儲結構和去除不利于發揮新型存儲設備特性的因素。這其中包括系統軟件棧的開銷、存儲設備接口的開銷等。當前很多研究者在如何利用NVM 存儲設備特性提高應用訪問性能方面開展了大量的研究工作。Swanson 等[1]分析發現,文件系統占傳統以塊設備構建的存儲系統I/O 開銷的20%,而占PCIe-NVM I/O 開銷的63%,系統軟件棧嚴重阻礙了NVM 讀寫性能發揮,因此提出重構當前系統軟件棧來減少延遲。文獻[1]提出利用原子寫來批量操作I/O,從而減少應用程序、文件系統、塊層等工作量。文獻[2-3]探討了面向SCM(Storage-Class Memory)的接口優化技術,分別提出了一種新的架構和一個名為Quill 的用戶空間庫。在該架構中,每個私有的虛擬化接口接管一個線程,同時利用基于硬件的文件系統保護檢查機制,因此,應用程序在訪問文件數據時不需要操作系統的干預,從而完全消除了大多數訪問的操作系統和文件系統成本;而Quill 用戶空間庫避免了多數訪問的系統調用開銷。文獻[4]針對NVM 讀取帶寬限制,以及高寫入帶寬下快速磨損的特點,提出了鍵值對存儲MyNVM,它設計了新的解決方案,包括使用帶有分區索引的小數據塊,并以輪詢代替中斷來實現對象在NVM 中緩存以控制其持久性的準入控制策略。實驗表明,MyNVM 在大幅降低DRAM 使用的情形下,與MyRocks相比,延遲和每秒查詢的影響可以忽略不計。Wei 等[5]設計了一種稱作內存元數據持久性機制(Persistent In-memory Metadata Management,PIMM)的內存元數據管理的持久性機制,它利用NVM 存儲器具有的持久性和字節尋址特性來減少固態硬盤的I/O 開銷。PIMM 在數據管理方面將數據和元數據分開存儲,元數據由NVM 管理,而真正請求的運行時所需數據則存儲于SSD 上。PIMM 是基于真實的NVDIMM(Non-Volatile Dual In-line Memory Module)構建的。實驗表明,該機制可以將SSD 的塊擦除減少到原來的91%,并能提高系統在不同負載類型下的I/O 性能。文獻[6]設計了Aerie,通過暴露存儲內存給應用程序,實現了在訪問文件時避免內核的交互,同時提供了類似POSIX(Portable Operating System Interface of UNIX)的文件系統。文獻[7]中發現,對于如PCM 之類的存儲介質,耗盡其功率和存儲單元的不是寫入次數而是位翻轉。文獻[7]針對這種情況對現有數據結構進行了幾種簡單直接的修改,這些修改可以減少一段時間內的位翻轉次數,并將其更好地優化用于非易失性存儲器技術(例如PCM)的硬件和軟件。文獻[8]通過各種技術刪除了實現事務的依賴,尤其是通過鎖發布之后推遲提交的方式,實現了最小化的開銷來完成約束NVRAM(Non-Volatile Random Access Memory)寫入順序的任務,從而確保事務的高效性。文獻[9]梳理了使用新型存儲技術解決大數據問題的現狀,對于如何更好地發揮新型存儲器件特性在大數據管理中作用作了一些思考。文獻[10]中則指出由于存儲器問題以及傳統介質與主存差距的拉大,必須抓住非易失存儲工藝的機遇,同時針對非易失內存的結構以及系統的優化進行了綜述。
當前很多研究者在如何通過文件系統發揮NVM 存儲設備特性方面開展了大量的研究工作,這其中包括降低文件系統開銷、高效的事務和高并發機制等。
文獻[11]實現了持久性內存文件系統PMFS,它是基于POSIX 的輕量級文件系統。它充分利用了持久性內存PM 的字節尋址避免了塊訪問的開銷,同時支持應用對于PM 的直接映射。此外,還利用細粒度日志以及大頁面方式提升映射I/O。現有的針對固態盤設計的文件系統存在軟件開銷和一致性等問題,NOVA[12]提供了一個日志結構文集系統,提供了強大的一致性,同時為每個inode分隔日志以提高并發度。實驗結果顯示,相比其他文件系統,在提供同等一致性強度的情況下,NOVA 有著3.1 倍到3.5 倍的性能提升。文獻[13]基于現有以數據塊為單位的訪問機制,通過修改虛擬文件系統設計了一種新的寫機制。基于磁盤時,該系統的寫性能可以提高7~45.5倍,基于閃存的固態盤時,寫性能可以提高2.1~4.2倍。DEVFS[14]設計者也提醒,挖掘存儲設備的特性時要仔細考慮軟件存儲棧,傳統存儲棧要求應用陷入操作系統并且與諸多軟件層比如內存buffer cache、文件系統、塊層等交互,這些軟件交互無疑會大幅增大訪問延遲,從而降低了硬件本身帶來的收益。設計者提出了一種完全嵌入式存儲設備的直接訪問文件系統DevFS(Dev File System),對模擬的DevFS 原型的評估顯示,相比直接訪問(direct access)I/O 吞吐率提高了2倍以上,設備內存的使用率降低了78%。文獻[15]通過各種技術刪除了實現事務的依賴,尤其是通過鎖發布之后推遲提交的方式,實現了最小化的開銷來完成約束NVRAM 寫入順序的任務,從而確保事務的高效性。為了利用NVM 的高效率來優化元數據的訪問性能,文獻[16]針對高速緩存數據在驅逐時容易導致無序的元數據更新問題,提出了一種軟更新策略SoupFS。實驗結果表明,與NVMFS使用同步高速緩存刷新保證一致性相比,SoupFS 無論在延遲還是吞吐率方面都有著明顯的優勢。文獻[17]針對NVM 存儲系統的讀寫速度不均衡、寫壽命有限等問題,設計了同異步融合的訪問請求管理策略,該策略能提高1%~22%的讀寫速度和9%~15%的吞吐量,能夠有效減少文件訪問的時間開銷。
在Linux 系統中,數據的管理和訪問都通過文件系統管理,同一時間會有多個不同操作同時訪問文件系統,這些操作在經過文件系統處理后最終以請求的形式交給底層存儲設備。近年來,計算機技術的發展越來越快,計算機擁有的核心數大大增加。同時,NVM 存儲器件讀寫能力也不斷提高,內部具有支持多通道的特性。但在多線程訪問同一文件時,會出現互斥的請求,因此文件系統出于保證一致性考慮,直接以文件為單位進行加鎖,這使得鎖機制成為了系統I/O 瓶頸,無法適應高并發、高吞吐的數據訪問場景。
在傳統的EXT4 文件系統中,用戶層的應用程序利用系統調用發起對文件的操作。在內核層的文件系統接受這些請求,并將它們以串行的方式進行處理。對于寫操作,內核首先會將操作的文件的inode 加互斥鎖,并在此次I/O 操作完成之后釋放互斥鎖。在加鎖期間,其他對此文件發起I/O請求的進程會被掛起,直到互斥鎖釋放。通過這樣加鎖的方式,能避免多線程并發下同時訪問同一文件而造成的一致性相關的問題。但是EXT4 互斥鎖的對象是文件inode,這樣的粒度非常大,尤其是當多個進程對同一文件發出大量請求時,其性能會大大降低。
對于PMFS和NOVA等文件系統,它們出色的性能以及原子性保證使得其影響深遠。即使如此,為了一致性上的保證,NOVA 對于寫操作也沿襲傳統文件系統的互斥鎖的處理方式。
采用互斥鎖的方式對慢速存儲設備的影響較小,但NVM存儲設備具有高吞吐高并發的特性,推遲訪問請求對系統整體性能影響較大。傳統存儲器件下,由于順序讀寫的速度大大超過隨機讀寫,因此會通過合并和重排請求等方式來提升I/O 性能,但NVM 存儲器件具有較好的隨機訪問性能,同時可以利用多個通道實現對不同區域的數據訪問,從而在請求處理上也不再需要重排合并等機制,鑒于此,基于鎖的串行請求訪問已經不再適用于高并發的存儲系統。
此外,現有的鎖機制本身也會對數據訪問造成一定的延遲。現有的鎖機制會將訪問請求對應的進程調度到阻塞狀態等待喚醒,喚醒后還需要再切換到就緒狀態,所需的時間開銷相比NVM 存儲設備的讀寫延遲已很可觀;同時現有存儲系統中訪問請求都需要通過慢速的設備接口,不能很好地發揮設備內讀寫的優勢,嚴重影響了NVM存儲系統的吞吐率。
存儲系統中讀寫訪問請求存在較大的差異,讀訪問請求之間可以互相并發,但寫訪問請求之間、讀寫訪問請求之間則存在互斥的關系;其次,在多核心和具有高吞吐的NVM 存儲設備背景下,以文件為粒度的鎖機制已經成為系統瓶頸;再者,NVM 內部具有相對存儲接口更高的讀寫速度,同時新型存儲器件也具有一定的計算能力和管理能力,因此有趨勢表明利用設備自身處理能力來完成文件的讀寫具有一定的優勢。
相關工作中已有對于以塊為單位的沖突檢測算法,它們利用NVM 存儲設備內部存在多個訪問請求執行隊列,通過二維鏈表結構對訪問請求進行沖突的檢測以及執行。由此,通過修改文件系統,去掉了以文件為單位的鎖機制,使應用程序直接訪問無鎖的文件讀寫機制,同時利用基于字節的讀寫接口去訪問具有自主沖突檢測的NVM 存儲中的數據。圖1 給出了采用無鎖的文件訪問系統FPMRW的結構。

圖1 FPMRW的結構Fig.1 Structure of FPMRW
通過對文件讀寫流程的分析發現,涉及到對文件級別的鎖會出現在ext4 文件系統中讀寫函數的入口,因此將用于鎖定文件inode 的互斥鎖去掉,這包含通用讀寫方法和采用dax的直接映射訪問,在進行寫操作的dax 操作中,存在對讀進行鎖定的,也一并去掉。圖2 展示了去鎖過程對文件系統寫調用堆的修改。

圖2 文件系統寫調用堆Fig.2 Call stack of write in file system
在完成以上修改后,對設備的訪問不再使用塊接口,而是自主設計的讀寫接口pmem_read、pmem_write,同時在vfs中提供應用程序訪問的系統調用。
NVM 存儲設備具有字節尋址的特性,但多數文件系統仍然提供以塊為粒度的讀寫,具有較大的寫放大,不僅加快了設備的磨損,同時給原本就存在寫短板的寫性能帶來了挑戰。此外,NVM 器件的多路轉發特性也沒有得到充分使用,而新型存儲設備具有很好的隨機讀寫性能,這為同時處理多個請求提供了可能,而沖突檢測機制恰好能完成這一工作。
文件系統的塊接口訪問方式極大地限制了基于NVM 新型存儲設備性能的發揮。為了讓應用程序能夠僅讀寫真正需要的數據部分,發揮設備的字節讀寫特性,依據NVM 存儲設備的讀寫非對稱性,同時考慮多余讀對訪問性能具有正面意義,對pmem_write 以字節的粒度訪問,對pmem_read 則保留塊粒度訪問。
不同于機械盤在處理請求時需要進行合并重排等調度,NVM 存儲設備對到來的請求直接處理,每個請求對應一個緩沖區,而這個緩沖區是根據buffer_head 結構體在寫操作流程中調用_block_write_begin()時被構造的,以上分析表明,可以在開始寫之前對真正要寫的數據進行區域標記。具體做法為在buffer_head 結構體增加write_pos 和write_length,對應寫數據的起始地址和數據長度,通過比較起始地址和塊起始地址確定write_pos;通過比較寫入尾地址和塊結束地址確定write_length;在提交請求時對其初始化,因此傳送給pmem_write 接口的大致對應一個四元組(req_id,bi_next,start_address,bi_size),最后pmem_write 對接收的請求利用結合沖突檢測機制以字節粒度進行寫入。由于讀操作仍然以塊粒度進行,因此pmem-read 的四元組為(req_id,bi_next,read_pos,read_length),其中read_pos 固定為塊的起始地址,read_length固定為塊的大小。
通過對寫流程的分析,本文對文件系統鎖機制以及塊訪問接口進行了優化,設計了具有字節寫粒度的去文件鎖機制的FPMRW寫算法,具體如下所示:
PMRW_Write(req_id,bi_next,write_pos,write_length)
應用程序首先調用vfs中FPMRW提供的寫系統調用;
進程直接訪問取消鎖機制的寫處理過程,包括對要寫的數據區域標記和構造具有四元組的寫請求;
將具有四元組的寫請求提交給pmem_write();
在pmem_write()中調用沖突檢測機制對寫請求進行寫入的沖突檢測:
If(不存在沖突){
執行設備內字節粒度的寫入操作;
執行完畢,喚醒已加入沖突隊列的請求;}
Else
由于存在沖突將被沖突檢測模塊加入到待寫入隊列;
監聽喚醒信號;
通過對讀流程的分析,設計了FPMRW 結構下的讀算法,具體描述如下:
FPMRW_Read(req_id,bi_next,read_pos,read_length)
應用程序首先調用vfs中FPMRW提供的讀系統調用;
進程直接訪問取消鎖機制的寫處理過程,包括對要讀的數據區域標記和構造具有四元組的讀請求;
將具有四元組的讀請求提交給pmem_read();
在pmem_read()中調用沖突檢測機制對讀請求進行讀取的沖突檢測:
If(不存在沖突){
執行設備內塊粒度的讀取操作;
執行完畢,喚醒已加入沖突隊列的請求;}
Else
由于存在沖突將被沖突檢測模塊加入到待讀取隊列;
監聽喚醒信號;
當前沒有成熟的NVM 存儲設備,我們使用開源NVM 存儲系統模擬器PMEM 模擬NVM 存儲設備,并增加60 ns 的讀延遲和150 ns 的寫延遲以模擬NVM 存儲設備的讀寫特性;同時修改Linux 內核,在內核地址的尾部預留50 GB 內核空間作為PMEM的存儲地址空間。
修改4.4.112 版的Linux 內核源代碼,在虛擬文件系統(Virtual File System,VFS)中增加讀寫系統調用;修改文件系統,取消鎖機制,增加無鎖的文件讀寫模塊;修改buffer_head等結構在請求中分別增加寫流程的write_pos 和write_length讀流程的read_pos 和read_length,并完成對增加字段的初始化,在NVM 模擬器實現基于字節的讀寫接口pm_read、pmem_write,實現對于請求的沖突檢測調用和請求的管理工作。最后在開源NVM模擬器的基礎上實現了FPMRW原型。
使用一臺服務器構建了FPMRW 原型系統的測試環境,該服務器的配置如表1所示。

表1 原型系統測試環境的軟硬件配置Tab.1 Software and hardware configuration of testing environment of prototype system
分別加載FPMRW 與運行在開源NVM模擬器PMEM上的EXT4 和XFS 兩種文件系統,使用Filebench 中的Copyfiles、Webproxy 和Randomrw 負載,模擬不同的存儲系統運行環境。測試FPMRW 的吞吐率,并與運行在PMEM 上不作修改的系統進行比較。
每項測試均進行10 次,并在每次測試之后均重啟服務器來消除緩存對測試結果的影響,最后取平均值作為測試結果。
先分別在PMEM上加載EXT4和XFS文件系統,再測試修改后的原型系統FPMRW,使用Filebench 中的Copyfiles 負載,模擬用戶拷貝文件的操作,設置測試文件數量為1 000,每個目錄中創建20 個文件,文件的平均大小為16 kB,每次I/O 大小為16 kB,搜索深度為0.7,測試時間為30 s,測試線程數量為1、2、4、8和16時的吞吐率IOPS,結果如圖3所示。
從圖3 可以看出,相比運行在PMEM 上的EXT4 和XFS,FPMRW 具有明顯的性能優勢。在單線程下,FPMRW 相對EXT4+PMEM 和XFS+PMEM 的IOPS 值提升在7%左右;并且隨著線程數的增加,提升的幅度也在增大,當線程數為8 時,達到了22%。在線程數到達16 時,FPMRW 的IOPS 值仍有小幅增長,而其他兩個系統在線程增加的過程中,其IOPS 值非但沒有增長,還出現一定的下滑,這表明,在不作修改的EXT4+PMEM 和XFS+PMEM 利用多線程拷貝數據會影響系統的性能。這一方面是由于負載中主要為寫操作,在不作修改的系統中,由于以文件加鎖,因此多數時間由于互斥鎖的存在,線程都是單獨運行的,這使得線程間互斥以及沖突加劇,不僅增加了對線程的管理開銷,還對堆棧造成一定的壓力,這就使得線程運行效率特別低;另一方面,以塊粒度訪問的方式造成了冗余開銷,影響讀寫性能。而FPMRW 通過對請求地址進行沖突檢測,不僅實現了在多個文件甚至同一文件利用多線程進行讀寫,設計的以字節讀寫接口方式還能避免將設備數據讀入內存再回寫,并通過只讀寫實際需要的數據量使得系統I/O 在處理有效數據的同時具有高并發、高吞吐的優勢。

圖3 使用Copyfiles負載的測試Fig.3 Tesing with Copyfiles workload
接著,利用Filebench 中的Webproxy負載模擬代理服務器的使用情況。設置測試文件數量為1 000,每個目錄中創建20個文件,文件的平均大小為16 kB,每次I/O大小為16 kB,搜索深度為2.3,測試時間為30 s,測試線程數量為1、2、4、8 和16時的吞吐率IOPS,結果如圖4所示。

圖4 使用Webproxy負載的測試Fig.4 Testing with Webproxy workload
從圖4 中可以看出,Webproxy 負載下,系統的IOPS 值相對較高,這是由于該負載中大部分時間都是在進行讀操作。在線程數從1 到8 的過程中,各系統的IOPS 值隨著線程數增加而逐步提高,但FPMRW 提升最明顯,并且相對其他兩個系統的IOPS 增幅隨線程逐步提高,在線程數為16 時,達到了40.4%。從圖中可以發現,EXT4+PMEM 相對XFS+PMEM 性能要好,這是由于EXT4 具有比XFS 更好的查找優勢。由于Webproxy 具有多個不同操作,在有更新操作時還是會影響讀的進行,在不加修改的EXT4+PMEM 和XFS+PMEM 中,在進行寫操作時,所有線程又回到了單獨運行狀態,也就是在某些時候并未起到多線程的效果,反而增加了線程掛起和切換等開銷,因此它們具有比FPMRW更高的延遲。
最后,利用Filebench 中的Randomrw 負載模擬代理服務器的使用情況。設置測試文件總量為2 GB,每次I/O 大小為8 kB,測試時間為30 s,測試線程數量為1、2、4、8 和16 時的吞吐率IOPS,結果如圖5所示。

圖5 使用Randomrw負載的測試Fig.5 Testing with Randomrw workload
從圖5 中可以看出,在混合負載下,只有讀寫操作下的系統隨機讀寫性能具有較高的IOPS 值,不過FPMRW 始終具有最好的性能。在單線程下,FPMRW 相對EXT4+PMEM 和XFS+PMEM 性能提升大約5%;在線程數到達4 后,吞吐率提升都超過了20%。在線程數從1到4過程中,各個系統的性能都逐步提升,超過4 以后,增加線程數只有FPMRW 的吞吐率繼續增長,這是由于隨著線程數提升,出現寫進程的幾率增加,以文件為粒度的鎖機制影響了高并發,而FPMRW 并不存在這種限制,這表明FPMRW 在混合負載下有更好的適應性、并發性。
NVM 存儲器件能夠用來設計低時延、高吞吐的存儲系統,但由于當前文件系統存在文件為粒度的鎖機制和使用塊訪問方式,使得NVM 存儲器性能并不能達到理想的狀態。為了解決這個問題,本文通過改變現有的鎖機制,取消以文件為單位的鎖粒度,提出了一種快速文件讀寫系統,設計了無鎖的文件讀寫機制以及基于字節的讀寫接口,并利用開源NVM 模擬器PMEM 實現了快速文件系統FPMRW,最后使用Filebench 通用測試工具對FPMRW 進行測試與分析,驗證了系統的有效性。結果表明,相對于EXT+PMEM 和XFS+PMEM,本文系統的吞吐率能提高3%~40%。
但當前工作還沒有考慮數據本身和文件元素據的區分處理和進一步分析優化,后面的工作將會對不同數據的特性和表現進行分析,并設計針對其特點的處理方式。