裝置對映器“去條帶化”目標

簡介

裝置對映器“去條帶化”目標提供了一種透明機制,可以將裝置對映器“條帶化”目標去條帶化,以便訪問底層磁碟,而無需修改真實的後端塊裝置。它也可用於對硬體 RAID-0 進行去條帶化,以訪問後端磁碟。

引數: <number of stripes> <chunk size> <stripe #> <dev_path> <offset>

<number of stripes>

RAID 0 中的條帶數量。

<chunk size>

塊條帶化中的 512B 扇區數量。

<dev_path>

您希望去條帶化的塊裝置。

<stripe #>

裝置中與您希望去條帶化的物理驅動器對應的條帶號。這必須是 0 索引的。

為何使用此模組?

撤銷現有 dm-stripe 的示例

這個小型 bash 指令碼將設定 4 個迴圈裝置,並使用現有的條帶化目標將這 4 個裝置合併為一個。然後它將在條帶化裝置之上使用去條帶化目標來訪問各個後端迴圈裝置。我們向新暴露的去條帶化裝置寫入資料,並驗證寫入的資料與條帶化陣列上正確的底層裝置匹配。

#!/bin/bash

MEMBER_SIZE=$((128 * 1024 * 1024))
NUM=4
SEQ_END=$((${NUM}-1))
CHUNK=256
BS=4096

RAID_SIZE=$((${MEMBER_SIZE}*${NUM}/512))
DM_PARMS="0 ${RAID_SIZE} striped ${NUM} ${CHUNK}"
COUNT=$((${MEMBER_SIZE} / ${BS}))

for i in $(seq 0 ${SEQ_END}); do
  dd if=/dev/zero of=member-${i} bs=${MEMBER_SIZE} count=1 oflag=direct
  losetup /dev/loop${i} member-${i}
  DM_PARMS+=" /dev/loop${i} 0"
done

echo $DM_PARMS | dmsetup create raid0
for i in $(seq 0 ${SEQ_END}); do
  echo "0 1 unstriped ${NUM} ${CHUNK} ${i} /dev/mapper/raid0 0" | dmsetup create set-${i}
done;

for i in $(seq 0 ${SEQ_END}); do
  dd if=/dev/urandom of=/dev/mapper/set-${i} bs=${BS} count=${COUNT} oflag=direct
  diff /dev/mapper/set-${i} member-${i}
done;

for i in $(seq 0 ${SEQ_END}); do
  dmsetup remove set-${i}
done

dmsetup remove raid0

for i in $(seq 0 ${SEQ_END}); do
  losetup -d /dev/loop${i}
  rm -f member-${i}
done

另一個示例

Intel NVMe 驅動器在物理裝置上包含兩個核心。驅動器的每個核心都對其 LBA 範圍具有獨立訪問許可權。當前的 LBA 模型在每個核心上都有一個 RAID 0 128k 塊,從而在兩個核心之間形成一個 256k 條帶。

 Core 0:       Core 1:
__________    __________
| LBA 512|    | LBA 768|
| LBA 0  |    | LBA 256|
----------    ----------

此去條帶化的目的是在“吵鬧鄰居”環境中提供更好的 QoS(服務質量)。當在聚合驅動器上建立兩個分割槽而沒有進行去條帶化時,一個分割槽上的讀取操作可能會影響另一個分割槽上的寫入操作。這是因為分割槽是跨兩個核心條帶化的。當我們對這個硬體 RAID 0 進行去條帶化並在每個新暴露的裝置上建立分割槽時,這兩個分割槽現在就物理上分離了。

使用 dm-unstriped 目標,我們能夠隔離一個 fio 指令碼,使其讀寫任務相互獨立。與在具有分割槽的組合驅動器上執行測試相比,使用此裝置對映器目標,我們能夠將讀取延遲降低 92%。

dmsetup 使用示例

在具有 2 個核心的 Intel NVMe 裝置上進行去條帶化

dmsetup create nvmset0 --table '0 512 unstriped 2 256 0 /dev/nvme0n1 0'
dmsetup create nvmset1 --table '0 512 unstriped 2 256 1 /dev/nvme0n1 0'

現在將有兩個裝置分別暴露 Intel NVMe 核心 0 和 1。

/dev/mapper/nvmset0
/dev/mapper/nvmset1

在具有 4 個驅動器、使用 128K 塊大小的條帶化裝置上進行去條帶化

dmsetup create raid_disk0 --table '0 512 unstriped 4 256 0 /dev/mapper/striped 0'
dmsetup create raid_disk1 --table '0 512 unstriped 4 256 1 /dev/mapper/striped 0'
dmsetup create raid_disk2 --table '0 512 unstriped 4 256 2 /dev/mapper/striped 0'
dmsetup create raid_disk3 --table '0 512 unstriped 4 256 3 /dev/mapper/striped 0'