设备映射器 “unstriped” 目标¶
介绍¶
设备映射器 “unstriped” 目标提供了一种透明机制,用于取消设备映射器 “striped” 目标的条带化,以便在不必接触真正的后备块设备的情况下访问底层磁盘。它也可以用来取消硬件 RAID-0 的条带化以访问后备磁盘。
参数:<条带数> <块大小> <条带 #> <dev_path> <offset>
- <条带数>
RAID 0 中的条带数。
- <块大小>
块条带化中 512B 扇区的数量。
- <dev_path>
您希望取消条带化的块设备。
- <条带 #>
设备中与您希望取消条带化的物理驱动器对应的条带号。这必须是 0 索引的。
为什么要使用此模块?¶
撤销现有 dm-stripe 的示例¶
这个小型的 bash 脚本将设置 4 个环回设备,并使用现有的条带化目标将 4 个设备组合为一个。然后,它将在条带化设备之上使用 unstriped 目标来访问各个后备环回设备。我们将数据写入新公开的 unstriped 设备,并验证写入的数据与条带化阵列上正确的底层设备匹配
#!/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 模型在每个内核上有一个 128k 块的 RAID 0,从而导致跨两个内核的 256k 条带
Core 0: Core 1:
__________ __________
| LBA 512| | LBA 768|
| LBA 0 | | LBA 256|
---------- ----------
此取消条带化的目的是在嘈杂的邻居环境中提供更好的 QoS。当在聚合驱动器上创建两个分区而没有此取消条带化时,一个分区上的读取可能会影响另一个分区上的写入。这是因为这些分区跨越两个内核条带化。当我们取消此硬件 RAID 0 的条带化并在每个新公开的设备上创建分区时,这两个分区现在在物理上是分离的。
通过 dm-unstriped 目标,我们能够分离一个具有彼此独立的读取和写入作业的 fio 脚本。与我们在带有分区的组合驱动器上运行测试相比,使用此设备映射器目标,读取延迟减少了 92%。
示例 dmsetup 用法¶
在具有 2 个内核的 Intel NVMe 设备之上进行 unstriped¶
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
在使用 128K 块大小的 4 个驱动器的条带化之上进行 unstriped¶
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'