设备映射器“去条带化”目标

简介

设备映射器“去条带化”目标提供了一种透明机制,可以将设备映射器“条带化”目标去条带化,以便访问底层磁盘,而无需修改真实的后端块设备。它也可用于对硬件 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'