FIO 基准测试 - 不一致且比预期慢:我的 RAID 是否配置错误?

TJ *_*man 7 raid zfs storage dell-perc proxmox

TL;DR:我的管理程序存储存在一些性能问题。这里是一堆测试结果fio。跳到该Results部分阅读有关它们并查看我的问题。


概括

我最近购买了 R730xd,因此在迁移到它之前,我想确保存储性能最佳。我一直在用fio运行一些基准测试,并发现了一些令人震惊的结果。使用这些结果和fio-plot的组合,我收集了大量图形和图表,展示了我的各种存储后端的问题。

然而,我很难把它变成可用的信息,因为我没有任何东西可以比较它。而且我认为我遇到了一些非常奇怪的性能问题。


磁盘配置

以下是暴露给我的管理程序 (Proxmox) 的四种类型的存储:

?????????????????????????????????????????????????????????????????????????????????????????
?  Storage  ?            Hardware            ? Filesystem  ?        Description         ?
?????????????????????????????????????????????????????????????????????????????????????????
? SATADOM   ? 1x Dell K9R5M SATADOM          ? LVM/XFS     ? Hypervisor filesystem      ?
? FlashPool ? 2x Samsung 970 EVO M.2 SSD     ? ZFS RAID 1  ? Hypervisor Compute Storage ?
? DataPool  ? 6x HGST 7200RPM HDD            ? ZFS RAID 10 ? Redundant Data Storage     ?
? RAIDPool  ? 6x Seagate/Hitachi 7200RPM HDD ? HW RAID 10  ? General Purpose Storage    ?
?????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

存储详细信息

以下是每个存储后端的更详细细分:

  1. SATADOMSATADOM由 Proxmox 通过 LVM 直接管理。是来自lvdisplay pve. SATADOM 通过内部 DVD-ROM SATA 端口连接到服务器,因为它在R730xd模型中未使用。

  2. FlashPool:这FlashPool是一个简单的 ZFS RAID 1,由双 NVMe SSD 组成。目标是将其用作我的 VM 的后备存储。以下是输出:

     zpool list  
     zpool status  
     zfs get all
    
    Run Code Online (Sandbox Code Playgroud)

    中的每个 SSDFlashPool都通过安装在 x16 PCIe 插槽中的PCI-E -> M.2 适配器连接到服务器。我知道这些是 x4 PCIe 适配器。但是,我很确定 NVMe 只能以该速度运行,因此不会制造更快的适配器。

  3. DataPool:这DataPool是唯一预先存在的数据集。它已经有几年的历史了,以前用于数据和 VM 存储,这会损害性能。它也由 Proxmox 作为 ZFS RAID 10 进行管理。

    它最初由6x 4TB HGST Ultrastar 7K4000 7200RPM磁盘组成。然而,当它们开始出现故障时,我决定用更高密度的磁盘替换它们。因此,该数组现在包含:

     2x 6TB HGST Ultrastar He6 7200RPM  
     4x 4TB HGST Ultrastar 7K4000 7200RPM 
    
    Run Code Online (Sandbox Code Playgroud)

    我显然打算最终完全转移到 6TB 磁盘,因为旧磁盘继续出现故障。以下是上面针对FlashPool.

    这 6 个磁盘通过背板上的前 6 个托架连接到服务器。此背板连接到 Dell H730 Mini PERC RAID 控制器。

  4. RAIDPool:这RAIDPool是一个实验性的存储后端。我以前从未使用过硬件 RAID,所以现在我有一个合适的 RAID 控制器,我很高兴有机会。与 类似DataPool,这些磁盘安装在背板上的最后 6 个托架中。但是,它们不是传递给 Proxmox,而是由 PERC 管理。它们作为单个磁盘呈现给 Proxmox,然后由 LVM 管理并通过逻辑卷作为 XFS 文件系统呈现给操作系统。是来自lvdisplay RAIDPool.


RAID 控制器配置

所以,你可能只注意到这两个DataPoolRAIDPool安装,并由H730 RAID控制器管理。但是,DataPool由 Proxmox 通过 ZFSRAIDPool管理,由实际控制器管理。

是物理磁盘拓扑的屏幕截图。H730 能够将磁盘直接传递到操作系统并同时管理其他磁盘。可以看到,前6个磁盘是Non-RAIDmode配置的,后6个磁盘是Onlinemode配置的。

  • 以下是 iDRAC UI 中控制器的配置属性。
  • 为虚拟磁盘 ( RAIDPool)上的回写和预读启用了磁盘缓存。由于这是专门为 VD 配置的,因此它不应影响 ZFS 驱动器。
  • 非 RAID磁盘 (ZFS DataPool) 的Dick 缓存设置为Disable.
  • 所有驱动器的链接速度都设置为auto

此外,在再次逐步完成所有设置后,我启用Write Cache了嵌入式 SATA 控制器。因此,SATADOM从下面的基准测试中可以看出,这可能会提高性能。


基准测试:

我以两种方式对所有这些存储后端进行了基准测试。对于这两个测试,我fio-plot在一个小的 shell 脚本中运行了一系列命令,将结果转储到几个文件夹中。

如果你疯了,想自己解析原始结果,这里有. 您将需要稍微调整我的脚本以重新运行,因为我在上传之前移动了目录结构以对其进行组织。

简而言之,他们对每个存储后端进行了一系列测试,评估了其RANDOM带宽、IOPS 和延迟。然后将这些结果绘制在图表上。一些图表比较了多个后端。其他图表仅显示来自各个后端的结果。我没有执行任何SEQUENTIAL测试。在所有情况下,默认块大小用于测试。

测试 1)在 Proxmox 中,我将所有存储后端安装到/mnt目录中。ZFS 池只是简单地导入操作系统,RAIDPool 和 RAIDPoolSATADOM都通过 LVM 呈现给操作系统。每个都有一个格式化为 XFS 分区的逻辑卷,用于基准测试。注意:我从实时操作系统运行这些基准测试,因此性能SATADOM会受到相应的影响。

日志文件是使用以下命令生成的:

./bench_fio --target /mnt/SATADOM_Data/bm --type directory --size 450M --mode randread randwrite --output SATADOM
./bench_fio --target /mnt/RAIDPool_Data/bm --type directory --size 1G --mode randread randwrite --output RAIDPOOL
./bench_fio --target /mnt/DataPool/bm/ --type directory --size 1G --mode randread randwrite --output DATAPOOL
./bench_fio --target /mnt/FlashPool/bm/ --type directory --size 1G --mode randread randwrite --output FLASHPOOL
Run Code Online (Sandbox Code Playgroud)

测试 2)我在 Proxmox 中创建了三个虚拟机。其中的每一个使用来自不同的后备存储器FlashPoolDataPoolRAIDPool。在FlashPool与数据池的虚拟机跑在自己的ZFS数据集。在RAIDPool虚拟机运行在自己的厚置备逻辑卷。所有三个 VM 都获得了 4 个 vCPU 和 40GB 的内存。

日志文件是使用以下命令生成的:

./bench_fio     --target /fio     --type file     --size 1G     --mode randread randwrite     --duration 600     --output DATAPOOL_VM
./bench_fio     --target /fio     --type file     --size 1G     --mode randread randwrite     --duration 600     --output RAIDPOOL_VM
./bench_fio     --target /fio     --type file     --size 1G     --mode randread randwrite     --duration 600     --output FLASHPOOL_VM
Run Code Online (Sandbox Code Playgroud)

结果:

上述 Imgur 链接中的图表应该都是相同的顺序。两个基准测试的结果有很大不同。但是,当您将虚拟化的开销考虑在内时,这是可以预料的。我没想到的是,他们似乎都表现得差不多。

  • 例如,此图表显示当fio在 VM 内运行时,平均写入带宽约为 125 MB/s。RAID 1 ( FlashPool) 中的两个 NVMe SSD 难道不应该大大优于SATADOM? 相反,您可以看到FlashPoolVM 完成测试所用的时间最长,平均写入带宽最慢。写入 IOPS比较也可以看到相同的情况——平均 IOPS 约为 3,000,FlashPoolVM 执行测试所用的时间最长!

  • 远离从虚拟机内进行的基准测试,转而查看直接与虚拟机管理程序中的存储交互进行的基准测试,我们可以看到一些不同的行为。例如,在本试验中用于写入带宽FlashPoolDataPool高达400MB /秒。然而,RAIDPool平均约 10MB/s的性能。巧合的是,与SATADOM? 当然,RAIDPool如果不比DataPool? 鉴于它们由同一 RAID 控制器中存在的类似磁盘组成?与上面类似,Write IOPS显示了同样的奇怪故事。

  • 来自管理程序测试的写入延迟似乎也很不寻常。在RAIDPool似乎是经历了比ZFS池十倍延迟恶化?但是,如果您转到VM 测试,三个存储后端的延迟似乎聚集在 300us 左右。这与我们在RAIDPool. 当测试从虚拟机而不是管理程序运行时,为什么会出现这种平滑的效果?为什么 ZFS 池的延迟突然变得如此糟糕,并且与RAIDPool?

  • 查看读取带宽、IOPS 和延迟显示了类似的情况。在 VM 中进行基准测试时,尽管硬件配置有很大不同,但所有指标都同样缓慢。但是,一旦从虚拟机管理程序进行基准测试,ZFS 池的性能就突然大大超过了其他所有东西?


问题:

  1. 这些结果很不正常……对吧?这个基准从网站上展示了970 EVO实现向上900MB / s的随机写入速度。为什么我的虚拟机管理程序仅以150MB/s 的速度进入,在 VM 中以 10MB/s 的速度进入?当从管理程序和 VM 进行基准测试时,为什么这些速度如此不同?

  2. 为什么RAIDPool从 Hypervisor 进行基准测试时突然变得异常缓慢?在这里,我们看到 VM 中的读取带宽平均为 20MB/s。但是,从管理程序中,它改为报告 4MB/s。就像我在问题 1 中展示的基准测试一样,这些读取速度不应该接近900MB/s吗?

  3. 为什么在 VM 而非虚拟机管理程序中进行基准测试时,ZFS 池的性能会突然变差?例如,在这里我们可以看到读取 IOPS 平均约为 200,000,延迟低于 650us。但是,当在 VM 内进行基准测试时,我们突然发现读取 IOPS 平均约为 2,500,延迟增加了四倍多?两种情况下的性能不应该差不多吗?

sho*_*hok 9

在对 ZFS 池进行基准测试时,您需要了解缓存和记录大小如何与您的工作负载交互:

  • 您的fio命令不会跳过 linux 页面缓存(无--direct=1选项),也不会跳过ZFS ARC。但是,由于两者之间的操作模式不同,您最终会倾向于使用普通文件系统 (XFS) 与 ZFS,反之亦然。为了减轻缓存效应,我建议您使用比 RAM 值大 2 倍的文件进行基准测试(即:如果有 24 GB 的 RAM,则使用 48 GB 的文件)。难道不是基准ZFS与禁用高速缓存(即:primarycache=none),作为牛的文件系统需要一个高缓存的命中率,以提供良好的性能(特别是写作时低于记录大小的块,你可以阅读下面);

  • 您的随机读/写 IOP 和思想量将受到 ZFSrecordsize属性的严重影响,因为 ZFS 通常传输完整的记录大小的块(小文件除外,其中“小”意味着 < 记录大小)。换句话说,虽然fio是读/写 4K 块,但 ZFS 实际上为每个请求的4K 块读/写 32K 块fio。缓存可以(并且将会)改变这个通用规则,但重点仍然存在:对于大的记录大小,吞吐量饱和可能是一件事。请注意,我并不是说 32K 记录大小不合理(尽管我可能会使用 16K 来限制 SSD 的磨损);但是,您需要在评估基准结果时考虑到它;

  • 我会为直通磁盘重新启用物理磁盘缓存,因为 ZFS 知道如何刷新它们的易失性缓存。但是,您需要检查您的 H730P 是否支持 ATA FLUSHes / FUA 以用于传递磁盘(它应该通过同步,但它的手册在这一点上不清楚,我没有实际的硬件可以尝试);

  • 您的RAIDPool阵列由机械硬盘驱动器组成,因此其随机读取性能会很低(控制器缓存不会帮助您进行随机读取)。

综合考虑,我不觉得你的结果不正常;相反,它们并不代表有效的工作量并且被部分误解了。如果您真的想比较 ZFS 和 HWRAID+XFS,我建议您使用实际预期的工作负载(即:数据库 + 应用程序 VM 做一些有用的工作)进行测试,同时确保使用ThinLVM(而不是经典的 LVM ) 至少具有与 ZFS 自己的快照/克隆功能相当的快速快照功能。

但是,从某种意义上说,您可以避免进行这些测试,因为结果非常可预测:

  • 对于适合 linux 页面缓存的数据集的顺序 IO 和随机读/写,普通的 HWRAID+LVM+XFS 设置将更快:不受 CoW 的影响,它支付的开销比 ZFS 小得多;

  • ZFS 设置在实际场景中会更快,其中 ARC 的抗扫描特性将确保最常用的数据始终保持缓存。此外,压缩和校验和是两个杀手级功能(要从 HWRAID 获得类似的功能,您需要使用堆栈dm-integrity+ vdo+thinlvm设置,这本身会导致很大的性能损失)。

作为参考,我最近用更便宜的 SuperMicro 5029WTR 更换了配备 H710P + 12 10K RPM SAS 磁盘的 Dell R720xd,配备 2x SSD(用于启动和 L2ARC)+ 1x NVMe Optane(用于 SLOG)和 6x 7.2K RPM SATA 磁盘. SuperMicro 系统虽然只有 1/3 的标称随机读取性能,但由于 ARC/L2ARC 和压缩,性能要好得多。

最后,虽然我完全理解使用经典 HWRAID+LVM+XFS 系统的动机,但我不会回到使用它而不是 ZFS 作为管理程序的裸机机器(除非针对特定工作负载,这些工作负载在在需要极速和 DirectIO 时或在需要极速和 DirectIO 之间的 CoW 层 - 请参阅 XFSdax选项)。