我有一个运行 Samba 的 NAS,它有一个 20T ZFS 池和一个带有两个旋转 rust 驱动器的 raid1 vdev。我的机器现在有 16G RAM。该存储用于持续增长的视频片段的永久备份存档。它是一次写入,一次读取以进行处理,然后可能进行备份恢复。
我定期将 40GiB 文件发送到此 NAS。我打算将我的千兆网络升级到 10GbE,以减少这个过程的痛苦。但是我怀疑我会受到底层驱动器的写入速度的限制。
我的理解是 ZIL 和 SLOG 仅加速同步写入,因此添加 nvme SSD 作为 SLOG 不会影响我的用例,因为我相信 Samba 默认使用异步写入。
我不确定是否为同步写入配置 samba 并在 nvme SSD 上添加 SLOG 是否可以满足我的需要。我知道如果驱动器发生故障或断电,这会带来数据丢失的风险。这是可以接受的,因为我将源计算机上的文件保留足够长的时间,以便在近期数据丢失的情况下重新传输。SSD 的磨损是一个问题,但典型的驱动器有 300 TBW 或以上,足以将我永不删除的 NAS 填充 15 次,或者以当前的数据生成速率在 75 年内填充,我对此表示满意,并且如果/当 SSD 损坏时,请购买新的 SSD。这些是可以接受的警告。通常我会尝试进行基准测试,但在目前一切都短缺的情况下,我想提前知道我需要为此购买什么。
我知道我可以将更多的 raid 1 vdevs 添加到池中以获得 raid 10 池,但这太贵了,中塔机箱无法支持那么多驱动器,它与现有驱动器一起严重超出了池的配置,并且会使用更多的能量是时候让所有的铁锈继续旋转了。
除了以 raid 10 的方式向池中添加更多的旋转 rust 之外,我还有哪些选择可以为这个 zfs 池实现超过 10Gbps 的写入速度以获取至少 40GiB 的数据?
同步写入模式可确保写入立即在持久位置结束。使用异步写入,数据缓存在 RAM 中,写入调用立即完成。文件系统会将实际写入安排到最终位置(硬盘)。
在 ZFS 的情况下,ZIL / SLOG 的重点是充当一个快速的临时持久存储,它允许同步模式,即确保写入客户端的写入是最终的。否则文件系统将需要直接将块写入硬盘,这会使同步模式变慢。
在您的情况下,如果您想确保全速写入 40 GB 数据,那么您应该增加 RAM 大小以覆盖文件的大小。
但是,由于 FS 立即开始写入硬盘,因此您不需要 40GB 内存即可获得全速写入。例如,当客户端写入 20GB 数据时,10GB 可能在 RAM 缓存中,其余 10GB 已经在硬盘驱动器中。
因此,您需要进行一些基准测试以查看需要多少 RAM 才能获得全速写入。
如果您可以容忍最多 5 秒的写入丢失,您可以简单地将 ZFS 配置为使用以下命令忽略同步请求
zfs set sync=disabled tank
强制所有写入通过 SLOG,即使是非常快的写入,也永远不会比绕过同步请求快。SLOG 不是经典的回写缓存,它吸收写入以将它们降级到较慢的层。相反,它是通过将同步写入(并且仅它们)临时存储在中间快速存储中来提供低延迟持久性的一种手段。几秒钟后,相同的写入将从主内存转移到主池。在发生崩溃(和恢复)之前,永远不会读取 SLOG。
也就是说,使用单个基于 HDD 的镜像 vdev,您将永远无法使 10 Gbs 链路饱和。要以约 1 GB/s 的速度持续写入,您需要在 raidz2中至少10 个 HDD 或在镜像+条带化中至少 12+ 个 HDD。或者,更好的是,您需要一个全 SSD 池。这甚至在考虑事物之前
recordsize
,compression
等等。编辑,澄清 SLOG 工作:
为了最大限度地减少同步写入的延迟,ZFS 使用了所谓的 ZFS Intent Log (ZIL)。简而言之:每次同步写入到达时,ZFS 都会立即将它们写入一个名为 ZIL 的临时池区域。这使写入能够立即返回,让调用应用程序继续。几秒钟后,在事务提交时,写入 ZIL 的任何记录都会回复到主池。这并不意味着每次提交时都会读取 ZIL;相反,要写入的数据来自主DRAM ARC缓存。换句话说,ZIL 是一种“提前记录日志”,可确保要写入的同步数据的快速数据持久性。
这实际上意味着同步写入是重复的:它们同时写入ZIL和主池。输入SLOG(分离日志设备):专用于同步写入的设备- 即:它将主池从 ZIL 流量中释放出来。快速的 SSD SLOG 很重要,因为 HDD 的同步写入速度非常慢。SLOG 不是您的经典写回缓存,因为:
这两点结合起来意味着一个大的 SLOG 基本上是浪费的,因为它只需要 ZFS 事务的最大大小的 3 倍。换句话说,2-4 GB SLOG 对于大多数情况来说就足够了,更大的 SLOG 仅在特定设置中有用。
这样的 SLOG 是为随机同步写入提供较低延迟的关键,但是,虽然它可以吸收非常小的顺序同步写入峰值,但这不是它的主要功能。换句话说,您可以将 ZIL/SLOG 视为 ARC 的持久切片。推论是你不能指望通过 SLOG 写入几十 GB 并隐藏缓慢的主池速度,因为这意味着你在基于 RAM 的 ARC 中已经有几十 GB 的脏数据。
设置
sync=disabled
指示 ZFS 像普通异步写入一样威胁所有写入,甚至是同步写入。这将绕过任何数据 ZIL/SLOG,如果您可以接受 5 秒的数据丢失窗口,这是您可以实现的更快设置- 即使与 Optane 或 RAMdrive 等非常快的 SLOG 相比也是如此。好处sync=disabled
是它不会禁用 ZFS 自己的元数据的同步写入,因此不会使您的文件系统处于危险之中。这并不意味着您可以轻易使用它:如多次所述,您应该确保了解其含义(在崩溃/断电的情况下,您可能会丢失最后几秒钟的未同步数据)。另一方面,经典的基于 SSD 的回写缓存可以(或多或少)有效地使用数百 GB 的 SSD 缓存来掩盖主池延迟/吞吐量 - 特别是因为它们
lvmcache
是成熟的回写缓存,不需要将它们的数据保存在主存中(相反,主存通过这些 SSD 缓存自行刷新)。bcache
ZFS 背后的原因是(大)主系统内存是您真正的读/写缓存,而 SLOG 是降低随机同步写入延迟的一种手段。