如何解释这些fio带宽结果?

Woo*_*ome 6 zfs storage nvme

fio使用以下设置在新服务器上运行了一些测试:

  • 1 个三星 PM981a 512GB M.2 NVMe 驱动器。
    • Proxmox 在 root 上与 ZFS 一起安装。
    • 创建了 1 个具有 30GB 空间并安装了 Debian 10 的虚拟机。
  • 6 个 Intel P4510 2TB U.2 NVMe 驱动器通过 OCuLink 连接到 6 个专用 PCIe 4.0 x4 通道。
    • 直接连接到单个虚拟机。
    • 在虚拟机中配置为 RAID10(3 个镜像条带化)。
  • 主板/CPU/内存:华硕KRPA-U16 / EPYC 7302P / 8x32GB DDR4-3200

这些磁盘的顺序读取速度高达 3,200 MB/s。从理论角度来看,最大带宽应为 19.2 GB/s。

fio在 ZFS RAID上运行时numjobs=1,我得到的结果范围为 ~2,000 - 3,000 MB/s(在没有 ZFS 或任何其他开销的情况下进行测试时,例如,在运行 Crystal Disk Mark 时,磁盘能够达到完整的 3,200 MB/s)在直接安装在其中一个磁盘上的 Windows 中):

fio --name=Test --size=100G --bs=1M --iodepth=8 --numjobs=1 --rw=read --filename=fio.test
=>
Run status group 0 (all jobs):
   READ: bw=2939MiB/s (3082MB/s), 2939MiB/s-2939MiB/s (3082MB/s-3082MB/s), io=100GiB (107GB), run=34840-34840msec
Run Code Online (Sandbox Code Playgroud)

考虑到一切似乎都是合理的。也可能受到 CPU 限制,因为其中一个核心将处于 100% 负载(其中一些用于 ZFS 进程)。

当我增加到numjobs8-10 时,事情变得有点奇怪:

fio --name=Test --size=100G --bs=1M --iodepth=8 --numjobs=10 --rw=read --filename=fio.test
=>
Run status group 0 (all jobs):
   READ: bw=35.5GiB/s (38.1GB/s), 3631MiB/s-3631MiB/s (3808MB/s-3808MB/s), io=1000GiB (1074GB), run=28198-28199msec
Run Code Online (Sandbox Code Playgroud)

38.1 GB/s - 远高于理论最大带宽。

这里具体的解释是什么?

评论补充:

虚拟机配置:

在此输入图像描述

iotop测试期间:

在此输入图像描述

sho*_*hok 4

第一个fio(带有 的--numjobs=1)顺序执行任何读取操作,除了快速预读/预取之外,对条带配置没有任何好处:iodepth仅适用于通过libaio引擎完成的异步读取,而这又需要真正的支持O_DIRECT(ZFS 缺乏) 。您可以尝试将预取窗口从默认的 8M 增加到 64M ( echo \xe2\x80\xad67108864\xe2\x80\xac > /sys/module/zfs/parameters/zfetch_max_distance)。当然,您的里程可能会有所不同,因此请务必检查这是否会影响其他工作负载。

\n\n

第二个fio(带有 的那个--numjobs=8)可能受到 ARC 缓存的影响。可以肯定的是,只需打开另一个正在运行的终端dstat -d -f:您将看到每个磁盘的真实传输速度,并且它肯定与其理论最大传输速率一致。您还可以fio使用新启动的计算机(因此使用空 ARC)重试测试,看看情况是否发生变化。

\n