我正在运行一个小型家庭服务器。规格是:
- CPU:AMD锐龙5 2600
- 内存:32 GB ECC
- 系统驱动器:128GB NVMe SSD
- 数据驱动器:3x 4 TB Seagate Barracuda HDD
服务器运行一些应用程序,如 Nextcloud 或 Gitea,我想在其上运行 1-2 个 VM。所以有一些网络应用程序、数据库和虚拟机。
应用程序和 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
,得到了以下结果:
测试 | IOPS | 带宽 (KiB/s) |
---|---|---|
随机读取 | 37,800 | 148,000 |
随机写入 | 31 | 127 |
顺序读取 | 72,100 | 282,000 |
顺序写 | 33 | 134 |
在发帖之前我做了一些研究,并读到我应该将 SLOG 添加到 zfs 池中,以获得更好的数据库和 VM 性能。但这目前是没有选择的。我需要先得到圣诞礼物 :D
但即使没有 SLOG,我也不认为这些数字是正确的 :(
有人有想法吗?:)
一阶近似值
raidz
提供单个磁盘的随机性能,对于 7.2K HDD 而言约为 70 IOPS。您的测试显示 IOPS 减少了 50%(即:~30 vs ~70),这可以用recordsize
您选择的相对较大来解释。特别是对于随机写入,任何
recordsize
大于 4KB 的内容都将面临相当大的读取/修改/写入损失。请注意,我不recordsize
提倡在机械磁盘上使用这么小的磁盘,因为它会导致非常高的元数据开销、高碎片和(几乎)没有压缩。作为参考,当使用 HDD 时,即使对于虚拟化主机,我也会保留默认 (128KB) 记录大小。您可以执行以下操作来提高性能:
mirror
vsraidz
(但您只有 3 个磁盘,防止使用镜像+条带化)sync=disabled
(但请务必了解,如果突然断电,您的系统将丢失最多 5 秒的写入数据)我自己发现了问题。
我看到一篇文章提到了CMR和SMR。我检查了我的驱动器,发现我不小心用 SMR 购买了硬盘 :(
在用新的 CMR 驱动器替换驱动器之前,我将保留一个镜像池。当我拥有新驱动器时,我还将使用镜像池。
谢谢你们!