我正在运行一个小型家庭服务器。规格如下:
- 中央处理器: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)记录大小。
您可以执行以下操作来提高性能:
- 在适用的情况下使用
mirror
vsraidz
(但您只有 3 个磁盘,无法使用镜像+条带化) - 使用 RAW 图像文件而不是 QCOW2(如果确实需要 QCOW2 文件,请确保预先分配其元数据)
- 尝试设置
sync=disabled
(但请务必了解,如果突然断电,您的系统将丢失最多 5 秒的写入数据)
答案3
您可以将日志结构文件系统与 SMR 驱动器结合使用。它将多个小写入聚合为一个大写入,因此写入访问大多是连续的。使用 ZFS 配置大型 ARC 会有所帮助。