国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
新一代 你牛叉 文件系統(tǒng) btrfs 簡(jiǎn)介
您可以在 btrfs 的主頁(yè)上 [2] 看到 btrfs 的特性列表。我自作主張,將那張列表分成了四大部分。
首先是擴(kuò)展性 (scalability) 相關(guān)的特性,btrfs 最重要的設(shè)計(jì)目標(biāo)是應(yīng)對(duì)大型機(jī)器對(duì)文件系統(tǒng)的擴(kuò)展性要求。Extent,B-Tree 和動(dòng)態(tài) inode 創(chuàng)建等特性保證了 btrfs在大型機(jī)器上仍有卓越的表現(xiàn),其整體性能而不會(huì)隨著系統(tǒng)容量的增加而降低。
其次是數(shù)據(jù)一致性 (data integrity) 相關(guān)的特性。系統(tǒng)面臨不可預(yù)料的硬件故障,Btrfs 采用 COW事務(wù)技術(shù)來(lái)保證文件系統(tǒng)的一致性。 btrfs 還支持 checksum,避免了 silent corrupt的出現(xiàn)。而傳統(tǒng)文件系統(tǒng)則無(wú)法做到這一點(diǎn)。
第三是和多設(shè)備管理相關(guān)的特性。 Btrfs 支持創(chuàng)建快照 (snapshot),和克隆 (clone) 。 btrfs還能夠方便的管理多個(gè)物理設(shè)備,使得傳統(tǒng)的卷管理軟件變得多余。
最后是其他難以歸類的特性。這些特性都是比較先進(jìn)的技術(shù),能夠顯著提高文件系統(tǒng)的時(shí)間 /空間性能,包括延遲分配,小文件的存儲(chǔ)優(yōu)化,目錄索引等。
B-Tree
btrfs 文件系統(tǒng)中所有的 metadata 都由 BTree 管理。使用 BTree的主要好處在于查找,插入和刪除操作都很高效??梢哉f(shuō) BTree 是 btrfs 的核心。
一味地夸耀 BTree 很好很高效也許并不能讓人信服,但假如稍微花費(fèi)一點(diǎn)兒時(shí)間看看 ext2/3中元數(shù)據(jù)管理的實(shí)現(xiàn)方式,便可以反襯出 BTree 的優(yōu)點(diǎn)。
妨礙 ext2/3 擴(kuò)展性的一個(gè)問(wèn)題來(lái)自其目錄的組織方式。目錄是一種特殊的文件,在 ext2/3 中其內(nèi)容是一張線性表格。如圖1-1 所示 [6]:
圖 1 展示了一個(gè) ext2 目錄文件的內(nèi)容,該目錄中包含四個(gè)文件。分別是 "home1","usr","oldfile" 和"sbin" 。如果需要在該目錄中查找目錄 sbin,ext2 將遍歷前三項(xiàng),直至找到 sbin 這個(gè)字符串為止。
這種結(jié)構(gòu)在文件個(gè)數(shù)有限的情況下是比較直觀的設(shè)計(jì),但隨著目錄下文件數(shù)的增加,查找文件的時(shí)間將線性增長(zhǎng)。 2003 年,ext3設(shè)計(jì)者開(kāi)發(fā)了目錄索引技術(shù),解決了這個(gè)問(wèn)題。目錄索引使用的數(shù)據(jù)結(jié)構(gòu)就是 BTree 。如果同一目錄下的文件數(shù)超過(guò) 2K,inode 中的i_data 域指向一個(gè)特殊的 block 。在該 block 中存儲(chǔ)著目錄索引 BTree 。 BTree 的查找效率高于線性表,但為同一個(gè)元數(shù)據(jù)設(shè)計(jì)兩種數(shù)據(jù)結(jié)構(gòu)總是不太優(yōu)雅。在文件系統(tǒng)中還有很多其他的元數(shù)據(jù),用統(tǒng)一的 BTree 管理是非常簡(jiǎn)單而優(yōu)美的設(shè)計(jì)。
Btrfs 內(nèi)部所有的元數(shù)據(jù)都采用 BTree 管理,擁有良好的可擴(kuò)展性。 btrfs 內(nèi)部不同的元數(shù)據(jù)由不同的 Tree 管理。在superblock 中,有指針指向這些 BTree 的根。如圖 2 所示:
FS Tree 管理文件相關(guān)的元數(shù)據(jù),如 inode,dir 等; Chunk tree 管理設(shè)備,每一個(gè)磁盤(pán)設(shè)備都在 ChunkTree 中有一個(gè) item ; Extent Tree 管理磁盤(pán)空間分配,btrfs 每分配一段磁盤(pán)空間,便將該磁盤(pán)空間的信息插入到Extent tree 。查詢 Extent Tree 將得到空閑的磁盤(pán)空間信息; Tree of tree root 保存很多 BTree的根節(jié)點(diǎn)。比如用戶每建立一個(gè)快照,btrfs 便會(huì)創(chuàng)建一個(gè) FS Tree 。為了管理所有的樹(shù),btrfs 采用 Tree of treeroot 來(lái)保存所有樹(shù)的根節(jié)點(diǎn); checksum Tree 保存數(shù)據(jù)塊的校驗(yàn)和。
基于 Extent 的文件存儲(chǔ)
現(xiàn)代很多文件系統(tǒng)都采用了 extent 替代 block 來(lái)管理磁盤(pán)。 Extent 就是一些連續(xù)的 block,一個(gè) extent由起始的 block 加上長(zhǎng)度進(jìn)行定義。
Extent 能有效地減少元數(shù)據(jù)開(kāi)銷。為了進(jìn)一步理解這個(gè)問(wèn)題,我們還是看看 ext2 中的反面例子。
ext2/3 以 block 為基本單位,將磁盤(pán)劃分為多個(gè) block 。為了管理磁盤(pán)空間,文件系統(tǒng)需要知道哪些 block是空閑的。 Ext 使用 bitmap 來(lái)達(dá)到這個(gè)目的。 Bitmap 中的每一個(gè) bit 對(duì)應(yīng)磁盤(pán)上的一個(gè) block,當(dāng)相應(yīng) block被分配后,bitmap 中的相應(yīng) bit 被設(shè)置為 1 。這是很經(jīng)典也很清晰的一個(gè)設(shè)計(jì),但不幸的是當(dāng)磁盤(pán)容量變大時(shí),bitmap自身所占用的空間也將變大。這就導(dǎo)致了擴(kuò)展性問(wèn)題,隨著存儲(chǔ)設(shè)備容量的增加,bitmap這個(gè)元數(shù)據(jù)所占用的空間也隨之增加。而人們希望無(wú)論磁盤(pán)容量如何增加,元數(shù)據(jù)不應(yīng)該隨之線形增加,這樣的設(shè)計(jì)才具有可擴(kuò)展性。
下圖比較了 block 和 extent 的區(qū)別:
在 ext2/3 中,10 個(gè) block 需要 10 個(gè) bit 來(lái)表示;在 btrfs中則只需要一個(gè)元數(shù)據(jù)。對(duì)于大文件,extent 表現(xiàn)出了更加優(yōu)異的管理性能。
Extent 是 btrfs 管理磁盤(pán)空間的最小單位,由 extent tree 管理。 Btrfs 分配 data 或metadata 都需要查詢 extent tree 以便獲得空閑空間的信息。
動(dòng)態(tài) inode 分配
為了理解動(dòng)態(tài) inode 分配,還是需要借助 ext2/3 。下表列舉了 ext2 文件系統(tǒng)的限制:
限制
最大文件數(shù)量 文件系統(tǒng)空間大小 V / 8192
比如 100G 大小的文件系統(tǒng)中,能創(chuàng)建的文件個(gè)數(shù)最大為 131072
圖 4 顯示了 ext2 的磁盤(pán)布局:
在 ext2 中 inode 區(qū)是被預(yù)先固定分配的,且大小固定,比如一個(gè) 100G 的分區(qū)中,inode table 區(qū)中只能存放131072 個(gè) inode,這就意味著不可能創(chuàng)建超過(guò) 131072 個(gè)文件,因?yàn)槊恳粋€(gè)文件都必須有一個(gè)唯一的 inode 。
為了解決這個(gè)問(wèn)題,必須動(dòng)態(tài)分配 inode 。每一個(gè) inode 只是 BTree 中的一個(gè)節(jié)點(diǎn),用戶可以無(wú)限制地任意插入新的inode,其物理存儲(chǔ)位置是動(dòng)態(tài)分配的。所以 btrfs 沒(méi)有對(duì)文件個(gè)數(shù)的限制。
針對(duì) SSD 的優(yōu)化支持
SSD 是固態(tài)存儲(chǔ) Solid State Disk 的簡(jiǎn)稱。在過(guò)去的幾十年中,CPU/RAM等器件的發(fā)展始終遵循著摩爾定律,但硬盤(pán) HDD 的讀寫(xiě)速率卻始終沒(méi)有飛躍式的發(fā)展。磁盤(pán) IO 始終是系統(tǒng)性能的瓶頸。
SSD 采用 flash memory 技術(shù),內(nèi)部沒(méi)有磁盤(pán)磁頭等機(jī)械裝置,讀寫(xiě)速率大幅度提升。 flash memory有一些不同于 HDD 的特性。 flash 在寫(xiě)數(shù)據(jù)之前必須先執(zhí)行擦除操作;其次,flash對(duì)擦除操作的次數(shù)有一定的限制,在目前的技術(shù)水平下,對(duì)同一個(gè)數(shù)據(jù)單元最多能進(jìn)行約 100 萬(wàn)次擦除操作,因此,為了延長(zhǎng) flash的壽命,應(yīng)該將寫(xiě)操作平均到整個(gè) flash 上。
SSD 在硬件內(nèi)部的微代碼中實(shí)現(xiàn)了 wear leveling 等分布寫(xiě)操作的技術(shù),因此系統(tǒng)無(wú)須再使用特殊的 MTD 驅(qū)動(dòng)和 FTL層。雖然 SSD 在硬件層面做了很多努力,但畢竟還是有限。文件系統(tǒng)針對(duì) SSD 的特性做優(yōu)化不僅能提高 SSD的使用壽命,而且能提高讀寫(xiě)性能。 Btrfs 是少數(shù)專門(mén)對(duì) SSD 進(jìn)行優(yōu)化的文件系統(tǒng)。 btrfs 用戶可以使用 mount 參數(shù)打開(kāi)對(duì)SSD 的特殊優(yōu)化處理。
Btrfs 的 COW 技術(shù)從根本上避免了對(duì)同一個(gè)物理單元的反復(fù)寫(xiě)操作。如果用戶打開(kāi)了 SSD 優(yōu)化選項(xiàng),btrfs將在底層的塊空間分配策略上進(jìn)行優(yōu)化:將多次磁盤(pán)空間分配請(qǐng)求聚合成一個(gè)大小為 2M 的連續(xù)的塊。大塊連續(xù)地址的 IO 能夠讓固化在 SSD內(nèi)部的微代碼更好的進(jìn)行讀寫(xiě)優(yōu)化,從而提高 IO 性能。
COW 事務(wù)
理解 COW 事務(wù),必須首先理解 COW 和事務(wù)這兩個(gè)術(shù)語(yǔ)。
什么是 COW?
所謂 COW,即每次寫(xiě)磁盤(pán)數(shù)據(jù)時(shí),先將更新數(shù)據(jù)寫(xiě)入一個(gè)新的 block,當(dāng)新數(shù)據(jù)寫(xiě)入成功之后,再更新相關(guān)的數(shù)據(jù)結(jié)構(gòu)指向新 block。
什么是事務(wù)?
COW 只能保證單一數(shù)據(jù)更新的原子性。但文件系統(tǒng)中很多操作需要更新多個(gè)不同的元數(shù)據(jù),比如創(chuàng)建文件需要修改以下這些元數(shù)據(jù):
修改 extent tree,分配一段磁盤(pán)空間
創(chuàng)建一個(gè)新的 inode,并插入 FS Tree 中
增加一個(gè)目錄項(xiàng),插入到 FS Tree 中
任何一個(gè)步驟出錯(cuò),文件便不能創(chuàng)建成功,因此可以定義為一個(gè)事務(wù)。
下面將演示一個(gè) COW 事務(wù)。
A 是 FS Tree 的根節(jié)點(diǎn),新的 inode 的信息將被插入節(jié)點(diǎn) C 。首先,btrfs 將 inode 插入一個(gè)新分配的block C ’中,并修改上層節(jié)點(diǎn) B,使其指向新的 block C ’;修改 B 也將引發(fā) COW,以此類推,引發(fā)一個(gè)連鎖反應(yīng),直到最頂層的Root A 。當(dāng)整個(gè)過(guò)程結(jié)束后,新節(jié)點(diǎn) A ’變成了 FS Tree 的根。但此時(shí)事務(wù)并未結(jié)束,superblock 依然指向 A 。
接下來(lái),修改目錄項(xiàng)(E 節(jié)點(diǎn)),同樣引發(fā)這一過(guò)程,從而生成新的根節(jié)點(diǎn) A ’’。
此時(shí),inode 和目錄項(xiàng)都已經(jīng)寫(xiě)入磁盤(pán),可以認(rèn)為事務(wù)已經(jīng)結(jié)束。 btrfs 修改 superblock,使其指向 A’’,如下圖所示:
COW 事務(wù)能夠保證文件系統(tǒng)的一致性,并且系統(tǒng) Reboot 之后不需要執(zhí)行 fsck 。因?yàn)?superblock 要么指向新的 A’’,要么指向 A,無(wú)論哪個(gè)都是一致的數(shù)據(jù)。
Checksum
Checksum 技術(shù)保證了數(shù)據(jù)的可靠性,避免 silent corruption現(xiàn)象。由于硬件原因,從磁盤(pán)上讀出的數(shù)據(jù)會(huì)出錯(cuò)。比如 block A 中存放的數(shù)據(jù)為 0x55,但讀取出來(lái)的數(shù)據(jù)變是0x54,因?yàn)樽x取操作并未報(bào)錯(cuò),所以這種錯(cuò)誤不能被上層軟件所察覺(jué)。
解決這個(gè)問(wèn)題的方法是保存數(shù)據(jù)的校驗(yàn)和,在讀取數(shù)據(jù)后檢查校驗(yàn)和。如果不符合,便知道數(shù)據(jù)出現(xiàn)了錯(cuò)誤。
ext2/3 沒(méi)有校驗(yàn)和,對(duì)磁盤(pán)完全信任。而不幸的是,磁盤(pán)的錯(cuò)誤始終存在,不僅發(fā)生在廉價(jià)的 IDE 硬盤(pán)上,昂貴的 RAID 也存在silent corruption 問(wèn)題。而且隨著存儲(chǔ)網(wǎng)絡(luò)的發(fā)展,即使數(shù)據(jù)從磁盤(pán)讀出正確,也很難確保能夠安全地穿越網(wǎng)絡(luò)設(shè)備。
btrfs 在讀取數(shù)據(jù)的同時(shí)會(huì)讀取其相應(yīng)的 checksum 。如果最終從磁盤(pán)讀取出來(lái)的數(shù)據(jù)和 checksum 不相同,btrfs會(huì)首先嘗試讀取數(shù)據(jù)的鏡像備份,如果數(shù)據(jù)沒(méi)有鏡像備份,btrfs 將返回錯(cuò)誤。寫(xiě)入磁盤(pán)數(shù)據(jù)之前,btrfs 計(jì)算數(shù)據(jù)的 checksum。然后將 checksum 和數(shù)據(jù)同時(shí)寫(xiě)入磁盤(pán)。
Btrfs 采用單獨(dú)的 checksum Tree 來(lái)管理數(shù)據(jù)塊的校驗(yàn)和,把 checksum 和 checksum所保護(hù)的數(shù)據(jù)塊分離開(kāi),從而提供了更嚴(yán)格的保護(hù)。假如在每個(gè)數(shù)據(jù) block 的 header 中加入一個(gè)域保存 checksum,那么這個(gè)數(shù)據(jù)block 就成為一個(gè)自己保護(hù)自己的結(jié)構(gòu)。這種結(jié)構(gòu)下有一種錯(cuò)誤無(wú)法檢測(cè)出來(lái),比如本來(lái)文件系統(tǒng)打算從磁盤(pán)上讀 block A,但返回了 blockB,由于 checksum 在 block 內(nèi)部,因此 checksum 依舊是正確的。 btrfs 采用 checksum tree來(lái)保存數(shù)據(jù)塊的 checksum,避免了上述問(wèn)題。
Btrfs 采用 crc32 算法計(jì)算 checksum,在將來(lái)的開(kāi)發(fā)中會(huì)支持其他類型的校驗(yàn)算法。為了提高效率,btrfs將寫(xiě)數(shù)據(jù)和 checksum 的工作分別用不同的內(nèi)核線程并行執(zhí)行。
每個(gè) Unix管理員都曾面臨為用戶和各種應(yīng)用分配磁盤(pán)空間的任務(wù)。多數(shù)情況下,人們無(wú)法事先準(zhǔn)確地估計(jì)一個(gè)用戶或者應(yīng)用在未來(lái)究竟需要多少磁盤(pán)空間。磁盤(pán)空間被用盡的情況經(jīng)常發(fā)生,此時(shí)人們不得不試圖增加文件系統(tǒng)空間。傳統(tǒng)的 ext2/3 無(wú)法應(yīng)付這種需求。
很多卷管理軟件被設(shè)計(jì)出來(lái)滿足用戶對(duì)多設(shè)備管理的需求,比如 LVM 。 Btrfs集成了卷管理軟件的功能,一方面簡(jiǎn)化了用戶命令;另一方面提高了效率。
多設(shè)備管理
Btrfs 支持動(dòng)態(tài)添加設(shè)備。用戶在系統(tǒng)中增加新的磁盤(pán)之后,可以使用 btrfs 的命令將該設(shè)備添加到文件系統(tǒng)中。
為了靈活利用設(shè)備空間,Btrfs 將磁盤(pán)空間劃分為多個(gè) chunk 。每個(gè) chunk 可以使用不同的磁盤(pán)空間分配策略。比如某些chunk 只存放 metadata,某些 chunk 只存放數(shù)據(jù)。一些 chunk 可以配置為 mirror,而另一些 chunk則可以配置為 stripe 。這為用戶提供了非常靈活的配置可能性。
Subvolume
Subvolume 是很優(yōu)雅的一個(gè)概念。即把文件系統(tǒng)的一部分配置為一個(gè)完整的子文件系統(tǒng),稱之為 subvolume 。
采用subvolume,一個(gè)大的文件系統(tǒng)可以被劃分為多個(gè)子文件系統(tǒng),這些子文件系統(tǒng)共享底層的設(shè)備空間,在需要磁盤(pán)空間時(shí)便從底層設(shè)備中分配,類似應(yīng)用程序調(diào)用 malloc() 分配內(nèi)存一樣??梢苑Q之為存儲(chǔ)池。這種模型有很多優(yōu)點(diǎn),比如可以充分利用 disk 的帶寬,可以簡(jiǎn)化磁盤(pán)空間的管理等。
所謂充分利用 disk 的帶寬,指文件系統(tǒng)可以并行讀寫(xiě)底層的多個(gè) disk,這是因?yàn)槊總€(gè)文件系統(tǒng)都可以訪問(wèn)所有的 disk。傳統(tǒng)的文件系統(tǒng)不能共享底層的 disk 設(shè)備,無(wú)論是物理的還是邏輯的,因此無(wú)法做到并行讀寫(xiě)。
所謂簡(jiǎn)化管理,是相對(duì)于 LVM 等卷管理軟件而言。采用存儲(chǔ)池模型,每個(gè)文件系統(tǒng)的大小都可以自動(dòng)調(diào)節(jié)。而使用LVM,如果一個(gè)文件系統(tǒng)的空間不夠了,該文件系統(tǒng)并不能自動(dòng)使用其他磁盤(pán)設(shè)備上的空閑空間,而必須使用 LVM 的管理命令手動(dòng)調(diào)節(jié)。
Subvolume 可以作為根目錄掛載到任意 mount 點(diǎn)。 subvolume 是非常有趣的一個(gè)特性,有很多應(yīng)用。
假如管理員只希望某些用戶訪問(wèn)文件系統(tǒng)的一部分,比如希望用戶只能訪問(wèn) /var/test/ 下面的所有內(nèi)容,而不能訪問(wèn) /var/下面其他的內(nèi)容。那么便可以將 /var/test 做成一個(gè) subvolume 。 /var/test 這個(gè) subvolume便是一個(gè)完整的文件系統(tǒng),可以用 mount 命令掛載。比如掛載到 /test 目錄下,給用戶訪問(wèn) /test 的權(quán)限,那么用戶便只能訪問(wèn)/var/test 下面的內(nèi)容了。
快照和克隆
快照是對(duì)文件系統(tǒng)某一時(shí)刻的完全備份。建立快照之后,對(duì)文件系統(tǒng)的修改不會(huì)影響快照中的內(nèi)容。這是非常有用的一種技術(shù)。
比如數(shù)據(jù)庫(kù)備份。假如在時(shí)間點(diǎn)T1,管理員決定對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份,那么他必須先停止數(shù)據(jù)庫(kù)。備份文件是非常耗時(shí)的操作,假如在備份過(guò)程中某個(gè)應(yīng)用程序修改了數(shù)據(jù)庫(kù)的內(nèi)容,那么將無(wú)法得到一個(gè)一致性的備份。因此在備份過(guò)程中數(shù)據(jù)庫(kù)服務(wù)必須停止,對(duì)于某些關(guān)鍵應(yīng)用這是不能允許的。
利用快照,管理員可以在時(shí)間點(diǎn) T1將數(shù)據(jù)庫(kù)停止,對(duì)系統(tǒng)建立一個(gè)快照。這個(gè)過(guò)程一般只需要幾秒鐘,然后就可以立即重新恢復(fù)數(shù)據(jù)庫(kù)服務(wù)。此后在任何時(shí)候,管理員都可以對(duì)快照的內(nèi)容進(jìn)行備份操作,而此時(shí)用戶對(duì)數(shù)據(jù)庫(kù)的修改不會(huì)影響快照中的內(nèi)容。當(dāng)備份完成,管理員便可以刪除快照,釋放磁盤(pán)空間。
快照一般是只讀的,當(dāng)系統(tǒng)支持可寫(xiě)快照,那么這種可寫(xiě)快照便被稱為克隆??寺〖夹g(shù)也有很多應(yīng)用。比如在一個(gè)系統(tǒng)中安裝好基本的軟件,然后為不同的用戶做不同的克隆,每個(gè)用戶使用自己的克隆而不會(huì)影響其他用戶的磁盤(pán)空間。非常類似于虛擬機(jī)。
Btrfs 支持 snapshot 和 clone 。這個(gè)特性極大地增加了 btrfs的使用范圍,用戶不需要購(gòu)買和安裝昂貴并且使用復(fù)雜的卷管理軟件。下面簡(jiǎn)要介紹一下 btrfs 實(shí)現(xiàn)快照的基本原理。
如前所述 Btrfs 采用 COW 事務(wù)技術(shù),從圖 1-10 可以看到,COW 事務(wù)結(jié)束后,如果不刪除原來(lái)的節(jié)點(diǎn) A,C,E,那么A,C,E,D,F 依然完整的表示著事務(wù)開(kāi)始之前的文件系統(tǒng)。這就是 snapshot 實(shí)現(xiàn)的基本原理。
Btrfs 采用引用計(jì)數(shù)決定是否在事務(wù) commit 之后刪除原有節(jié)點(diǎn)。對(duì)每一個(gè)節(jié)點(diǎn),btrfs維護(hù)一個(gè)引用計(jì)數(shù)。當(dāng)該節(jié)點(diǎn)被別的節(jié)點(diǎn)引用時(shí),該計(jì)數(shù)加一,當(dāng)該節(jié)點(diǎn)不再被別的節(jié)點(diǎn)引用時(shí),該計(jì)數(shù)減一。當(dāng)引用計(jì)數(shù)歸零時(shí),該節(jié)點(diǎn)被刪除。對(duì)于普通的Tree Root, 引用計(jì)數(shù)在創(chuàng)建時(shí)被加一,因?yàn)?Superblock 會(huì)引用這個(gè) Root block。很明顯,初始情況下這棵樹(shù)中的所有其他節(jié)點(diǎn)的引用計(jì)數(shù)都為一。當(dāng) COW 事務(wù) commit 時(shí),superblock 被修改指向新的 Root A’’,原來(lái) Root block A 的引用計(jì)數(shù)被減一,變?yōu)榱悖虼?A 節(jié)點(diǎn)被刪除。 A 節(jié)點(diǎn)的刪除會(huì)引發(fā)其子孫節(jié)點(diǎn)的引用計(jì)數(shù)也減一,圖1-10 中的 B,C 節(jié)點(diǎn)的引用計(jì)數(shù)因此也變成了 0,從而被刪除。 D,E 節(jié)點(diǎn)在 COW 時(shí),因?yàn)楸?A’’所引用,計(jì)數(shù)器加一,因此計(jì)數(shù)器這時(shí)并未歸零,從而沒(méi)有被刪除。
創(chuàng)建 Snapshot 時(shí),btrfs 將的 Root A 節(jié)點(diǎn)復(fù)制到 sA,并將 sA 的引用計(jì)數(shù)設(shè)置為 2 。在事務(wù)commit 的時(shí)候,sA 節(jié)點(diǎn)的引用計(jì)數(shù)不會(huì)歸零,從而不會(huì)被刪除,因此用戶可以繼續(xù)通過(guò) Root sA 訪問(wèn) snapshot 中的文件。
軟件 RAID
RAID 技術(shù)有很多非常吸引人的特性,比如用戶可以將多個(gè)廉價(jià)的 IDE 磁盤(pán)組合為 RAID0 陣列,從而變成了一個(gè)大容量的磁盤(pán);RAID1 和更高級(jí)的 RAID 配置還提供了數(shù)據(jù)冗余保護(hù),從而使得存儲(chǔ)在磁盤(pán)中的數(shù)據(jù)更加安全。
Btrfs 很好的支持了軟件 RAID,RAID 種類包括 RAID0,RAID1 和 RAID10.
Btrfs 缺省情況下對(duì) metadata 進(jìn)行 RAID1 保護(hù)。前面已經(jīng)提及 btrfs 將設(shè)備空間劃分為 chunk,一些chunk 被配置為 metadata,即只存儲(chǔ) metadata 。對(duì)于這類 chunk,btrfs 將 chunk 分成兩個(gè)條帶,寫(xiě)metadata 的時(shí)候,會(huì)同時(shí)寫(xiě)入兩個(gè)條帶內(nèi),從而實(shí)現(xiàn)對(duì) metadata 的保護(hù)。
Btrfs 主頁(yè)上羅列的其他特性不容易分類,這些特性都是現(xiàn)代文件系統(tǒng)中比較先進(jìn)的技術(shù),能夠提高文件系統(tǒng)的時(shí)間或空間效率。
延遲分配(Delay allocation)
延遲分配技術(shù)能夠減少磁盤(pán)碎片。在 Linux 內(nèi)核中,為了提高效率,很多操作都會(huì)延遲。
在文件系統(tǒng)中,小塊空間頻繁的分配和釋放會(huì)造成碎片。延遲分配是這樣一種技術(shù),當(dāng)用戶需要磁盤(pán)空間時(shí),先將數(shù)據(jù)保存在內(nèi)存中。并將磁盤(pán)分配需求發(fā)送給磁盤(pán)空間分配器,磁盤(pán)空間分配器并不立即分配真正的磁盤(pán)空間。只是記錄下這個(gè)請(qǐng)求便返回。
磁盤(pán)空間分配請(qǐng)求可能很頻繁,所以在延遲分配的一段時(shí)間內(nèi),磁盤(pán)分配器可以收到很多的分配請(qǐng)求,一些請(qǐng)求也許可以合并,一些請(qǐng)求在這段延遲期間甚至可能被取消。通過(guò)這樣的“等待”,往往能夠減少不必要的分配,也有可能將多個(gè)小的分配請(qǐng)求合并為一個(gè)大的請(qǐng)求,從而提高 IO 效率。
Inline file
系統(tǒng)中往往存在大量的小文件,比如幾百個(gè)字節(jié)或者更小。如果為其分配單獨(dú)的數(shù)據(jù) block,便會(huì)引起內(nèi)部碎片,浪費(fèi)磁盤(pán)空間。 btrfs將小文件的內(nèi)容保存在元數(shù)據(jù)中,不再額外分配存放文件數(shù)據(jù)的磁盤(pán)塊。改善了內(nèi)部碎片問(wèn)題,也增加了文件的訪問(wèn)效率。
上圖顯示了一個(gè) BTree 的葉子節(jié)點(diǎn)。葉子中有兩個(gè) extent data item 元數(shù)據(jù),分別用來(lái)表示文件 file1 和file2 所使用的磁盤(pán)空間。
假設(shè) file1 的大小僅為 15 個(gè)字節(jié); file2 的大小為 1M 。如圖所示,file2 采用普通的 extent表示方法:extent2 元數(shù)據(jù)指向一段 extent,大小為 1M,其內(nèi)容便是 file2 文件的內(nèi)容。
而對(duì)于 file1, btrfs 會(huì)把其文件內(nèi)容內(nèi)嵌到元數(shù)據(jù) extent1 中。如果不采用 inline file技術(shù)。如虛線所示,extent1 指向一個(gè)最小的 extent,即一個(gè) block,但 file1 有 15個(gè)字節(jié),其余的空間便成為了碎片空間。
采用 inline 技術(shù),讀取 file1 時(shí)只需要讀取元數(shù)據(jù) block,而無(wú)需先讀取 extent1這個(gè)元數(shù)據(jù),再讀取真正存放文件內(nèi)容的 block,從而減少了磁盤(pán) IO 。
得益于 inline file 技術(shù),btrfs 處理小文件的效率非常高,也避免了磁盤(pán)碎片問(wèn)題。
目錄索引 Directory index
當(dāng)一個(gè)目錄下的文件數(shù)目巨大時(shí),目錄索引可以顯著提高文件搜索時(shí)間。 Btrfs 本身采用 BTree存儲(chǔ)目錄項(xiàng),所以在給定目錄下搜索文件的效率是非常高的。
然而,btrfs 使用 BTree 管理目錄項(xiàng)的方式無(wú)法同時(shí)滿足 readdir 的需求。 readdir 是 POSIX 標(biāo)準(zhǔn)API,它要求返回指定目錄下的所有文件,并且特別的,這些文件要按照 inode number 排序。而 btrfs 目錄項(xiàng)插入 BTree 時(shí)的Key 并不是 Inode number,而是根據(jù)文件名計(jì)算的一個(gè) hash 值。這種方式在查找一個(gè)特定文件時(shí)非常高效,但卻不適于readdir 。為此,btrfs 在每次創(chuàng)建新的文件時(shí),除了插入以 hash 值為 Key的目錄項(xiàng)外,還同時(shí)插入另外一種目錄項(xiàng)索引,該目錄項(xiàng)索引的 KEY 以 sequence number 作為 BTree 的鍵值。這個(gè)sequence number 在每次創(chuàng)建新文件時(shí)線性增加。因?yàn)?Inode number 也是每次創(chuàng)建新文件時(shí)增加的,所以 sequencenumber 和 inode number 的順序相同。以這種 sequence number 作為 KEY 在 BTree中查找便可以方便的得到一個(gè)以 inode number 排序的文件列表。
另外以 sequence number 排序的文件往往在磁盤(pán)上的位置也是相鄰的,所以以 sequence number為序訪問(wèn)大量文件會(huì)獲得更好的 IO 效率。
壓縮
大家都曾使用過(guò) zip,winrar 等壓縮軟件,將一個(gè)大文件進(jìn)行壓縮可以有效節(jié)約磁盤(pán)空間。 Btrfs 內(nèi)置了壓縮功能。
通常人們認(rèn)為將數(shù)據(jù)寫(xiě)入磁盤(pán)之前進(jìn)行壓縮會(huì)占用很多的 CPU 計(jì)算時(shí)間,必然降低文件系統(tǒng)的讀寫(xiě)效率。但隨著硬件技術(shù)的發(fā)展,CPU處理時(shí)間和磁盤(pán) IO 時(shí)間的差距不斷加大。在某些情況下,花費(fèi)一定的 CPU 時(shí)間和一些內(nèi)存,但卻能大大節(jié)約磁盤(pán) IO的數(shù)量,這反而能夠增加整體的效率。
比如一個(gè)文件不經(jīng)過(guò)壓縮的情況下需要 100 次磁盤(pán) IO 。但花費(fèi)少量 CPU 時(shí)間進(jìn)行壓縮后,只需要 10 次磁盤(pán) IO就可以將壓縮后的文件寫(xiě)入磁盤(pán)。在這種情況下,IO 效率反而提高了。當(dāng)然,這取決于壓縮率。目前 btrfs 采用 zlib 提供的DEFALTE/INFLATE 算法進(jìn)行壓縮和解壓。在將來(lái),btrfs 應(yīng)該可以支持更多的壓縮算法,滿足不同用戶的不同需求。
目前 btrfs的壓縮特性還存在一些不足,當(dāng)使用壓縮后,整個(gè)文件系統(tǒng)下的所有文件都將被壓縮,但用戶可能需要更細(xì)粒度的控制,比如針對(duì)不同的目錄采用不同的壓縮算法,或者禁止壓縮。我相信,btrfs 開(kāi)發(fā)團(tuán)隊(duì)將在今后的版本中解決這個(gè)問(wèn)題。
對(duì)于某些類型的文件,比如 jpeg 文件,已經(jīng)無(wú)法再進(jìn)行壓縮。嘗試對(duì)其壓縮將純粹浪費(fèi)CPU。為此,當(dāng)對(duì)某文件的若干個(gè)block壓縮后發(fā)現(xiàn)壓縮率不佳,btrfs 將不會(huì)再對(duì)文件的其余部分進(jìn)行壓縮操作。這個(gè)特性在某種程度上提高了文件系統(tǒng)的IO效率。
預(yù)分配
很多應(yīng)用程序有預(yù)先分配磁盤(pán)空間的需要。他們可以通過(guò) posix_fallocate接口告訴文件系統(tǒng)在磁盤(pán)上預(yù)留一部分空間,但暫時(shí)并不寫(xiě)入數(shù)據(jù)。如果底層文件系統(tǒng)不支持 fallocate,那么應(yīng)用程序只有使用 write預(yù)先寫(xiě)一些無(wú)用信息以便為自己預(yù)留足夠的磁盤(pán)空間。
由文件系統(tǒng)來(lái)支持預(yù)留空間更加有效,而且能夠減少磁盤(pán)碎片,因?yàn)樗械目臻g都是一次分配,因而更有可能使用連續(xù)的空間。 Btrfs 支持posix_fallocate 。
至此,我們對(duì) btrfs 的很多特性進(jìn)行了較為詳細(xì)的探討,但 btrfs 能提供的特性卻并不止這些。 btrfs正處于試驗(yàn)開(kāi)發(fā)階段,還將有更多的特性。
Btrfs 也有一個(gè)重要的缺點(diǎn),當(dāng) BTree 中某個(gè)節(jié)點(diǎn)出現(xiàn)錯(cuò)誤時(shí),文件系統(tǒng)將失去該節(jié)點(diǎn)之下的所有的文件信息。而 ext2/3卻避免了這種被稱為”錯(cuò)誤擴(kuò)散”的問(wèn)題。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux下ext4和ext3的比較
Linux文件系統(tǒng)介紹: Ext、XFS、Btrfs等, 選擇適合自己的文件系統(tǒng)
IT牛人博客聚合
如何選擇文件系統(tǒng):EXT4、Btrfs 和XFS
Linux 3.6:更優(yōu)秀的虛擬化平臺(tái)
EXT4、XFS、JFS介紹
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服