ZFS 性能:极低的写入速度

ZFS 性能:极低的写入速度

我正在运行一个小型家庭服务器。规格如下:

  • 中央处理器:AMD Ryzen 5 2600
  • 内存:32 GB ECC
  • 系统驱动器:128GB NVMe SSD
  • 数据驱动器:3x 4 TB Seagate Barracuda HDD

该服务器运行一些应用程序,如 Nextcloud 或 Gitea,我想在其上运行 1-2 个虚拟机。因此有一些 Web 应用程序、数据库和虚拟机。

应用程序和 qcow2 图像存储在 raidz1 池中:

$ sudo zpool status
  pool: tank
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0

errors: No known data errors

当我在最初几周使用这些应用程序时,我没有遇到任何问题。但几周后,我发现写入速度极低。nextcloud 实例不是很快,当我尝试使用 Windows 10 启动新的 VM 时,它需要大约 5 分钟才能进入登录屏幕。

我进行了一些性能测试fio并得到以下结果:

测试 每秒输入/输出次数 带宽 (KiB/s)
随机读取 37,800 148,000
随机写入 31 127
顺序读取 72,100 282,000
顺序写入 33 134

在发帖之前我做了一些研究,了解到我应该在 zfs 池中添加一个 SLOG,以提高数据库和虚拟机的性能。但目前没有这个选择。我需要先买圣诞礼物 :D

但即使没有 SLOG,我也不认为这些数字是正确的 :(

有人有想法吗?:)

答案1

我自己发现了这个问题。

我看到一篇文章提到 CMR(传统磁记录)和 SMR(叠瓦磁记录),后者的写入性能会下降。我检查了我的硬盘,然后意识到我意外地买了带有 SMR 的硬盘 :(

我将保留镜像池,直到用新的 CMR 驱动器替换驱动器。当我有了新驱动器时,我也将使用镜像池。

谢谢你们!

答案2

作为一阶近似raidz,单个磁盘的随机性能为 7.2K HDD 约为 70 IOPS。您的测试显示 IOPS 减少了 50%(即:~30 vs ~70),这可以通过recordsize您选择的相对较大来解释。

尤其是对于随机写入,任何recordsize大于 4KB 的数据都将面临相当大的读取/修改/写入损失。请注意,我不是主张recordsize在机械磁盘上​​使用如此小的磁盘,因为它需要非常高的元数据开销、高碎片率和(几乎)无压缩。作为参考,在使用 HDD 时,即使对于虚拟化主机,我也保留默认(128KB)记录大小。

您可以执行以下操作来提高性能:

  • 在适用的情况下使用mirrorvs raidz(但您只有 3 个磁盘,无法使用镜像+条带化)
  • 使用 RAW 图像文件而不是 QCOW2(如果确实需要 QCOW2 文件,请确保预先分配其元数据)
  • 尝试设置sync=disabled(但请务必了解,如果突然断电,您的系统将丢失最多 5 秒的写入数据)

答案3

您可以将日志结构文件系统与 SMR 驱动器结合使用。它将多个小写入聚合为一个大写入,因此写入访问大多是连续的。使用 ZFS 配置大型 ARC 会有所帮助。

相关内容