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 ║
╚═══════════╩════════════════════════════════╩═════════════╩════════════════════════════╝
存储详细信息
以下是每个存储后端的更详细细分:
SATADOM:
SATADOM
由 Proxmox 通过 LVM 直接管理。这是来自 的输出lvdisplay pve
。SATADOM 通过内部 DVD-ROM SATA 端口连接到服务器,因为它在R730xd
模型中未使用。FlashPool:这
FlashPool
是一个简单的 ZFS RAID 1,由双 NVMe SSD 组成。目标是将其用作我的虚拟机的后备存储。以下是以下输出:zpool list zpool status zfs get all
中的每个 SSD都通过安装在 x16 PCIe 插槽中的PCI-E -> M.2 适配器
FlashPool
连接到服务器。我知道这些是 x4 PCIe 适配器。但是,我很确定 NVMe 只能以这种速度运行,因此不会制造更快的适配器。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
我显然打算最终完全迁移到 6TB 磁盘,因为旧磁盘继续出现故障。以下是上面发布的相同命令的输出
FlashPool
。这 6 个磁盘通过背板上的前 6 个托架连接到服务器。此背板连接到 Dell H730 Mini PERC RAID 控制器。
RAIDPool:这
RAIDPool
是一个实验性的存储后端。我以前从未使用过硬件 RAID,所以现在我有一个合适的 RAID 控制器,我为这个机会感到兴奋。与 类似DataPool
,这些磁盘安装在背板上的最后 6 个托架中。但是,它们不是传递给 Proxmox,而是由 PERC 管理。它们作为单个磁盘呈现给 Proxmox,然后由 LVM 管理并通过逻辑卷作为 XFS 文件系统呈现给操作系统。这是来自 的输出lvdisplay RAIDPool
。
RAID 控制器配置
因此,您可能刚刚注意到DataPool
和RAIDPool
都由 H730 RAID 控制器安装和管理。但是,DataPool
由 Proxmox 通过 ZFSRAIDPool
管理,由实际控制器管理。
这是物理磁盘拓扑的屏幕截图。H730 能够将磁盘直接传递到操作系统并同时管理其他磁盘。如您所见,前 6 个磁盘配置为Non-RAID
mode,后 6 个磁盘配置为Online
mode。
- 以下是 iDRAC UI 中为控制器配置的属性。
- 为虚拟磁盘 ( ) 上的回写和预读启用磁盘缓存
RAIDPool
。由于这是专门为 VD 配置的,因此不会影响 ZFS 驱动器。 - 非 RAID磁盘的 Dick Cache (ZFS
DataPool
) 设置为Disable
. - 所有驱动器的链接速度设置为
auto
。
此外,在再次完成所有设置后,我启用Write Cache
了嵌入式 SATA 控制器。因此,这可能会提高SATADOM
以下基准中所见的性能。
基准测试:
我以两种方式对所有这些存储后端进行了基准测试。对于这两个测试,我在一个小的 shell 脚本中运行了一系列fio-plot
命令,将结果转储到几个文件夹中。
如果您很疯狂并且想自己解析原始结果,那么它们就是. 您需要稍微调整一下我的脚本才能重新运行,因为我在上传之前移动了目录结构来组织它。
简而言之,他们针对每个存储后端进行了一系列测试,评估了其RANDOM带宽、IOPS 和延迟。然后它将这些结果绘制在图表上。一些图表比较了多个后端。其他图表仅显示来自各个后端的结果。我没有执行任何顺序测试。在所有情况下,默认块大小都用于测试。
测试 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
测试 2)我在 Proxmox 中创建了三个虚拟机。FlashPool
每个都使用与、DataPool
和不同的后备存储RAIDPool
。和FlashPool
DataPool VM 在它们自己的 ZFS 数据集中运行。VM 在其RAIDPool
自己的厚配置逻辑卷上运行。所有三个虚拟机都被分配了 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
结果:
上述 Imgur 链接中的图表都应按相同的顺序排列。两个基准测试的结果有很大不同。但是,当您考虑到虚拟化的开销时,这是可以预料的。我没想到的是,它们的行为似乎都差不多。
例如,此图表显示,当
fio
从 VM 内运行时,平均写入带宽约为 125 MB/s。RAID 1 ( ) 中的两个 NVMe SSD 不应该FlashPool
大大优于SATADOM
吗?相反,您可以看到FlashPool
VM 完成测试所用的时间最长,并且平均写入带宽最慢。在写入 IOPS比较中可以看到相同的情况——平均 IOPS 约为 3,000,FlashPool
VM 执行测试的时间最长!抛开从虚拟机内部获取的基准,转而查看通过直接与虚拟机管理程序的存储交互所获取的基准,我们可以看到一些不同的行为。例如,在这个测试
FlashPool
中,和的写入带宽DataPool
高达 400MB/s。但是,RAIDPool
平均性能为 10MB/s 左右。巧合的是,与SATADOM
? 当然,RAIDPool
应该与DataPool
? 鉴于它们由相同 RAID 控制器中存在的类似磁盘组成?与上面类似,Write IOPS显示了同样的离奇故事。来自 Hypervisor 测试的写入延迟似乎也很不寻常。似乎比 ZFS 池的
RAIDPool
延迟要差十倍?但是,如果你翻到VM 测试,三个存储后端的延迟似乎集中在 300 微秒左右。这与我们在 WORST 演员阵容中看到的非常相似RAIDPool
。当测试是从虚拟机而不是管理程序运行时,为什么这种平滑效果会发生在写入延迟上?为什么 ZFS 池的延迟突然变得如此糟糕,并且可以与RAIDPool
?查看读取带宽、IOPS 和延迟显示了类似的情况。从 VM 中进行基准测试时,尽管硬件配置大不相同,但所有指标都同样缓慢。但是,一旦从虚拟机管理程序进行基准测试,ZFS 池的性能会突然大大超过其他所有东西吗?
问题:
这些结果是不正常的……对吧?该网站的基准测试显示970 EVO 实现了超过 900MB/s 的随机写入速度。为什么我的在管理程序上只有150MB/s而在 VM 上只有 10MB/s?当从虚拟机管理程序和虚拟机进行基准测试时,为什么这些速度如此不同?
为什么
RAIDPool
从 Hypervisor 进行基准测试时突然变得异常缓慢?在这里,我们看到 VM 中的读取带宽平均为 20MB/s。但是,从管理程序,它改为报告 4MB/s。就像我在问题 1 中展示的基准测试一样,这些读取速度不应该接近900MB/s吗?为什么从虚拟机而不是虚拟机管理程序中进行基准测试时,ZFS 池的性能突然显着变差?例如,在这里我们可以看到平均读取 IOPS 约为 200,000,延迟低于 650us。但是,当从VM 内部进行基准测试时,我们会突然发现读取 IOPS 平均约为 2,500,延迟增加了四倍多?两种情况下的表现不应该差不多吗?
在对 ZFS 池进行基准测试时,您需要了解缓存和记录大小如何与您的工作负载交互:
您的
fio
命令不会跳过 linux 页面缓存(无--direct=1
选项),也不会跳过 ZFS ARC。但是,由于两者之间的操作模式不同,您可以最终选择普通文件系统 (XFS) 与 ZFS,反之亦然。为了减轻缓存效应,我建议您使用比 RAM 值大 2 倍的文件进行基准测试(即:如果有 24 GB 的 RAM,则使用 48 GB 的文件)。不要在禁用缓存的情况下对 ZFS 进行基准测试(即primarycache=none
:),因为 CoW 文件系统需要高缓存命中率才能提供良好的性能(尤其是在写入小于记录大小的块时,如下所示);您的随机读/写 IOP 和想法将受到 ZFS
recordsize
属性的严重影响,因为 ZFS 通常会传输完整的记录大小的块(小文件除外,其中“小”表示 < 记录大小)。换句话说,在fio
读/写 4K 块时,ZFS 实际上为每个请求的4K 块读/写 32K 块fio
。缓存可以(并且将会)改变这个通用规则,但重点仍然存在:对于大记录大小,吞吐量饱和可能是一个问题。请注意,我并不是说 32K 记录大小是不合理的(尽管我可能会使用 16K 来限制 SSD 的磨损);但是,您需要在评估基准测试结果时考虑它;我会为直通磁盘重新启用物理磁盘缓存,因为 ZFS 知道如何刷新它们的易失性缓存。但是,您需要检查您的 H730P 是否支持直通磁盘的 ATA FLUSHes / FUA(它应该通过同步,但它的手册在这一点上不清楚,我没有实际的硬件可以尝试);
您的
RAIDPool
阵列由机械 HDD 组成,因此其随机读取性能会很低(控制器缓存不会帮助您进行随机读取)。综合考虑,我认为您的结果没有异常;相反,它们并不代表有效的工作量并且被部分误解。如果您真的想比较 ZFS 和 HWRAID+XFS,我建议您使用实际的预期工作负载(即:数据库 + 应用程序 VM 做一些有用的工作)进行测试,同时确保使用ThinLVM(而不是传统的 LVM ) 至少具有与 ZFS 自己的快照/克隆功能相当的快速快照功能。
但是,从某种意义上说,你可以避免做这些测试,仅仅因为结果是可以预测的:
简单的 HWRAID+LVM+XFS 设置对于适合 linux 页面缓存的数据集的顺序 IO 和随机读/写会更快:不受 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 时的 CoW 层 - 请参阅 XFS
dax
选项)。