Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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 创建的卷组名称(pvsvgs 列表)。
  • 格式化 VDO 卷时使用的文件系统(若有)。
  • 挂载的目录的权限。
  • /etc/vdoconf.yaml 的内容。
  • VDO 文件的位置。
您可以通过运行 sosreport 来捕获大量所需的信息。

工作负载

有效地测试 VDO 需要使用模拟实际工作负载的数据集。数据集应在可以重复数据删除和/或压缩的数据之间提供平衡,这些数据无法在不同条件下演示性能。
有几个工具可以同步生成具有可重复特征的数据。特别是 VDbench 和 fio 的两个实用程序,建议在测试过程中使用。
本指南使用 fio。了解参数对于成功评估至关重要:

表 31.1. 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 卷

  1. 创建 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
      
  2. 使用 XFS 或 ext4 文件系统格式化新设备。
    • 对于 XFS:
      # mkfs.xfs -K /dev/mapper/vdo0
      
    • 对于 ext4:
      # mkfs.ext4 -E nodiscard /dev/mapper/vdo0
      
  3. 挂载格式化的设备:
    # mkdir /mnt/VDOVolume
    # mount /dev/mapper/vdo0 /mnt/VDOVolume && \
      chmod a+rwx /mnt/VDOVolume
    

31.3.2. 测试 VDO 效率

2.测试读取和写入到 VDO 卷

  1. 将 32 GB 的随机数据写入 VDO 卷:
    $ dd if=/dev/urandom of=/mnt/VDOVolume/testfile bs=4096 count=8388608
    
  2. 从 VDO 卷中读取数据,并将其写入 VDO 卷中的另一个位置:
    $ dd if=/mnt/VDOVolume/testfile of=/home/user/testfile bs=4096
    
  3. 使用 diff 比较两个文件,该文件应该报告这些文件是相同的文件:
    $ diff -s /mnt/VDOVolume/testfile /home/user/testfile
    
  4. 将文件复制到 VDO 卷中的第二个位置:
    $ dd if=/home/user/testfile of=/mnt/VDOVolume/testfile2 bs=4096
    
  5. 将第三个文件与第二个文件进行比较。这应该报告这些文件是相同的:
    $ diff -s /mnt/VDOVolume/testfile2 /home/user/testfile
    

3.删除 VDO 卷

  1. 卸载在 VDO 卷中创建的文件系统:
    # umount /mnt/VDOVolume
  2. 运行命令从系统中删除 VDO 卷 vdo0
    # vdo remove --name=vdo0
  3. 验证卷是否已移除。VDO 分区的 vdo 列表中 不应有列表:
    # vdo list --all | grep vdo

4.测量重复数据

  1. 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载 VDO 卷。
  2. 在名为 vdo1vdo10 的 VDO 卷上创建 10 个目录,以存放测试数据集的 10 个副本:
    $ mkdir /mnt/VDOVolume/vdo{01..10}
  3. 根据文件系统检查所使用的磁盘空间量:
    $ 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 逻辑   
  4. 运行以下命令并记录值。"数据块使用"是 VDO 中运行的物理设备中用户数据所使用的块数。"使用的逻辑块"是优化前使用的块数。它将用作测量的起点
    # vdostats --verbose | grep "blocks used"
    
    data blocks used                : 1090
    overhead blocks used            : 538846
    logical blocks used             : 6059434
    
  5. 在 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
    
  6. 重新检查已使用的物理磁盘空间量。这应该显示与刚才写入的文件对应的块数量的增加:
    $ 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)
    
  7. 将文件复制到 10 个子目录中的每个子目录中:
    $ for i in {01..10}; do
      cp /mnt/VDOVolume/sourcefile /mnt/VDOVolume/vdo$i
      done
    
  8. 再次检查已使用的物理磁盘空间量(使用的数据块)。这个数字应该与上述步骤 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)
    
  9. 从写测试数据之前找到的值中减去文件系统所使用的空间的新值。从文件系统的角度来看,这是此测试消耗的空间量。
  10. 观察您记录统计中的空间节能:
    注意:在下表中,值已转换为 MB/GB。vdostats "blocks" 为 4,096 B。
    统计裸机文件系统seed 后10 个副本后
    文件系统使用的大小198 MB4.2 GB45 GB
    已使用的 VDO 数据4 MB4.1 GB4.1 GB
    使用 VDO 逻辑23.6 GB*27.8 GB68.7 GB
    * 1.6 TB 格式的驱动器的文件系统开销

5.测量压缩

  1. 创建一个至少 10 GB 物理和逻辑大小的 VDO 卷。添加选项来禁用 deduplication 并启用压缩:
    # vdo create --name=vdo0 --device=/dev/sdb \
                 --vdoLogicalSize=10G --verbose \
                 --deduplication=disabled --compression=enabled
    
  2. 在传输前检查 VDO 统计;记录使用的数据块和逻辑块(两者均应为零):
    # vdostats --verbose | grep "blocks used"
  3. 使用 XFS 或 ext4 文件系统格式化新设备。
    • 对于 XFS:
      # mkfs.xfs -K /dev/mapper/vdo0
      
    • 对于 ext4:
      # mkfs.ext4 -E nodiscard /dev/mapper/vdo0
      
  4. 挂载格式化的设备:
    # mkdir /mnt/VDOVolume
    # mount /dev/mapper/vdo0 /mnt/VDOVolume && \
      chmod a+rwx /mnt/VDOVolume
    
  5. 同步 VDO 卷以完成所有未完成压缩:
    # sync && dmsetup message vdo0 0 sync-dedupe
  6. 再次检查 VDO 统计信息。logical blocks used - 使用的数据块数是文件系统压缩的 4 KB 块数量。VDO 优化文件系统开销以及实际的用户数据:
    # vdostats --verbose | grep "blocks used"
  7. /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
    
  8. 同步 Linux 缓存和 VDO 卷:
    # sync && dmsetup message vdo0 0 sync-dedupe
  9. 再次检查 VDO 统计。观察使用的逻辑和数据块:
    # vdostats --verbose | grep "blocks used"
    • logical blocks used - 使用的数据块代表 /lib 文件的副本所使用的空间量(以 4 KB 块为单位)。
    • 总大小(来自 “4.测量重复数据”一节中的表)- (逻辑块 used-data 块使用 * 4096) = 压缩保存的字节数。
  10. 删除 VDO 卷:
    # umount /mnt/VDOVolume && vdo remove --name=vdo0

6.测试 VDO 压缩效率

  1. 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载 VDO 卷。
  2. 在没有删除卷的情况下,在 “4.测量重复数据”一节“5.测量压缩”一节 中重复实验。观察 vdostats 中空间节省的变化。
  3. 使用您自己的数据集进行测试。

7.了解 TRIM 和 DISCARD

精简配置允许逻辑或虚拟存储空间大于底层存储。文件系统等应用程序从更大的存储的虚拟层上运行以及数据效率的技术(如数据重复数据删除)中受益,从而减少了存储所有数据所需的物理数据块数量。要从这些存储节省中受益,物理存储层需要知道何时删除应用程序数据。
传统的文件系统不必在删除数据时通知底层存储。使用精简配置的存储的文件系统发送 TRIMDISCARD 命令,以便在不再需要逻辑块时通知存储系统。这些命令可以在使用 discard 挂载选项删除块时发送,或通过运行工具(如 fstrim )以受控的方式发送这些命令,告知文件系统检测哪些逻辑块没有被使用,并以 TRIMDISCARD 命令的形式向存储系统发送信息。
重要
有关精简配置如何工作的更多信息,请参阅 Red Hat Enterprise Linux 7 Logical Volume Manager Administration Guide 中的 Thinly-Provisioned Logical Volumes (Thin Volumes)
查看它如何工作:
  1. 按照 第 31.3.1 节 “配置 VDO 测试卷” 创建并挂载新的 VDO 逻辑卷。
  2. 修剪文件系统以删除任何不需要的块(可能需要很长时间):
    # fstrim /mnt/VDOVolume
  3. 输入以下内容记录下表中的初始状态:
    $ df -m /mnt/VDOVolume
    要查看文件系统中使用了多少容量,并运行 vdostats 来查看正在使用的物理和虚拟数据块的数量。
  4. 在 VDO 上运行的文件系统中创建一个带有非重复数据的 1 GB 文件:
    $ dd if=/dev/urandom of=/mnt/VDOVolume/file bs=1M count=1K
    
    然后收集相同的数据。该文件系统应该已经使用额外的 1 GB,使用的数据块和逻辑块的相似增加。
  5. 运行 fstrim /mnt/VDOVolume 并确认在创建新文件后这不会影响。
  6. 删除 1 GB 文件:
    $ rm /mnt/VDOVolume/file
    检查并记录参数。文件系统知道文件已被删除,但没有更改物理或逻辑块的数量,因为文件删除尚未与底层存储通信。
  7. 运行 fstrim /mnt/VDOVolume 并记录相同的参数。fstrim 在文件系统中查找空闲块,并为未使用的地址向 VDO 卷发送 TRIM 命令,这会释放相关的逻辑块,VDO 会处理 TRIM 来释放底层物理块。
    步骤已使用的文件空间(MB)已使用的数据块使用的逻辑块
    初始空间   
    添加 1 GB 文件   
    运行 fstrim   
    删除 1 GB 文件   
    运行 fstrim   
根据此练习,需要 TRIM 进程,以便底层存储可以准确了解容量利用率。fstrim 是一个命令行工具,可一次性分析多个块以提高效率。另一种方法是在挂载时使用文件系统丢弃选项。discard 选项会在每个文件系统块被删除后更新底层存储,这可能会降低吞吐量,但可为很好的利用率感知提供。另请务必了解 TRIM 或 DISCARD 未使用块对 VDO 并不独一无二;任何精简置备的存储系统都有相同的挑战