1. 程式人生 > >深入理解Lustre檔案系統-第12篇 Lustre磁碟檔案系統:ldiskfs

深入理解Lustre檔案系統-第12篇 Lustre磁碟檔案系統:ldiskfs

ldiskfs(有些時候被錯誤地稱為Linux ext4檔案系統)是對Linux ext3檔案系統的打了很多補丁的一個版本,由Sun Microsystems公司開發和維護。ldiskfs是Linux ext3和ext4檔案系統的超集。現在它只被Lustre檔案系統用在伺服器端,作為底層的本地檔案系統。本節給出了對ldiskfs機器與ext3檔案系統不同之處的簡要介紹。

就各自的I/O路徑而言,ext3和ldiskfs檔案系統的不同之處如下所示:

  • 在ldiskfs裡,分配/塊查詢是在索引節點鎖取得後就預先完成了,而隨後在I/O提交到磁碟的過程中,索引節點鎖就被丟棄了。這極大地提高了I/O的併發性,因為索引節點只被鎖了很短的一段時間。
  • 在ldiskfs中,分配是對整個RPC(1MB,或者換句話說,256×4KB塊)一次性完成的,而不是像VFS所做的那樣4KB一次。這個減少了許多重複搜尋點陣圖的開銷,同時允許了更有效的extent查詢。
  • 在ldiskfs中,現在寫入是完全和客戶端同步的(知道資料和元資料寫入磁碟上才回復),但是這一點正在改變。在新開發的“非同步提交”路徑裡,對任何事務,將在資料提交到磁碟後,在元資料提交之前,回覆客戶端。另外新的ROC(1.8)將在把寫入頁放入磁碟之前,放入告訴緩衝,為OSS端完全非同步的寫作準備。
  • 在Ldiskfs中,當前,日誌重新整理是在每個寫RPC後強制執行的。

在ldiskfs中,和任意其他將被Lustre伺服器使用的底層檔案系統一樣,下面列出的策略將影響IO路徑。

  • 客戶端控制的:正在傳送中的RPC,RPC大小和每個OST的緩衝的髒資料。為了減少readmodify-write(?)操作,RPC大小最好是底層RAID分條大小的倍數。同時,RPC大小×正在傳送中的RPC數×客戶端總數,將需要考慮到連線的頻寬和底層塊裝置的頻寬,以避免大延遲和在競爭點的請求堆積。
  • 伺服器控制的:IO執行緒數。當前,這個量限制了任意時刻後端裝置的I/O量。
  • 分條策略。它決定了對一給定檔案,有多少OST參與I/O。

ldiskfs和Lustre有賴於一組Linux核心補丁,它們不僅在ext3上添加了新的特性,而且提高了效能。下面的列表給出了一些對ldiskfs必要的核心補丁,雖然它們中的一些可能對特定使用例項並不必要(例如sd_iostats)。

  • jbd-2.6.10-jcberr.patch:日誌回撥補丁,允許在資料至少提交到日誌中時,以last_committed回覆客戶端。這也意味這資料可以在脫離客戶端支援的情況下從本地檔案系統中恢復。
  • jbd-stats-2.6-sles10.patch:提供了關於事務大小、時間等資料。
  • iopen-misc-2.6.12.patch:為getattr-by-fid和恢復提供了open-by-inode。
  • dev_read_only-2.6-fc5.patch:為測試和在不阻塞在正在進行中的I/O的基礎上進行OST/MDT的failback,放棄對塊裝置的寫入。
  • sd_iostats-2.6-rhel5.patch:提供可選的SCSI裝置資料。
  • blkdev_tunables-2.6-sles10.patch:允許通過快層提交更大的I/O。
  • i_filter_data.patch:允許從記憶體中的索引節點連到MDS/OSS資料。
  • quota-fix-oops-in-invalidate_dquots.patch:修補上游核心限額原始碼的bug。這個bug已經在2.6.17核心中修補好了。
  • jbd-journal-chksum-2.6-sles10.patch:提供了日誌事務校驗碼以檢測磁碟毀壞。

除了上述列出來的補丁外,ldiskfs還需要一些對ext3原始碼上所做的,用於增加效能和功能的補丁。下面的列表給出了ldiskfs檔案系統所需的補丁。

  • ext3-wantedi-2.6-rhel4.patch:允許了通過號碼來建立特定索引節點,用於恢復。假設客戶端的進行了一個開啟/建立,並且得到了來自伺服器的帶有特定索引節點號的回覆。讓我們假設此時,伺服器崩潰了,然而建立還沒有反映到磁碟上去,所以該資訊丟失了。在伺服器重啟並進入恢復後,客戶端重新連線上,並再次傳送它的開啟/建立請求,其中給定了上次由伺服器傳達的索引節點號。在Lustre 2.0中,這個過程將不需要了,因為那是使用的將是另外一組Lustre 索引節點號而不是對應實際的磁碟上的索引節點號。在伺服器端提供的由Lustre 索引節點號到實際盤上索引節點號將消除對這個補丁的依賴。 iopen-2.6-fc5.patch:允許了通過號碼查詢索引節點。一般,查詢檔案需要全路徑,但是Lustre在它的協議裡沒有這個功能。當查詢時,只有父索引節點號和孩子名,正常情況下,這就夠了。但是如果Lustre處於恢復模式,所有先前的查詢步驟都丟失了,Lustre需要一個找到父索引節點號的方法。這個補丁提供了這個功能。這各問題在ext3中不存在,因為檔案系統是本地的,在崩潰的時候,所有東西都掛了,而在恢復(或者重啟)的時候,所有的查詢功能從根檔案開始。
  • ext3-map_inode_page-2.6-suse.patch:為快讀/寫操作稍後進行的I/O提交分配資料塊。這個補丁建立了一個API,可以用來map Lustrefsfilt層的inode_page函式。Lustre需要這個補丁,因為它預先分配塊,提高了元資料效能。

接著五個補丁可以分為一組,因為它們於ext3檔案系統之上提供了extent格式的能力。他們也在Linux ext4檔案系統中使用。ext3檔案系統按照塊來定址檔案,每塊在索引節點裡有4位元組的記錄,裡面記錄了指明實際資料儲存位置的塊號。對於長檔案,這導致了在索引節點中儲存了許多塊資訊,這是非常低效的。而extent概念定義了分配給大檔案使用的,作為單一實體的一個塊區間。塊區間裡塊的最大為128MB。這是由於每128MB就有一個塊儲存了下個128MB的配給點陣圖。這個情況的唯一例外是空洞(hole),一個空洞,不管它有多大,可以以一個extent來標識。對於包含下列補丁的Lustre中的一個非常大的檔案,它將會有多個extent,每個extent大小是128MB減去4KB,其中4KB用來儲存點陣圖,此點陣圖用來對映大小為128MB 的extent組。extent概念提高了效能,因為:它不僅減少了分配時間,而且,例如,在unlink檔案的時候,只需要提供關於該檔案的,用來確定extent的資訊。

  • ext3-extents-2.6.16-sles10.patch:
  • ext3-extents-fixes-2.6.9-rhel4.patch:
  • ext3-extents-multiblock-directio-2.6.9-rhel4.patch:
  • ext3-extents-search-2.6.9-rhel4.patch:
  • ext3-extents-sanity-checks.patch:

接下來兩個補丁為ldiskfs檔案系統提供了一個多塊(multi-block,mballoc)分配者。它們也用在Linux ext4檔案系統中。此時需要澄清的是,extent和mballoc分配時完全無關的。當分配一個extent時,會分配一組連續的塊。讓我們假設這個extent的第一個塊開始於x,而最後一個塊石x+y。下一個將要分配給同一個檔案的extent可能是也可能不是以x+y+1開始,但是在任意一種情況下,新快將會分配為一組連續的塊。這樣,當定址這兩組可能不相鄰的磁碟塊時,我們需要提供他們的extent資訊,而不是對它們一個塊一個塊地定址。mballoc則是用一次調研分配所需數量的(很有可能連續的)塊。

  • ext3-mballoc3-core.patch:
  • ext3-mballoc3-sles10.patch:
  • ext3-nlinks-2.6.9.patch:允許在一個給定目錄下建立超過32,000個子目錄。這是通過在i_nlink(15位元)溢位時(如果子目錄大於32,000個),設定它為1的方法實現的(也用在Linux ext4檔案系統裡)。
  • ext3-ialloc-2.6.patch:為避開滿載的組(即跳過滿載的組),改變了OST的索引節點分配策略。在每個索引節點組的開始,有一個位圖,表明哪些組被完全用光了,哪些組被部分使用了,哪些組是空閒的。超級塊包含一些關於在不同的索引節點組中有多少索引節點空閒的資訊。這個補丁給出一個索引節點組的資訊:在該組裡面是否有空閒索引節點,而不要完整掃描這個組。
  • ext3-disable-write-bar-by-default-2.6-sles10.patch:在日誌中關閉寫路障(barrier),該路障導致了緩衝重新整理。
  • ext3-uninit-2.6-sles10.patch:提供未初始化的塊組,以提高e2fsck效能(也用在Linux ext4檔案系統中)。
  • ext3-nanosecond-2.6-sles10.patch:為索引節點提供了納秒級別的時間戳解決方案(也用在Linux ext4檔案系統中)。
  • ext3-inode-version-2.6-sles10.patch:為基於版本的恢復提供了盤上索引節點版本(也用在Linux ext4檔案系統中)。
  • ext3-mmp-2.6-sles10.patch:聽過多次掛載保護,用以防止在LinuxHigh-Avaliabilty (HA)環境中的兩次掛載。
  • ext3-fiemap-2.6-sles10.patch:提供檔案extent對映API(有效的分段fragmentation報告)(也用在Linux ext4檔案系統中)。
  • ext3-block-bitmap-validation-2.6-sles10.patch:確定磁碟上的點陣圖是正常的,以防止級聯毀壞(cascadingcorruption)(也用在Linuxext4檔案系統中)。
  • ext3-get-raid-stripe-from-sb.patch:在ext3超級塊中儲存RAID佈局,以優化分配(供分配者使用,資訊是由mkfs寫入的)也用在Linuxext4檔案系統中)。
本文章歡迎轉載,請保留原始部落格連結http://blog.csdn.net/fsdev/article

相關推薦

深入理解Lustre檔案系統-12 Lustre磁碟檔案系統ldiskfs

ldiskfs(有些時候被錯誤地稱為Linux ext4檔案系統)是對Linux ext3檔案系統的打了很多補丁的一個版本,由Sun Microsystems公司開發和維護。ldiskfs是Linux ext3和ext4檔案系統的超集。現在它只被Lustre檔案系統用在伺服

深入理解Lustre檔案系統-3 lustre lite

在file結構體中定義的另外一個欄位是f_dentry,它指向一個儲存在dentry cache(即所謂dcache)中的dentry物件(struct dentry)。實質上,VFS在檔案和資料夾將被首次訪問的時候就會建立一個dentry物件。如果這是一個不存在的檔案/資料夾,那麼將會建立一個無效的de

深入理解閉包系列——閉包的10種形式

前面的話   根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的10種形式 返回值   最常用的一種形式是函式作為返回值被返回 var F = function()

深入理解閉包系列——常見的一個迴圈和閉包的錯誤詳解

前面的話   關於常見的一個迴圈和閉包的錯誤,很多資料對此都有文字解釋,但還是難以理解。本文將以執行環境圖示的方式來對此進行更直觀的解釋,以及對此類需求進行推衍,得到更合適的解決辦法 犯錯 function foo(){ var arr = []; for(var i = 0

深入理解定時器系列——定時器應用(時鐘、倒計時、秒錶和鬧鐘)

前面的話   本文屬於定時器的應用部分,分別用於實現與時間相關的四個應用,包括時鐘、倒計時、秒錶和鬧鐘。與時間相關需要用到時間和日期物件Date,詳細情況移步至此 時鐘   最簡單的時鐘製作辦法是通過正則表示式的exec()方法,將時間物件的字串中的時間部分截取出來,使用定時器重新整理即可 &

深入理解DOM節點型別——註釋節點和文件型別節點

前面的話   把註釋節點和文件型別節點放在一起是因為IE8-瀏覽器的一個bug。IE8-瀏覽器將標籤名為"!"的元素視作註釋節點,所以文件宣告也被視作註釋節點。本文將詳細介紹這兩部分的內容 註釋節點 【特徵】   註釋在DOM中是通過Comment型別來表示,註釋節點的三個node屬性——node

深入理解DOM節點型別——元素節點Element

前面的話   元素節點Element非常常用,是DOM文件樹的主要節點;元素節點是HTML標籤元素的DOM化結果。元素節點主要提供了對元素標籤名、子節點及特性的訪問,本文將詳細介紹元素節點的主要內容 特徵   元素節點的三個node屬性——nodeType、nodeName、nodeValue分別是

深入理解javascript物件系列——神祕的屬性描述符

前面的話   對於作業系統中的檔案,我們可以駕輕就熟將其設定為只讀、隱藏、系統檔案或普通檔案。於物件來說,屬性描述符提供類似的功能,用來描述物件的值、是否可配置、是否可修改以及是否可列舉。本文就來介紹物件中神祕的屬性描述符 描述符型別   物件屬性描述符的型別分為兩種:資料屬性和訪問器屬性 資料屬

深入理解Java虛擬機器 | 虛擬機器位元組碼執行引擎

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系

深入理解iputils網路工具-6 rarpd逆地址解析程式

6.1       引言     通過逆地址解析協議RARP,客戶端可以通過硬體地址得到對應的IP地址,一般用於無盤系統中,用以獲得自身的IP地址。rarpd就是處理RARP請求的伺服器程式。     RARP分組的格式與ARP分組基本一致。它們之間主要的差別是RARP請求或應答的幀型別程式碼為0x8035

深入理解Lustre檔案系統-10 LNETLustre網路

初始化和拆除 intLNetInit(void)和intLNetFini(void)是用來建立和拆除LNET連線的API。 面向記憶體的通訊語義 如下的API已經由註釋註解了: int LNetGet(       lnet_nid_t self,       lnet_handle_md_t md_in,

深入理解Lustre檔案系統-7 MDC和Lustre元資料

7.1   MDC概論 MDC模組是處在Lustre Lite之下的一層。它定義了一些元資料相關的函式, Lustre Lite可以呼叫這些函式來向MDS傳輸元資料請求。這些函式在lustre/mdc中實現,我們將在6.3節討論它們。 Lustre Lite在mdc_op_

深入理解Lustre檔案系統-3 LNETLustre網路

    LNET是Lustre Networking的縮寫,是Lustre的網路子系統,負責提供訊息傳遞API。LNET源自於Sandia Portals,但又與之存在著差異。 3.1      結構     LNET由兩部分組成: LNET層。它以通訊API的方式,向被稱

深入理解Lustre檔案系統-2 Portal RPC

    遠端程序呼叫(Remote Procedure Call,RPC)是構建分散式系統時所使用的一種常見元件。它使得客戶端可以像進行本地呼叫一樣進行遠端的過程呼叫,即客戶端可以忽略訊息傳遞的細節,而專注於過程呼叫的效果。     Portal RPC是Lustre 的R

深入理解Lustre檔案系統-1 跟蹤除錯系統

    一直以來,Linus Torvalds對核心偵錯程式都秉持著抵觸態度,並且擺出了我是bastard我怕誰的姿態。他保持了一貫風格,言辭尖銳卻直指本質。相信這是經驗之談。在除錯核心時,最關鍵的問題是如何獲取出錯相關的資訊,準確定位出錯位置。獲取資訊有很多方法,其中核心

深入理解Lustre檔案系統-9 Portal RPC

Portal RPC為如下內容提供了基礎機制: 通過輸入口傳送請求,接受請求通過輸出口接收和處理請求,傳送請求執行塊資料傳輸錯誤恢復 我們將首先探討Portal RPC的介面,而不深入到實現細節中。我們將用LDLM的傳送機製作為例子。對這個例項,LDLM向客戶端傳送一個

讀書筆記 ---- 《深入理解Java虛擬機器》---- 12執行緒安全與鎖優化

上一篇:Java記憶體模型與執行緒:https://blog.csdn.net/pcwl1206/article/details/84661639 目  錄: 1  Java語言中的執行緒安全  1.1  不可變  1.2 

深入理解Linux核心個人小結12---虛擬檔案系統

一.  綜述:       虛擬檔案系統(VFS):是一個核心軟體層,用來處理與Unix檔案系統相關的所有系統呼叫;可看作是一個通用的檔案系統,必要時可以依賴某種具體的檔案系統呼叫其底層函式。      快取記憶體的種類:       1.  硬體快取記憶體: 一個快速的靜

深入理解DOM節點類型第一——12種DOM節點類型概述

接下來 詳細 instr lang TE eva published () 兩個 前面的話   DOM是javascript操作網頁的接口,全稱為文檔對象模型(Document Object Model)。它的作用是將網頁轉為一個javascript對象,從而可以使用ja

CentOS7搭建FastDFS V5.11分布式文件系統-

nginx rom jmp upload tro 結合 刪除 stc 開發 1.測試 前面兩篇博文已對FastDFS的安裝和配置,做了比較詳細的講解。FastDFS的基礎模塊都搭好了,現在開始測試下載。 1.1 配置客戶端 同樣的,需要修改客戶端的配置文件: /etc/f