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,延迟增加了四倍多?两种情况下的表现不应该差不多吗?