为什么我的 SLOG 会减慢顺序同步写入速度?

为什么我的 SLOG 会减慢顺序同步写入速度?

我临时搭建了一个 TrueNAS 服务器来运行一些测试,为正式构建 NAS 做准备。我拿到了一台较旧的 Xeon 服务器,它有 256GB RAM 和 10GbE NIC,为其配备了 6 个 SATA 磁盘,配置为 3 个镜像 vdev,并安装了最新的 TrueNAS Core 版本。我还添加了一个 850 Pro SSD 作为 SLOG(我知道 - 这只是为了进行粗略的性能测试)。

数据集通过 NFS 安装(使用默认设置,即启用同步),并且邦尼++用于测试读写性能。结果大致符合预期,但当我从池中移除 SLOG 后,块顺序写入性能提高了五倍(480M/s vs 107M/s)。其他一切保持不变。

我不明白当不存在 SLOG 时 ZFS 如何在池磁盘之间安排 ZIL,但即使它可以使用所有六个旋转磁盘的吞吐量,我也会预计它会比 SSD 提供的标称 500MB/s 慢。

我发现了一个问题GitHub这似乎可以解释这种行为,但这个问题不久前就解决了。还有其他解释吗?

编辑(回答评论和进一步测试中的问题):

sync设置为standard,我将所有参数保留为其默认值(除了atime=offcompression=on)。

和测试ddfio初段绍克给出了一致的结果:使用 SLOG 时 ~570kB/s,不使用 SLOG 时 ~380kB/s,正如预期的那样。

我运行了更多fio工作负载,并将在下面展示每个工作负载的 SLOG / NOSLOG 加速。每个工作负载都没有oflag=sync,但由于 NFS 同步挂载,每个文件或循环周期结束时仍应有同步:

  • --rw=write --loop=1000 --size=8k:1.67
  • --rw=write --loop=10 --size=32M0.44
  • --rw=write --loop=1 --size=1G:1.07

我没有做任何进一步的 bonnie++ 测试,因为还有一个我最初没有提到的额外复杂因素:bonnie++ 分配一个两倍于系统内存的文件,以减少缓存效果。由于我的测试机器有大量 RAM,所以我在内存受限的 cgroup(memory.limit_in_bytes=4G)中运行测试。内存限制、大文件写入和 SLOG/ZIL 之间似乎存在一些交互,我不明白。

答案1

大型顺序同步写入可以通过主池磁盘(6 个磁盘,而非单个 SSD)高效处理,而 SLOG 主要用于小型随机的同步写入。此外,您用作 SLOG 的 SSD 在执行同步写入时速度不是特别快(它没有断电保护的 DRAM 缓存)。

您的bonnie++结果似乎因客户端或服务器端缓存而出现偏差,因此我会丢弃它们。作为最佳实践,请始终使用一些实际工作负载来评估您的系统性能。

相关内容