ZFS 重复数据删除(再次):内存使用情况是否取决于存储的物理(重复数据删除、压缩)数据或逻辑使用?

ZFS 重复数据删除(再次):内存使用情况是否取决于存储的物理(重复数据删除、压缩)数据或逻辑使用?

我已经在 Google 上搜索了很多次,但找不到足够的信息。经验法则似乎是 5GB RAM 对应 1TB 存储空间。但存储到底是什么?是物理存储还是逻辑存储?

假设我有一块 6TB 的硬盘,没有重复数据删除,也没有压缩。我有 6TB 的实际数据。假设它以 2:1 的比例进行重复数据删除,数据量减少到 3TB。我们(大约)需要 3 * 5GB 内存,还是 6 * 5GB?

据我了解,这取决于记录。由于我无法在磁盘上存储超过 6TB 的实际记录,因此大约 30GB 应该足够了,无论压缩/重复数据删除率如何,当然这取决于实际记录大小?

问题是,我们想计算一下什么更便宜:用更大的磁盘替换 6 * 6TB 磁盘(3x 现场存储/镜像/热备用,3x 异地,这些盒子中没有更多可用插槽)进行备份,或者为两个盒子都购买一些 RAM。

(免责声明:我不是系统管理员,但有人需要戴上这顶帽子,这样我们才能继续备份。)

答案1

虽然 user121391 的答案大部分是正确的,但是元数据的 1/4 限制不再存在/很长时间不存在这种情况:

ZFS ARC 缓存中分配给元数据的空间是有限制的(重复数据删除表也属于这一类),上限是 ARC 大小的 1/4

首先,zfs_arc_meta_limit(可用于元数据(包括重复数据删除表)的缓存内存量)始终是可调的(如果我没记错的话)。因此,即使在非常旧的 ZFS 版本中,25% 可能是默认值,您也可以使用该设置来调整可用于元数据的缓存量。对于大多数用户数据很少被访问的备份系统,>=75% 的元数据 + <=25% 的用户数据可能更合适。请记住,所述可调参数是可用的内存量(以字节为单位),而不是百分比。

根据您的 ZFS 实现,还请考虑以下事项:


为了Oracle Solaris 11 中的 ZFS,这个限制早已默认被彻底取消:

在实施此更改之前,ARC 将元数据限制为内存的四分之一。无论以前这样做的理由是什么,现在它都会对重复数据删除性能产生严重的不利影响。由于 DDT 被视为元数据,因此它受 1/4 限制。目前,此限制已过时;可以将其消除(或者更确切地说,设置为 arc_c)。

因此,虽然您仍然可以设置限制,但不再建议这样做。


为了Linux 上的 ZFS 最高 0.6.x例如在 Ubuntu 16.04 中默认值似乎是 75%:

zfs_arc_meta_limit (ulong):ARC 中允许元数据缓冲区使用的最大大小(以字节为单位)。达到此限制时,即使未达到整体 arc_c_max,元数据缓冲区也将被回收。此值默认为 0,表示 ARC 的 3/4 可用于元数据。

如果您想要确保始终为元数据保留最少量的内存,也可以进行调整:

zfs_arc_meta_min (ulong):ARC 中元数据缓冲区可占用的最小允许大小(以字节为单位)。此值默认为 0,表示禁用 ARC 专用元数据量的下限。

Linux 0.7.0 上的 ZFS,似乎有一种方法可以通过百分比限制来调整内存量:

zfs_arc_meta_limit_percent (ulong):可用于元数据的 ARC 缓冲区百分比。另请参阅zfs_arc_meta_limit其用途类似,但如果设置为非零值则具有更高的优先级。


如果您打算使用基于 Linux 的 ZFS 实现,在花费大量 $$$ 购买硬件之前,请考虑在虚拟机中模拟您的用例。我建议测试重复数据删除的最坏情况(=100% 随机数据)。如果您手头没有必要的虚拟化资源,请注意,您总是可以在大多数云提供商上以很少的钱在几个小时内启动非常大的实例。

最后要考虑的一件事是:您始终可以调整 ZFS 记录大小。一般来说,较小的记录大小将产生更好的重复数据删除率(但显然需要更多的 RAM 用于重复数据删除表)。较大的记录大小将产生更差的重复数据删除率,但需要更少的 RAM 用于重复数据删除表。例如:虽然我们目前没有在 ZFS 备份存储上使用重复数据删除,但我已将 ZFS 记录大小设置为 1M,以匹配我们的备份应用程序正在使用的块大小。

不确定为什么我刚刚写了一篇关于 ZFS 元数据缓存的博士论文,但我希望它有所帮助。:)

答案2

该计算是根据重复数据删除之前的实际池大小进行的,或者更准确地说,是根据池中存储的块数进行的(每个块在 DDT 上需要大约 320 字节的空间,所需的块数取决于实际存储的数据)。因此,您可以根据经验假设 6 * 5 = 30。

但这并不是所需要的全部,正如本文所述出色的重复数据删除指南

重复数据删除的总 RAM 成本

但仅仅知道重复数据删除表的大小是不够的:ZFS 需要在内存中存储的不仅仅是重复数据删除表,还包括其他元数据,当然还有缓存的块数据。ZFS ARC 缓存中分配给元数据的空间是有限制的(重复数据删除表也属于这一类),上限为ARC 尺寸的 1/4

换句话说:无论您估计的重复数据删除表大小是多少,如果您想将所有重复数据删除表保留在 RAM 中,则 RAM 中至少需要四倍于此的容量。此外,还要将任何额外的 RAM 用于其他元数据,例如块指针和其他数据结构,这样 ZFS 就不必为每个要访问的块找出通过池内数据结构的路径。

因此,经验法则扩展为:

  • 对于每个 TB 的池数据,您应该预期有 5 GB 的重复数据删除表数据,假设平均块大小为 64K。
  • 这意味着如果您想将重复数据删除表保存在 RAM 中,您应该为每 TB 池数据规划至少 20GB 的系统 RAM,再加上用于其他元数据的额外内存,以及用于操作系统的额外 GB。

就您而言,这大约相当于 120+ GB 的 RAM,因此对于当前的 Xeon E5 服务器主板(每个 CPU 通常有 128 - 512 GB 的 RAM)来说并非不可能。本文还包含一个实际示例,应该对您有所帮助。

相关内容