1. 程式人生 > >混合易失和非易失主存的日誌結構檔案系統NOVA[FAST'16]隨筆二

混合易失和非易失主存的日誌結構檔案系統NOVA[FAST'16]隨筆二

序言

沒成想,本想用一篇博文寫完的,偶然發現博文後面文字顯示不了,最後才發現是因為符號原因“<>”隱藏了後面的文字表示。那麼為了把故事講完整,所以我寫了這篇後續部落格。內容完全接著NOVA隨筆一繼續把故事都嘮叨完吧。直接入正題啦!

NOVA實現

NVMM資料結構和空間管理

索引節點表(inode table)

NOVA初始分配每個索引結點表為2MB塊組的索引結點,每個索引結點以128位元組邊界對齊,所以給定一個索引結點號能夠很容易定位到目標索引節點。NOVA以round-robin順序來分配新的索引結點到每個索引節點表中,這樣索引結點能夠比較平均地分佈到眾多索引節點表(inode tables)。為了減少索引節點表尺寸,每個NOVA inode包含一個有效位(valid bit)並且NOVA重新使用無效的索引結點用於新的檔案或目錄。每個CPU一個inode table可避免索引節點的分配爭用並允許在故障恢復中並行掃描(parallel scanning)。每個inode包含日誌的頭尾指標,日誌以4KB頁的連結串列存在,並且日誌尾指標總是指向最新的提交的日誌項(log entry)。

Journal

一個NOVA的journal是一個4KB大小的迴圈快取(circular buffer),並且NOVA用一個(enqueue,dequeue)指標對來管理每個journal。對於建立操作,NOVA journal目錄的日誌尾指標和新的索引節點有效位。NOVA允許每個核一次開啟一個事務並且每個CPU允許併發事務執行。每次目錄操作,核心虛擬檔案系統層鎖住所有受影響的inodes,保證併發事務不會操作同一個索引節點。

NVMM空間管理

為了使得NVMM分配和回收快速,NOVA將NVMM劃分成pools,每個CPU一個,並且在DRAM中保持NVMM空閒頁列表。如果在當前的CPU pool中沒有可用的頁時,NOVA將從最新的pool中分配頁並且使用pool鎖來提供保護。為了減少分配尺寸,NOVA採用紅黑樹(red-black tree)以便保持空閒列表按地址排序,允許高效合併以及提供O(log n)回收。

原子性和寫順序性
NOVA提供元資料、資料和mmap更新的原子性,通過使用結合日誌結構和journaling兩種方法的技術實現。該技術使用如下三種機制:

  • 64位原子更新:當前處理器支援易失性記憶體的64位原子寫。NOVA使用64位原地寫以便直接修改元資料,如檔案的讀訪問時間等某些操作,並且使用64位原子寫通過更新索引節點的日誌尾指標來提交更新到日誌中。
  • Logging:NOVA採用索引結點日誌以便記錄修改單個索引結點的所有操作。這些操作包括write,msync和chmod。每個索引結點的日誌是相互獨立存在的。
  • 輕量級Journaling:對於目錄操作要求改變多個索引結點的操作如create,unlink和rename,NOVA採用輕量級的日誌提供原子性。任何時間內,任何journal的資料是小的,不會超過64位元組。

寫順序

NOVA依賴三個寫順序規則確保一致性。首先,它在更新日誌尾指標前提交資料和日誌條目到NVMM中;第二,它在傳輸更新前提交journal的資料到NVMM;最後,在回收過時版本之前提交資料頁的新版本。如果NOVA執行在一個支援clflushopt,clwb和PCOMMIT指令的系統上,將使用如下面的虛擬碼確保寫順序性。

new_tail = append_to_log(inode->tail, entry);
// writes back the log entry cachelines
clwb(inode->tail, entry->length);
sfence(); // orders subsequent PCOMMIT
PCOMMIT(); // commits entry to NVMM
sfence(); // orders subsequent store
inode->tail = new_tail;

如果平臺不支援上述新指令,NOVA採用movntq非時序移動指令繞過CPU快取記憶體層以便直接寫NVMM,並且結合clflush和sfence確保寫順序性。

目錄操作
NOVA對目錄操作進行了優化,包括link,symlink以及rename。它將目錄分成兩個部分:一個是存在NVMM中的目錄索引結點日誌,一個是存在DRAM中的radix tree。圖3表明了這些部件的關係。目錄日誌(directory log)包括了兩個條目:目錄條目(directory entries,簡稱dentry)和索引結點更新條目(inode update entries)。Dentries包括子檔案/目錄的名字,它的索引結點號(inode number)以及時間戳(timestamp)。為了加速目錄條目的檢索,NOVA將每個目錄索引結點儲存在DRAM中的radix tree中。NOVA使用當前CPU的Journal去原子地更新目錄日誌的尾指標並且設定新的索引結點的有效位。
這裡寫圖片描述

原子的mmap
DAX(Direct Access)檔案系統允許應用程式通過load和store指令去直接訪問NVMM,通過將物理的NVMM檔案資料頁對映到應用程式實體地址空間中。DAX-mmap繞過檔案系統頁快取記憶體(page cache)並且避免了paging開銷,程式設計師現有可用的原子性機制包括64位寫、fences以及快取記憶體重新整理指令(clflush),僅用這些原語構建強健的非易失資料結構是非常困難的。為了解決這個問題,NOVA提出了atomic-mmap,它是一個具有強一致性的直接NVMM訪問模型。由於NOVA對於檔案資料使用寫時拷貝技術並且立即回收過時的資料頁(stale data pages),它不支援DAX-mmap。Atomic-mmap比DAX-mmap有更高的開銷但是提供更強的一致性保證。

垃圾回收
NOVA的日誌採用連結串列(linked list)形式並且僅包含元資料,是的垃圾回收簡單高效。NOVA垃圾回收機制分Fast GC和Thorough GC。分別如下介紹。

Fast GC
Fast GC不要求任何的拷貝(copying)。如果在一個日誌頁中的所有條目過時(dead),那麼Fast GC通過從日誌連結串列中刪除該頁來回收日誌空間。如圖5(a)展示一個快速日誌垃圾回收的例子。

Thorough GC
在Fast GC日誌掃描期間,NOVA記錄每個日誌空間存活日誌(log)條目所佔的空間比例。如果存活的條目所佔的空間少於日誌空間的50%,NOVA就利用Fast GC結束後的Thorough GC來拷貝獲得條目到一個新的更加緊實的日誌版本中,更新DRAM資料結構指向新的日誌,然後使用新的日誌原子地替換舊的日誌,最後並回收該舊日誌。具體例子圖5(b)所示。
這裡寫圖片描述

關機和恢復
當NOVA重新掛載檔案系統時,它將重構需要的DRAM資料結構。由於應用程式可能僅訪問檔案系統的一部分索引節點(inodes),所以NOVA採用一個稱為延遲重建(lazy rebuild)的策略以便減少恢復時間。它推遲重建radix樹和索引結點,直到檔案系統第一次訪問該索引結點時才重建。這個策略加速了恢復過程並且減少了DRAM的消耗。

正常關機的恢復
對於正常關機操作,NOVA將NVMM頁分配狀態儲存到恢復索引結點日誌(recovery inode’s log)中並且在接下來的remount操作中恢復該分配狀態。這個過程中,NOVA不需要掃描任何的索引節點日誌,所以恢復過程很快。

失敗恢復
在系統故障發生是,NOVA通過掃描索引結點日誌來重建NVMM分配器資訊。NOVA的日誌掃描過程是快速的,原因有兩點,其一是每個CPU的索引結點表和每個索引結點均有一個log允許日誌恢復的巨大的並行性;第二點是因為NOVA的日誌僅包含元資料而不包含資料頁,日誌很短。NOVA的失敗恢復過程包括兩步:

  1. NOVA檢查每個journal並且回滾任何未提交的事務以便恢復檔案系統到一致性狀態。
  2. NOVA在每個CPU中執行一個恢復程序並且並行掃描索引節點表,為索引節點表中的每一個有效的索引節點執行日誌掃描。

NVMM保護
為了保護檔案系統並且防止NVMM免受流浪寫的持久腐蝕影響,NOVA必須確保只有系統軟體才能夠訪問NVMM。NOVA採用PMFS相同的保護機制。在檔案系統掛載時,整個NVMM區域被對映為只讀。當NOVA需要寫NVMM頁時,它通過禁止(disable)處理器的防寫控制(CR0.WP)以便開啟一個寫視窗write window)。當CR0.WP被清理時,核心軟體以ring 0許可權執行則可以寫核心空間中標記為只讀的頁。寫完後,NOVA又重置CR0.WP以便關閉該寫視窗。

評價

NOVA採用了因特爾持久記憶體模擬平臺(Intel PM Emulation Platform,簡稱PMEP)。

  • 用PMEP模擬了不同的NVM特徵;
  • 模擬了clwb/PCOMMIT的延遲。

具體情況見表1所示:
這裡寫圖片描述

NOVA提供了低延遲的原子性,如下圖所示:
這裡寫圖片描述
NOVA採用了Filebench工作負載包括fileserver、webproxy、webserver和varmail去評估NOVA的應用程式級效能。Filebench工作負載特徵見表2所示。
這裡寫圖片描述
NOVA獲得了高效能並且有強資料一致性保證。
這裡寫圖片描述

垃圾回收效率
NOVA的效能隨著執行時間的增加保持穩定,原因是在長期的執行過程中,Fast GC回收了主要的過時頁(stale pages)。如下圖所示:
這裡寫圖片描述

恢復開銷
NOVA使用DRAM去維持NVMM空閒頁列表(free page lists),所以在檔案系統掛載時必須重建。NOVA通過延遲地重建索引節點資訊,保持短的日誌並且執行並行的日誌掃描來加速恢復過程。為了測量恢復開銷,採用了表4中的三種工作負載。每種工作負載代表了檔案系統的一種不同的使用情況:Videoserver包含少量的大尺寸請求的大檔案訪問,mailserver包含了大量的小檔案並且請求大小比較小,而Filesever介於兩者之間。詳情見表4
這裡寫圖片描述
表5總結了結果。正常關機,NOVA在1.2ms時間恢復檔案系統,原因是NOVA不需要掃描索引結點日誌。在系統故障後,NOVA的恢復時間隨著索引結點的數量的增大而增長,檔案越多,檔案日誌越多並且隨著IO操作的進行檔案越來越碎片化以致檔案日誌變得越來越長。基於STT-RAM上比基於PCM的恢復快是因為NOVA需要讀日誌以便重構NVMM空閒頁列表,而PCM有比STT-RAM更高的讀延遲。在PCM和STT-RAM中,NOVA能夠在116ms時間內恢復50GB資料,恢復頻寬超過400GB/s。
這裡寫圖片描述

總結

加州大學Jian Xu和Steven Swanson等人發表在2016年檔案和儲存技術(File and storage technology)國際頂級A類會議上的NOVA,它是一個基於混合易失/非易失主記憶體的日誌結構檔案系統。NOVA擴充套件LFS思想以便管理NVMM,它的多日誌(multi-log)設計使得有快速的和有效的垃圾回收並且在系統故障後快速恢復。NOVA提供更強的一致性和原子性保證的同時優於現有的檔案系統。

詳細請參閱原文