<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          LWN:Btrfs如何支持zoned block device!

          共 4124字,需瀏覽 9分鐘

           ·

          2021-05-23 03:09

          關(guān)注了就能看到更多這么棒的文章哦~

          Btrfs on zoned block devices

          April 19, 2021
          This article was contributed by Marta Rybczyńska
          DeepL assisted translation
          https://lwn.net/Articles/853308/

          zoned block devices 設(shè)備有一些不為人知的特點(diǎn),都是為了提高存儲密度而做出的妥協(xié)。這些設(shè)備都會被劃分為若干個區(qū)域,其中一些區(qū)域(或全部區(qū)域)的寫入操作不能支持隨機(jī)訪問。也就是說,這些 "順序?qū)懭? 的區(qū)域只能按順序依次寫入,從第一個 block 直到最后一個 block。這種限制給文件系統(tǒng)帶來了新的挑戰(zhàn),因?yàn)槲募到y(tǒng)在設(shè)計(jì)時通常假定存儲 block 都可以按任何順序來寫入。因此,Linux 中主流文件系統(tǒng)對 zoned-device 的支持遲遲沒有出現(xiàn)。不過,隨著 Linux 5.12 中 Btrfs 增加了對 zoned block device 的支持,這種情況正在發(fā)生變化。

          要想覆蓋掉某個 zoned drive(驅(qū)動器)的順序?qū)懭雲(yún)^(qū)的數(shù)據(jù),唯一方法是將寫指針重置來指向到該 zone 的開頭為止,這個操作就相當(dāng)于擦除了該 zone 的全部內(nèi)容。此外,隨機(jī)讀取訪問是完全支持的。許多 zoned device 還提供一些支持隨機(jī)讀寫操作的 "常規(guī)(conventional)" zone。zoned device 最早是以片狀磁記錄(SMR, shingled magnetic recording)驅(qū)動器的形式出現(xiàn)的,內(nèi)核對這些設(shè)備有一些底層支持。也存在一些使用 flash 存儲的 zoned device,這些都是在權(quán)衡靈活性以及更低硬件復(fù)雜性這兩個因素而來的。這些設(shè)備以 the Zoned Namespaces (ZNS) command set 命令集的形式被添加到 NVMe 標(biāo)準(zhǔn)之中了,Linux 從 5.9 版本開始已經(jīng)支持這些設(shè)備。

          在 Linux 文件系統(tǒng)中支持 zoned device 的工作已經(jīng)進(jìn)行了好幾年。Copy-on-write 的文件系統(tǒng)應(yīng)該更容易適應(yīng)這種硬件,因?yàn)檫@些文件系統(tǒng)在設(shè)計(jì)時就希望避免對數(shù)據(jù) block 進(jìn)行覆蓋寫入。在現(xiàn)有的 Linux 文件系統(tǒng)中,F(xiàn)2FS 已經(jīng)支持 zoned device,支持在這種設(shè)備上進(jìn)行正常的操作(但要求驅(qū)動器至少提供一個 conventional zone)。此外,zonefs,也就是一個用于 zoned device 的特殊文件系統(tǒng),也被合入 5.6 內(nèi)核了。使用 zonefs 需要相關(guān)的應(yīng)用程序也專門經(jīng)過適配,因?yàn)樵撐募到y(tǒng)不支持創(chuàng)建普通文件。然而,有些類型的應(yīng)用程序確實(shí)很適合這種模式,例如那些 log 日志類型的數(shù)據(jù)。

          近年來,更多的主流文件系統(tǒng)中對 zoned device 的支持也有了一些進(jìn)展。Btrfs 就是其中之一,至少從 2019 年開始就有相關(guān)的工作在進(jìn)行了,當(dāng)時 Noahiro Aota 在 2019 年的 Linux Storage, Filesystem, and Memory-Management Summit 峰會上介紹了這項(xiàng)工作的狀況。此后,他一直在繼續(xù)這項(xiàng)工作,最終將修改到第 15 版的 patch 合入到了 5.12 中。

          Changing Btrfs

          要支持 zoned device,需要改變文件系統(tǒng)的 structure 在磁盤上的組織方式,因?yàn)橐话銇碚f是無法覆蓋現(xiàn)有數(shù)據(jù)的。這也就意味著,那些隨時間變化的數(shù)據(jù)結(jié)構(gòu)必須要放置在傳統(tǒng)的 conventional zone 中,或者采用一種不要求它們固定在某個位置的方式來實(shí)現(xiàn)。

          在 Btrfs 中唯一存放在磁盤上固定位置的 structure 就是超級塊(superblock),它可能有最多兩個副本。在 zoned devices 的情況下一個簡單的解決方案就是要求超級塊及其副本存放在 conventional zone 之中。然而,在現(xiàn)有的許多設(shè)備上,第二個副本規(guī)定的位置位于一個 sequencial zone 之內(nèi)。此外,人們也希望支持那些沒有 conventional zone 的設(shè)備也應(yīng)該得到支持。由于這些原因,Aota 實(shí)現(xiàn)了一個基于 log 的超級塊方案,將兩個 zone 作為循環(huán)緩沖區(qū)(circular buffer)來防止突然掉電引起故障。文件系統(tǒng)會將要更新的超級塊內(nèi)容按順序?qū)懙降谝粋€ zone 里,當(dāng)?shù)谝粋€ zone 寫滿了之后,就切換到第二個 zone,然后就可以安全地對第一個 zone 進(jìn)行重置(reset)了。

          另一個需要改變的數(shù)據(jù)結(jié)構(gòu)是 tree log(樹狀日志)。這個 log 中所用到的 block 是和其他類型的 metadata 元數(shù)據(jù) block 一起分配的。由于 tree log 并沒有跟其他元數(shù)據(jù)在相同時間寫入,因此這種方法會產(chǎn)生非順序?qū)懭?。解決方案就是將 tree log 與其他 metadata 元數(shù)據(jù)分開,然后每個 data stream 可以單獨(dú)且順序地寫入。

          在底層實(shí)現(xiàn)中還修改了 Btrfs chunks(也稱為 block groups),這是一個 Btrfs 數(shù)據(jù)結(jié)構(gòu),代表磁盤上一批 data block。在 zoned Btrfs 的情況下,修改了默認(rèn)的 chunk size,從而使得它可以與 zone size 一致。為了滿足 zoned-device 的要求,chunk 中 block 的分配方式也進(jìn)行了修改:需要從 chunk 的開頭來按順序依次分配這些 block。如果位于分配指針之后的 block 被釋放了,后續(xù)的分配中也會忽略這些 block。因此,這些 block 就總是按順序分配的。只有當(dāng)某個 chunk 中的所有 block 都被釋放后,該 chunk 的區(qū)域才允許被重新使用(reset)。

          除了 data-layout(數(shù)據(jù)的位置分布)相關(guān)修改之外,Btrfs 在寫入底層的 zone device 的時候不會使用普通的 write 操作,而是使用 “zone append” (也就是 REQ_OP_ZONE_APPEND 這個 block-device 操作)來寫入。這個操作使用時需要指定該寫入哪個 zone,但并不需要寫指針,而它的返回值就是所寫入的 block 的地址。這意味著各個數(shù)據(jù)結(jié)構(gòu)的寫入順序并不重要了,也不需要 block-groupd lock 了。Aota 在 patch 的介紹中提到的寫入速度是 4KB 隨機(jī)寫入的 36%。

          通過這組 patch set,Btrfs 就可以支持具有 ZNS 功能的 NVMe 硬盤,并且 sd 這個驅(qū)動程序可以為 SAS 和 SATA 硬盤來提供 zoned command set 命令集的模擬支持。

          How it works in 5.12

          目前的 zoned-device 支持方式有一些限制,以及要進(jìn)一步改進(jìn)的地方。大概的改進(jìn)清單記錄在 5.12 的 merge request 中,而完整的改進(jìn)列表位于 patch 的說明中。

          用戶可能會碰到的第一個問題是,5.12 只支持 single 這一種 Btrfs profile。這意味著不支持?jǐn)?shù)據(jù)復(fù)制(data duplication)和 RAID 等功能。支持其他 profile 的難點(diǎn)在于不同 zone 中相同數(shù)據(jù)位于不同的邏輯地址上。Aota 在 patch 說明中給出的例子是 DUP profile(duplicating data)。在這種情況下,當(dāng)文件系統(tǒng)發(fā)出 append 命令時,兩個 zone 可能寫到不同的偏移位置。

          系統(tǒng)管理員還應(yīng)該注意,如果一個 volume 包含多個 zoned disks 磁盤,那么所有 disk 中的 zone size 需要是一樣的。

          目前版本的 btrfs-progs 工具還不支持 zoned device,但在 Aota 的代碼倉庫中可以獲取擁有相應(yīng)功能的代碼 branch。

          我測試了一個 zoned Btrfs 文件系統(tǒng),以及一個普通的 Btrfs(不是 zoned device 類型),并且是在同一個 SATA 硬盤上,使用了相同大小的磁盤分區(qū)(partition)。這里的 zoned device 是模擬出來的(emulated)。要想創(chuàng)建一個 zoned Btrfs 文件系統(tǒng),就需要使用 Aota 版本的 mkfs.btrfs 工具新增的 -Ozoned 這個選項(xiàng),同時要把數(shù)據(jù)和 metadata 元數(shù)據(jù)都強(qiáng)制放到 "single" profile 中。

          mkfs.btrfs /dev/sdb1 -O zoned -d single -m single

          這兩個文件系統(tǒng)在基本來說表現(xiàn)一樣,并且性能也大致相同。Btrfs 的功能,如創(chuàng)建快照 snapshot 等,在 zoned 和 non-zoned 的設(shè)備上也都能正常工作。唯一發(fā)現(xiàn)的區(qū)別是在 zoned 文件系統(tǒng)上使用了更多的空間,這也是預(yù)料之中的。

          Conclusions

          zoned block device 的行為與傳統(tǒng)的設(shè)備很不一樣,所以文件系統(tǒng)需要改變數(shù)據(jù) layout 來支持這些設(shè)備,并且這些開發(fā)工作耗費(fèi)了好幾個月。Btrfs 現(xiàn)在已經(jīng)有了基本的支持,所以感興趣的用戶可以測試一下。然而,這種支持有其局限性,我們可以期待在后續(xù)內(nèi)核版本中會增加更多功能。

          全文完
          LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。

          歡迎分享、轉(zhuǎn)載及基于現(xiàn)有協(xié)議再創(chuàng)作~

          長按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~



          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色多多在线网址 | 青青草视频无码 | 成人毛片18女人毛片免费看麻豆 | 天天射天天日天天干天天操 | 亚洲激情久久 |