设备映射器 “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'