31.3. 数据效率测试过程
VDO 成功验证取决于遵循一个精心设计的测试过程。本节提供了一系列后续步骤,以及预期结果,作为参与评估时需要考虑的测试示例。
测试环境
下一节中的测试案例对测试环境进行以下假设:
- 一个或多个 Linux 物理块设备可用。
- 目标块设备(例如
/dev/sdb
)大于 512 GB。 - 已安装灵活的 I/O Tester (
fio
)版本 2.1.1 或更高版本。 - 已安装 VDO。
以下信息应该在每个测试开始时记录,以确保测试环境被完全理解:
- 使用的 Linux 构建,包括内核构建号。
- 从 rpm -qa 命令获取安装的软件包的完整列表。
- 完整的系统规格:
- CPU 类型和数量(可在
/proc/cpuinfo
中提供)。 - 安装的内存以及基础操作系统运行后可用(可在
/proc/meminfo
中使用)。 - 使用的驱动器控制器的类型。
- 使用的磁盘的类型和数量。
- 正在运行的进程的完整列表(从 ps aux 或类似的列表)。
- 物理卷的名称以及为 VDO 创建的卷组名称(pvs 和 vgs 列表)。
- 格式化 VDO 卷时使用的文件系统(若有)。
- 挂载的目录的权限。
/etc/vdoconf.yaml
的内容。- VDO 文件的位置。
您可以通过运行 sosreport 来捕获大量所需的信息。
工作负载
有效地测试 VDO 需要使用模拟实际工作负载的数据集。数据集应在可以重复数据删除和/或压缩的数据之间提供平衡,这些数据无法在不同条件下演示性能。
有几个工具可以同步生成具有可重复特征的数据。特别是 VDbench 和
fio
的两个实用程序,建议在测试过程中使用。
本指南使用
fio
。了解参数对于成功评估至关重要:
参数 | 描述 | 值 |
---|---|---|
--size | 数据 fio 将为每个作业发送到目标(请参阅以下 numjobs )。 | 100 GB |
--bs | fio 生成的每个读/写请求的块大小。红帽建议 4 KB 块大小来匹配 VDO 的 4 KB 默认 | 4k |
--numjobs |
fio 将为运行基准而创建的作业数量。
每个作业发送
--size 参数指定的数据量。
第一个作业将数据发送到
--offset 参数指定的偏移处的设备。除非提供了 --offset_increment 参数,否则后续作业写入磁盘的同一区域(覆盖)将使每个作业从上一个作业开始的位置偏移。要在闪存上达到峰值性能,至少有两个作业。一个作业通常足以饱和旋转型磁盘(HDD)吞吐量。
|
1 (HDD)
2 (SSD)
|
--thread | 指示 fio 作业在线程中运行,而不是被分叉,这可以通过限制上下文切换来提供更好的性能。 | <N/A> |
--ioengine |
Linux 中有几个可用的 I/O 引擎可以使用 fio 进行测试。红帽测试使用异步非缓冲引擎(
libaio )。如果您对其他引擎感兴趣,请与红帽销售工程师进行讨论。
Linux
libaio 引擎用于评估一个或多个进程同时进行随机请求的工作负载。libaio 在检索任何数据前,允许从单个线程中异步进行多个请求,这限制了在通过同步引擎提供给多个线程时所需的上下文切换数量。
| libaio |
--direct |
设置后,直接允许将请求提交到设备,绕过 Linux 内核的页面缓存。
libaio Engine:
libaio 必须与启用 direct (=1)一起使用,或者内核可能对所有 I/O 请求使用 sync API。
| 1 (libaio) |
--iodepth |
任意时间中的 I/O 缓冲区的数量。
高
iodepth 通常会提高性能,特别是用于随机读取或写入。高深度可确保控制器始终具有批处理请求。但是,设置 iodepth 太大(超过 1K,通常)可能会导致不必要的延迟。虽然红帽建议在 128 到 512 之间有一个 iodepth ,但最终的值是一个利弊的,它取决于应用程序如何容忍延迟。
| 128 (最小) |
--iodepth_batch_submit | 当 iodepth 缓冲池开始为空时创建的 I/O 数量。此参数在测试过程中将任务从 I/O 限制为从 I/O 切换到缓冲区。 | 16 |
--iodepth_batch_complete | 提交批处理前要完成的 I/O 数量(iodepth_batch_complete )。此参数在测试过程中将任务从 I/O 限制为从 I/O 切换到缓冲区。 | 16 |
--gtod_reduce | 禁用日常调用来计算延迟。如果启用,此设置将降低吞吐量,因此应启用(=1),除非需要延迟测量。 | 1 |
31.3.1. 配置 VDO 测试卷
1.在 512 GB 物理卷中创建大小为 1 TB 的 VDO 卷
- 创建 VDO 卷。
- 要在同步存储之上测试 VDO
async
模式,请使用--writePolicy=async
选项创建一个异步卷:# vdo create --name=vdo0 --device=/dev/sdb \ --vdoLogicalSize=1T --writePolicy=async --verbose
- 要在
同步
存储之上测试 VDO 同步模式,请使用--writePolicy=sync
选项创建一个同步卷:# vdo create --name=vdo0 --device=/dev/sdb \ --vdoLogicalSize=1T --writePolicy=sync --verbose
- 使用 XFS 或 ext4 文件系统格式化新设备。
- 对于 XFS:
# mkfs.xfs -K /dev/mapper/vdo0
- 对于 ext4:
# mkfs.ext4 -E nodiscard /dev/mapper/vdo0
- 挂载格式化的设备:
# mkdir /mnt/VDOVolume # mount /dev/mapper/vdo0 /mnt/VDOVolume && \ chmod a+rwx /mnt/VDOVolume
31.3.2. 测试 VDO 效率
2.测试读取和写入到 VDO 卷
- 将 32 GB 的随机数据写入 VDO 卷:
$ dd if=/dev/urandom of=/mnt/VDOVolume/testfile bs=4096 count=8388608
- 从 VDO 卷中读取数据,并将其写入 VDO 卷中的另一个位置:
$ dd if=/mnt/VDOVolume/testfile of=/home/user/testfile bs=4096
- 使用
diff
比较两个文件,该文件应该报告这些文件是相同的文件:$ diff -s /mnt/VDOVolume/testfile /home/user/testfile
- 将文件复制到 VDO 卷中的第二个位置:
$ dd if=/home/user/testfile of=/mnt/VDOVolume/testfile2 bs=4096
- 将第三个文件与第二个文件进行比较。这应该报告这些文件是相同的:
$ diff -s /mnt/VDOVolume/testfile2 /home/user/testfile
3.删除 VDO 卷
- 卸载在 VDO 卷中创建的文件系统:
# umount /mnt/VDOVolume
- 运行命令从系统中删除 VDO 卷
vdo0
:# vdo remove --name=vdo0
- 验证卷是否已移除。VDO 分区的 vdo 列表中 不应有列表:
# vdo list --all | grep vdo
4.测量重复数据
- 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载 VDO 卷。
- 在名为
vdo1
到vdo10
的 VDO 卷上创建 10 个目录,以存放测试数据集的 10 个副本:$ mkdir /mnt/VDOVolume/vdo{01..10}
- 根据文件系统检查所使用的磁盘空间量:
$ df -h /mnt/VDOVolume Filesystem Size Used Avail Use% Mounted on /dev/mapper/vdo0 1.5T 198M 1.4T 1% /mnt/VDOVolume
考虑在表中模拟结果:统计 裸机文件系统 seed 后 10 个副本后 文件系统使用的大小 198 MB 已使用的 VDO 数据 使用 VDO 逻辑 - 运行以下命令并记录值。"数据块使用"是 VDO 中运行的物理设备中用户数据所使用的块数。"使用的逻辑块"是优化前使用的块数。它将用作测量的起点
# vdostats --verbose | grep "blocks used" data blocks used : 1090 overhead blocks used : 538846 logical blocks used : 6059434
- 在 VDO 卷顶层创建数据源文件
$ dd if=/dev/urandom of=/mnt/VDOVolume/sourcefile bs=4096 count=1048576 4294967296 bytes (4.3 GB) copied, 540.538 s, 7.9 MB/s
- 重新检查已使用的物理磁盘空间量。这应该显示与刚才写入的文件对应的块数量的增加:
$ df -h /mnt/VDOVolume Filesystem Size Used Avail Use% Mounted on /dev/mapper/vdo0 1.5T 4.2G 1.4T 1% /mnt/VDOVolume
# vdostats --verbose | grep "blocks used" data blocks used : 1050093 (increased by 4GB) overhead blocks used : 538846 (Did not change) logical blocks used : 7108036 (increased by 4GB)
- 将文件复制到 10 个子目录中的每个子目录中:
$ for i in {01..10}; do cp /mnt/VDOVolume/sourcefile /mnt/VDOVolume/vdo$i done
- 再次检查已使用的物理磁盘空间量(使用的数据块)。这个数字应该与上述步骤 6 的结果类似,因为文件系统日志记录和元数据,只需要稍微增加一些:
$ df -h /mnt/VDOVolume Filesystem Size Used Avail Use% Mounted on /dev/mapper/vdo0 1.5T 45G 1.3T 4% /mnt/VDOVolume
# vdostats --verbose | grep "blocks used" data blocks used : 1050836 (increased by 3M) overhead blocks used : 538846 logical blocks used : 17594127 (increased by 41G)
- 从写测试数据之前找到的值中减去文件系统所使用的空间的新值。从文件系统的角度来看,这是此测试消耗的空间量。
- 观察您记录统计中的空间节能:注意:在下表中,值已转换为 MB/GB。vdostats "blocks" 为 4,096 B。
统计 裸机文件系统 seed 后 10 个副本后 文件系统使用的大小 198 MB 4.2 GB 45 GB 已使用的 VDO 数据 4 MB 4.1 GB 4.1 GB 使用 VDO 逻辑 23.6 GB* 27.8 GB 68.7 GB * 1.6 TB 格式的驱动器的文件系统开销
5.测量压缩
- 创建一个至少 10 GB 物理和逻辑大小的 VDO 卷。添加选项来禁用 deduplication 并启用压缩:
# vdo create --name=vdo0 --device=/dev/sdb \ --vdoLogicalSize=10G --verbose \ --deduplication=disabled --compression=enabled
- 在传输前检查 VDO 统计;记录使用的数据块和逻辑块(两者均应为零):
# vdostats --verbose | grep "blocks used"
- 使用 XFS 或 ext4 文件系统格式化新设备。
- 对于 XFS:
# mkfs.xfs -K /dev/mapper/vdo0
- 对于 ext4:
# mkfs.ext4 -E nodiscard /dev/mapper/vdo0
- 挂载格式化的设备:
# mkdir /mnt/VDOVolume # mount /dev/mapper/vdo0 /mnt/VDOVolume && \ chmod a+rwx /mnt/VDOVolume
- 同步 VDO 卷以完成所有未完成压缩:
# sync && dmsetup message vdo0 0 sync-dedupe
- 再次检查 VDO 统计信息。logical blocks used - 使用的数据块数是文件系统压缩的 4 KB 块数量。VDO 优化文件系统开销以及实际的用户数据:
# vdostats --verbose | grep "blocks used"
- 将
/lib
的内容复制到 VDO 卷中。记录总大小:# cp -vR /lib /mnt/VDOVolume ... sent 152508960 bytes received 60448 bytes 61027763.20 bytes/sec total size is 152293104 speedup is 1.00
- 同步 Linux 缓存和 VDO 卷:
# sync && dmsetup message vdo0 0 sync-dedupe
- 再次检查 VDO 统计。观察使用的逻辑和数据块:
# vdostats --verbose | grep "blocks used"
- logical blocks used - 使用的数据块代表
/lib
文件的副本所使用的空间量(以 4 KB 块为单位)。 - 总大小(来自 “4.测量重复数据”一节中的表)- (逻辑块 used-data 块使用 * 4096) = 压缩保存的字节数。
- 删除 VDO 卷:
# umount /mnt/VDOVolume && vdo remove --name=vdo0
6.测试 VDO 压缩效率
- 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载 VDO 卷。
- 使用您自己的数据集进行测试。
7.了解 TRIM 和 DISCARD
精简配置允许逻辑或虚拟存储空间大于底层存储。文件系统等应用程序从更大的存储的虚拟层上运行以及数据效率的技术(如数据重复数据删除)中受益,从而减少了存储所有数据所需的物理数据块数量。要从这些存储节省中受益,物理存储层需要知道何时删除应用程序数据。
传统的文件系统不必在删除数据时通知底层存储。使用精简配置的存储的文件系统发送
TRIM
或 DISCARD
命令,以便在不再需要逻辑块时通知存储系统。这些命令可以在使用 discard 挂载选项删除块时发送,或通过运行工具(如 fstrim
)以受控的方式发送这些命令,告知文件系统检测哪些逻辑块没有被使用,并以 TRIM
或 DISCARD
命令的形式向存储系统发送信息。
重要
有关精简配置如何工作的更多信息,请参阅 Red Hat Enterprise Linux 7 Logical Volume Manager Administration Guide 中的 Thinly-Provisioned Logical Volumes (Thin Volumes)。
查看它如何工作:
- 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载新的 VDO 逻辑卷。
- 修剪文件系统以删除任何不需要的块(可能需要很长时间):
# fstrim /mnt/VDOVolume
- 输入以下内容记录下表中的初始状态:
$ df -m /mnt/VDOVolume
要查看文件系统中使用了多少容量,并运行 vdostats 来查看正在使用的物理和虚拟数据块的数量。 - 在 VDO 上运行的文件系统中创建一个带有非重复数据的 1 GB 文件:
$ dd if=/dev/urandom of=/mnt/VDOVolume/file bs=1M count=1K
然后收集相同的数据。该文件系统应该已经使用额外的 1 GB,使用的数据块和逻辑块的相似增加。 - 运行
fstrim /mnt/VDOVolume
并确认在创建新文件后这不会影响。 - 删除 1 GB 文件:
$ rm /mnt/VDOVolume/file
检查并记录参数。文件系统知道文件已被删除,但没有更改物理或逻辑块的数量,因为文件删除尚未与底层存储通信。 - 运行
fstrim /mnt/VDOVolume
并记录相同的参数。fstrim
在文件系统中查找空闲块,并为未使用的地址向 VDO 卷发送 TRIM 命令,这会释放相关的逻辑块,VDO 会处理 TRIM 来释放底层物理块。步骤 已使用的文件空间(MB) 已使用的数据块 使用的逻辑块 初始空间 添加 1 GB 文件 运行 fstrim
删除 1 GB 文件 运行 fstrim
根据此练习,需要 TRIM 进程,以便底层存储可以准确了解容量利用率。
fstrim
是一个命令行工具,可一次性分析多个块以提高效率。另一种方法是在挂载时使用文件系统丢弃选项。discard 选项会在每个文件系统块被删除后更新底层存储,这可能会降低吞吐量,但可为很好的利用率感知提供。另请务必了解 TRIM 或 DISCARD 未使用块对 VDO 并不独一无二;任何精简置备的存储系统都有相同的挑战