我安装了 Solaris 11.3,其中有一个 ZFS 池,由 5 个 vdev 条带组成,每个条带由三个 10K SAS 磁盘组成。我还配置了一个包含镜像 vdev 的 SLOG。我将 ZFS 调整参数设置为以下内容:
zil_slog_limit: 1073741824
zfs_txg_timeout:256
zfs_vdev_max_pending: 256
zfs_immediate_write_sz: 67108864
当我使用以下命令写入文件系统时,写入性能比预期慢得多async=always
(我正在尝试确定当此文件系统通过 NFS 安装且同步 VM 磁盘映像时我可以预期的最佳性能)。当我运行
time dd if=/dev/urandom of=testfile bs=512 count=10000
在 SLOG 中,我获得了大约 100 IOPS/vdev(2 磁盘镜像 10K SAS 磁盘)(因此,在 SLOG 中使用一个 vdev 大约需要 100 秒,在 SLOG 中使用两个 vdev 大约需要 50 秒)。我没有额外的驱动器可以在阵列中试用,但这种一个设备与两个设备的行为表明 SLOG vdev 正在运行。我还用来zpool iostat -v 5
验证它们是否是我在运行测试时唯一可以写入的设备(除了 SLOG 刷新时的数据磁盘)。每秒的写入量大约与zpool iostat
我从计时中获得的 IOPS 相匹配dd
。
我的印象是 SLOG 应该几乎完全按顺序写入;我期望随机写入的速度是 100 IOPS。
编辑:我尝试了类似的事情,使用一台运行 FreeNAS 的备用机器。该机器有两个镜像驱动器 + 一个非镜像 SLOG。如果使用 HDD 作为 SLOG,则池中的 IOPS 是随机 I/O 缓慢,而不是连续缓慢,而使用 SSD 时则 >10k IOPS。
我的理解中是否缺少了什么?或者我需要更改哪些参数?提前致谢!
答案1
SLOG 设备用于在发生电源故障时为您提供安全性,以防出现许多并发写入。因此,如果断电,数据将被写入 LOG 设备,但随后会定期(几秒钟)从内存刷新到磁盘,而不是从 LOG 设备刷新。在正常情况下,LOG 设备不会被读取,它们不是缓存设备,如果您的机器崩溃并在将数据刷新到磁盘之前丢失 RAM 内容,那么 ZFS 将从 LOG 设备读取并从那里刷新。这就是我们使用 SSD 作为 LOG 设备的原因。
这是一篇关于该主题的好文章,请查看:https://www.ixsystems.com/blog/o-slog-not-slog-best-configure-zfs-intent-log/