dm-vdo

dm-vdo (虛擬資料最佳化器) 裝置對映器目標提供塊級重複資料刪除、壓縮和精簡配置。作為裝置對映器目標,它能夠為儲存棧新增這些功能,並與任何檔案系統相容。vdo 目標不提供資料損壞保護,而是依賴於其下方儲存的完整性保護。強烈建議使用 lvm 來管理 vdo 卷。請參閱 lvmvdo(7)。

使用者空間元件

格式化 vdo 卷需要使用“vdoformat”工具,該工具可在以下地址獲取:

https://github.com/dm-vdo/vdo/

在大多數情況下,vdo 目標在下次啟動時會自動從崩潰中恢復。如果遇到不可恢復的錯誤(在正常操作或崩潰恢復期間),目標將進入或以只讀模式啟動。由於只讀模式表示資料丟失,因此必須採取積極行動才能使 vdo 退出只讀模式。從同一倉庫獲取的“vdoforcerebuild”工具用於準備只讀 vdo 退出只讀模式。執行此工具後,vdo 目標將在下次啟動時重建其元資料。儘管可能會丟失一些資料,但重建後的 vdo 元資料將內部一致,並且目標將再次可寫。

該倉庫還包含其他使用者空間工具,可用於檢查 vdo 目標的磁碟元資料。幸運的是,除了 dm-vdo 開發人員之外,這些工具很少用到。

元資料要求

每個 vdo 卷保留 3GB 空間用於元資料,具體取決於其配置,可能更多。檢查重複資料刪除和壓縮節省的空間是否被元資料要求抵消掉,這很有幫助。特定資料集節省的空間估算可以使用 vdo 評估工具計算,該工具可在以下地址獲取:

https://github.com/dm-vdo/vdoestimator/

目標介面

表格行

<offset> <logical device size> vdo V4 <storage device>
<storage device size> <minimum I/O size> <block map cache size>
<block map era length> [optional arguments]

必需引數

offset(偏移量)

vdo 卷邏輯空間起始的扇區偏移量。

logical device size(邏輯裝置大小)

vdo 卷將服務的裝置大小,以扇區為單位。必須與 vdo 卷當前的邏輯大小匹配。

storage device(儲存裝置)

儲存 vdo 卷資料和元資料的裝置。

storage device size(儲存裝置大小)

儲存 vdo 卷的裝置大小,以 4096 位元組塊的數量表示。必須與 vdo 卷當前的大小匹配。

minimum I/O size(最小 I/O 大小)

此 vdo 卷接受的最小 I/O 大小,以位元組為單位。有效值為 512 或 4096。推薦值為 4096。

block map cache size(塊對映快取大小)

塊對映快取的大小,以 4096 位元組塊的數量表示。最小和推薦值為 32768 塊。如果邏輯執行緒計數非零,則快取大小必須至少為每個邏輯執行緒 4096 塊。

block map era length(塊對映時代長度)

塊對映快取寫入已修改塊對映頁面的速度。較小的時代長度可能會減少重建所需的時間,但會增加正常操作期間的塊對映寫入。最大和推薦值為 16380;最小值為 1。

可選引數:

部分或所有這些引數可以指定為 <key> <value> 對。

執行緒相關引數

不同類別的工作被分配到獨立的執行緒組,並且每個組中的執行緒數量可以單獨配置。

如果 <hash>、<logical> 和 <physical> 都設定為 0,則所有三種執行緒型別處理的工作將由單個執行緒處理。如果這些值中的任何一個非零,則所有這些值都必須非零。

ack(確認)

用於完成 bio 請求的執行緒數量。由於完成 bio 會在 vdo 卷外部呼叫任意完成函式,因此此型別的執行緒允許 vdo 卷即使在 bio 完成緩慢時也能繼續處理請求。預設值為 1。

bio(I/O 請求)

用於向底層儲存發出 bio 請求的執行緒數量。此型別的執行緒允許 vdo 卷即使在 bio 提交緩慢時也能繼續處理請求。預設值為 4。

bioRotationInterval(bio 輪換間隔)

在切換到下一個執行緒之前,每個 bio 執行緒上排隊的 bio 數量。該值必須大於 0 且不大於 1024;預設值為 64。

cpu(CPU)

用於執行 CPU 密集型工作(例如雜湊和壓縮)的執行緒數量。預設值為 1。

hash(雜湊)

用於管理基於資料塊雜湊值進行重複資料刪除的資料比較的執行緒數量。預設值為 0。

logical(邏輯)

用於管理基於傳入 bio 邏輯地址進行快取和鎖定的執行緒數量。預設值為 0;最大值為 60。

physical(物理)

用於管理底層儲存裝置管理的執行緒數量。在格式化時,會為 vdo 選擇一個 slab 大小;vdo 儲存裝置必須足夠大,以便每個物理執行緒至少有一個 slab。預設值為 0;最大值為 16。

其他引數

maxDiscard(最大丟棄)

接受的丟棄 bio 的最大大小,以 4096 位元組塊為單位。對 vdo 卷的 I/O 請求通常被分割成 4096 位元組塊,並一次處理多達 2048 個。然而,對 vdo 卷的丟棄請求可以自動分割成更大的大小,在單個 bio 中最多可達 <maxDiscard> 個 4096 位元組塊,並且一次限制為 1500 個。增加此值可能會提供更好的整體效能,但會增加單個丟棄請求的延遲。預設值和最小值為 1;最大值為 UINT_MAX / 4096。

deduplication(重複資料刪除)

是否啟用重複資料刪除。預設值為“on”;可接受的值為“on”和“off”。

compression(壓縮)

是否啟用壓縮。預設值為“off”;可接受的值為“on”和“off”。

裝置修改

修改後的表格可以載入到執行中、未暫停的 vdo 卷中。修改將在裝置下次恢復時生效。可修改的引數有 <logical device size>、<physical device size>、<maxDiscard>、<compression> 和 <deduplication>。

如果邏輯裝置大小或物理裝置大小發生變化,成功恢復後 vdo 將儲存新值並在未來的啟動中要求它們。這兩個引數不能減小。邏輯裝置大小不能超過 4 PB。物理裝置大小如果改變,必須至少增加 32832 個 4096 位元組塊,並且不能超過底層儲存裝置的大小。此外,在格式化 vdo 裝置時,會選擇一個 slab 大小:物理裝置大小永遠不能增加到提供 8192 個 slab 的大小以上,並且每次增加都必須足夠大以新增至少一個新 slab。

示例

啟動一個先前已格式化的 vdo 卷,具有 1 GB 邏輯空間和 1 GB 物理空間,儲存到具有超過 1 GB 空間的 /dev/dm-1。

dmsetup create vdo0 --table \
"0 2097152 vdo V4 /dev/dm-1 262144 4096 32768 16380"

將邏輯大小增加到 4 GB。

dmsetup reload vdo0 --table \
"0 8388608 vdo V4 /dev/dm-1 262144 4096 32768 16380"
dmsetup resume vdo0

將物理大小增加到 2 GB。

dmsetup reload vdo0 --table \
"0 8388608 vdo V4 /dev/dm-1 524288 4096 32768 16380"
dmsetup resume vdo0

將物理大小再增加 1 GB 並增加最大丟棄扇區。

dmsetup reload vdo0 --table \
"0 10485760 vdo V4 /dev/dm-1 786432 4096 32768 16380 maxDiscard 8"
dmsetup resume vdo0

停止 vdo 卷。

dmsetup remove vdo0

再次啟動 vdo 卷。請注意,邏輯和物理裝置大小仍必須匹配,但其他引數可以更改。

dmsetup create vdo1 --table \
"0 10485760 vdo V4 /dev/dm-1 786432 512 65550 5000 hash 1 logical 3 physical 2"

訊息

所有 vdo 裝置都接受以下形式的訊息:

dmsetup message <target-name> 0 <message-name> <message-parameters>

訊息型別為:

stats(統計資訊)

輸出 vdo 統計資訊的當前檢視。主要由 vdostats 使用者空間程式用於解釋輸出緩衝區。

config(配置)

輸出有用的 vdo 配置資訊。主要由希望重新建立類似 VDO 卷並想知道所使用的建立配置的使用者使用。

dump(轉儲)

將許多內部結構轉儲到系統日誌。執行此操作並非總是安全的,因此應僅用於除錯掛起的 vdo。指定要轉儲的結構的可選引數有:

viopool: 傳入 bio 請求的 I/O 請求池 pools: 'viopool' 的同義詞 vdo: 大多數管理磁碟資料的結構 queues: 有關每個 vdo 執行緒的基本資訊 threads: 'queues' 的同義詞 default: 等同於 'queues vdo' all: 以上所有。

dump-on-shutdown(關機時轉儲)

下次 vdo 關閉時執行預設轉儲。

狀態

<device> <operating mode> <in recovery> <index state>
<compression state> <physical blocks used> <total physical blocks>

    device:
            The name of the vdo volume.

    operating mode:
            The current operating mode of the vdo volume; values may be
            'normal', 'recovering' (the volume has detected an issue
            with its metadata and is attempting to repair itself), and
            'read-only' (an error has occurred that forces the vdo
            volume to only support read operations and not writes).

    in recovery:
            Whether the vdo volume is currently in recovery mode;
            values may be 'recovering' or '-' which indicates not
            recovering.

    index state:
            The current state of the deduplication index in the vdo
            volume; values may be 'closed', 'closing', 'error',
            'offline', 'online', 'opening', and 'unknown'.

    compression state:
            The current state of compression in the vdo volume; values
            may be 'offline' and 'online'.

    used physical blocks:
            The number of physical blocks in use by the vdo volume.

    total physical blocks:
            The total number of physical blocks the vdo volume may use;
            the difference between this value and the
            <used physical blocks> is the number of blocks the vdo
            volume has left before being full.

記憶體要求

vdo 目標需要固定 38 MB 的 RAM,以及以下隨目標變化的量:

  • 每 1 MB 配置的塊對映快取大小需要 1.15 MB RAM。塊對映快取至少需要 150 MB。

  • 每 1 TB 邏輯空間需要 1.6 MB RAM。

  • 卷管理的每 1 TB 物理儲存需要 268 MB RAM。

重複資料刪除索引需要額外的記憶體,其大小隨重複資料刪除視窗的大小而變化。對於密集索引,每 1 TB 視窗需要 1 GB RAM。對於稀疏索引,每 10 TB 視窗需要 1 GB RAM。索引配置在目標格式化時設定,不能修改。

模組引數

vdo 驅動程式有一個名為“log_level”的數值引數,它控制驅動程式日誌的詳細程度。預設設定為 6 (LOGLEVEL_INFO 和更嚴重的訊息)。

執行時使用

使用 dm-vdo 時,瞭解其行為與其他儲存目標的差異方式非常重要。

  • 不能保證覆蓋現有塊會成功。由於底層儲存可能被多次引用,覆蓋現有塊通常需要 vdo 有可用的空閒塊。

  • 當塊不再使用時,傳送這些塊的丟棄請求可讓 vdo 釋放這些塊的引用。如果 vdo 是精簡配置的,丟棄未使用的塊對於防止目標空間耗盡至關重要。然而,由於重複塊的共享,任何給定邏輯塊的丟棄請求都不能保證回收空間。

  • 假設底層儲存正確實現重新整理請求,vdo 能夠抵抗崩潰,但是,未重新整理的寫入在崩潰後可能持久化也可能不持久化。

  • 對 vdo 目標的每次寫入都涉及到大量的處理。然而,大部分工作是可並行化的。因此,vdo 目標在更高的 I/O 深度下能實現更好的吞吐量,並能支援高達 2048 個並行請求。

調優

vdo 裝置有許多選項,如果沒有完美瞭解工作負載,很難做出最佳選擇。此外,大多數配置選項必須在 vdo 目標啟動時設定,並且在不完全關閉它的情況下無法更改;目標處於活動狀態時無法更改配置。理想情況下,在生產環境中部署 vdo 之前,應使用模擬工作負載進行調優。

最重要的調整值是塊對映快取大小。為了處理任何邏輯地址的請求,vdo 必須載入塊對映中包含相關對映的部分。這些對映會被快取。當工作集不適合快取時,效能會下降。預設情況下,vdo 在 RAM 中分配 128 MB 的元資料快取,以支援一次高效訪問 100 GB 的邏輯空間。對於更大的工作集,應按比例放大。

邏輯和物理執行緒計數也應調整。邏輯執行緒控制塊對映的不相交部分,因此額外的邏輯執行緒會增加並行性並可以提高吞吐量。物理執行緒控制資料塊的不相交部分,因此額外的物理執行緒也可以提高吞吐量。然而,過多的執行緒會浪費資源並增加爭用。

Bio 提交執行緒控制向底層儲存傳送 I/O 的並行性;執行緒越少意味著有更多機會重新排序 I/O 請求以獲得性能優勢,但同時也意味著每個 I/O 請求在提交之前需要等待更長時間。

Bio 確認執行緒用於完成 I/O 請求。這在專用執行緒上完成,因為執行 bio 回撥所需的工作量無法由 vdo 本身控制。通常一個執行緒就足夠了,但額外的執行緒可能也有益,尤其是在 bio 具有 CPU 密集型回撥時。

CPU 執行緒用於雜湊和壓縮;在啟用壓縮的工作負載中,更多的執行緒可能會導致更高的吞吐量。

雜湊執行緒用於按雜湊值對活動請求進行排序,並確定它們是否應進行重複資料刪除;這些執行緒執行的最 CPU 密集型操作是 4096 位元組資料塊的比較。在大多數情況下,單個雜湊執行緒就足夠了。