dm-zoned

dm-zoned 裝置對映器目標將分割槽塊裝置(符合 ZBC 和 ZAC 標準的裝置)公開為常規塊裝置,不受任何寫入模式限制。實際上,它實現了一個驅動器管理的分割槽塊裝置,它向用戶(檔案系統或執行原始塊裝置訪問的應用程式)隱藏了主機管理分割槽塊裝置的順序寫入限制,並且可以緩解由於主機感知分割槽裝置上的過度隨機寫入而導致的潛在裝置端效能下降。

有關分割槽塊裝置模型及其限制的更詳細描述,請參閱(針對 SCSI 裝置)

https://www.t10.org/drafts.htm#ZBC_Family

以及(針對 ATA 裝置)

http://www.t13.org/Documents/UploadedDocuments/docs2015/di537r05-Zoned_Device_ATA_Command_Set_ZAC.pdf

dm-zoned 實現簡單,並最大限度地減少了系統開銷(CPU 和記憶體使用以及儲存容量損失)。對於一個擁有 256 MB 區域的 10TB 主機管理磁碟,每個磁碟例項的 dm-zoned 記憶體使用量最多為 4.5 MB,並且內部將僅使用 5 個區域來儲存元資料和執行回收操作。

dm-zoned 目標裝置使用 dmzadm 工具進行格式化和檢查,該工具可在以下位置獲取:

https://github.com/hgst/dm-zoned-tools

演算法

dm-zoned 實現了一種磁碟緩衝方案,用於處理對分割槽塊裝置的順序區域的非順序寫入訪問。傳統區域用於快取以及儲存內部元資料。它還可以將常規塊裝置與分割槽塊裝置一起使用;在這種情況下,常規塊裝置將在邏輯上被分割成與分割槽塊裝置大小相同的區域。這些區域將放置在分割槽塊裝置的區域之前,並將像傳統區域一樣進行處理。

裝置(或多個裝置)的區域分為 2 種類型

1) 元資料區域:這些是用於儲存元資料的傳統區域。元資料區域不作為可用容量報告給使用者。

2) 資料區域:所有剩餘區域,其中絕大多數是專門用於儲存使用者資料的順序區域。裝置的傳統區域也可用於緩衝使用者隨機寫入。這些區域中的資料可以直接對映到傳統區域,但隨後會移動到順序區域,以便傳統區域可以重複用於緩衝傳入的隨機寫入。

dm-zoned 公開了一個邏輯裝置,其扇區大小為 4096 位元組,無論所使用的後端分割槽塊裝置的物理扇區大小如何。這有助於減少管理有效塊(已寫入塊)所需的元資料量。

磁碟上的元資料格式如下

1) 找到的第一個傳統區域的第一個塊包含超級塊,該超級塊描述了磁碟上元資料塊的數量和位置。

2) 在超級塊之後,一組塊用於描述邏輯裝置塊的對映。對映按塊的塊(chunk)進行,塊大小等於分割槽塊裝置大小。對映表按塊編號索引,每個對映條目指示儲存資料塊的裝置的區域編號。每個對映條目還可以指示用於緩衝對資料區域的隨機修改的傳統區域的區域編號。

3) 在對映表之後,有一組塊用於儲存點陣圖,指示資料區域中塊的有效性。有效塊定義為已寫入且未丟棄的塊。對於緩衝資料塊,塊僅在對映該塊的資料區域或該塊的緩衝區區域中始終有效。

對於對映到傳統區域的邏輯塊,所有寫入操作都透過直接寫入該區域來處理。如果對映區域是順序區域,則僅當邏輯塊內的寫入偏移量等於順序資料區域內的寫入指標偏移量(即寫入操作與區域寫入指標對齊)時,才直接處理寫入操作。否則,寫入操作將使用緩衝區區域間接處理。在這種情況下,分配一個未使用的傳統區域並將其分配給正在訪問的塊。將塊寫入塊的緩衝區區域將自動使對映該塊的順序區域中的相同塊無效。如果順序區域的所有塊都變得無效,則該區域將被釋放,並且塊緩衝區區域將成為對映該塊的主區域,從而實現類似於常規塊裝置的本地隨機寫入效能。

讀取操作根據點陣圖提供的塊有效性資訊進行處理。有效塊從對映塊的順序區域讀取,或者如果塊被緩衝,則從分配的緩衝區區域讀取。如果訪問的塊沒有對映,或者訪問的塊無效,則讀取緩衝區將被清零,並且讀取操作終止。

一段時間後,可用傳統區域的有限數量可能會耗盡(全部用於對映塊或緩衝順序區域),並且對未緩衝塊的非對齊寫入變得不可能。為避免這種情況,回收過程定期掃描已使用的傳統區域,並嘗試透過將緩衝區區域的有效塊複製到空閒順序區域來回收最近最少使用的區域。複製完成後,塊對映將更新以指向順序區域,並且緩衝區區域被釋放以供重用。

元資料保護

為了防止在突然斷電或系統崩潰時元資料損壞,使用了兩組元資料區域。其中一組(主集)用作主要的元資料區域,而次級集用作暫存區。修改後的元資料首先寫入次級集,並透過更新次級集中的超級塊進行驗證,一個代計數器用於指示此集包含最新的元資料。此操作完成後,可以在主元資料集中進行元資料塊的原地更新。這確保了其中一組始終保持一致(所有修改都已提交或都未提交)。重新整理操作用作提交點。收到重新整理請求後,元資料修改活動將暫時阻塞(包括傳入的 BIO 處理和回收過程),並且所有髒元資料塊都將暫存並更新。然後恢復正常操作。因此,重新整理元資料只會暫時延遲寫入和丟棄請求。在執行元資料重新整理時,讀取請求可以併發處理。

如果常規裝置與分割槽塊裝置結合使用,則第三組元資料(不包含區域點陣圖)將寫入分割槽塊裝置的開頭。此元資料具有一個“0”的代計數器,在正常操作期間永遠不會更新;它僅用於識別目的。元資料的第一份和第二份副本位於常規塊裝置的開頭。

用法

分割槽塊裝置必須首先使用 dmzadm 工具進行格式化。這將分析裝置區域配置,確定元資料集在裝置上的放置位置,並初始化元資料集。

示例

dmzadm --format /dev/sdxx

如果使用兩個驅動器,則必須指定這兩個裝置,其中常規塊裝置作為第一個裝置。

示例

dmzadm --format /dev/sdxx /dev/sdyy

格式化後的裝置也可以使用 dmzadm 工具啟動。

示例

dmzadm --start /dev/sdxx /dev/sdyy

可以使用 dmsetup 的“status”回撥獲取有關區域內部佈局和當前使用情況的資訊

示例

dmsetup status /dev/dm-X

將返回一行

0 <size> zoned <nr_zones> zones <nr_unmap_rnd>/<nr_rnd> random <nr_unmap_seq>/<nr_seq> sequential

其中 <nr_zones> 是區域總數,<nr_unmap_rnd> 是未對映(即空閒)隨機區域的數量,<nr_rnd> 是隨機區域的總數,<nr_unmap_seq> 是未對映順序區域的數量,<nr_seq> 是順序區域的總數。

通常,一旦空閒隨機區域少於 50%,回收過程就會啟動。為了在此閾值之前手動啟動回收過程,可以使用“dmsetup message”功能

示例

dmsetup message /dev/dm-X 0 reclaim

將啟動回收過程,並將隨機區域移動到順序區域。