针对特定用途的存储应用的最佳 ARC 和 L2ARC 设置

针对特定用途的存储应用的最佳 ARC 和 L2ARC 设置

我正在配置一台运行 3 个 ZFS 池的服务器,其中 2 个是特定用途的,我觉得默认建议根本没有针对它们进行优化。网络由双 10gbit 适配器提供便利。

池 1 是一个大型文件存储,其中包含很少写入和读取的原始视频数据,以及偶尔的备份。缓存该池中的任何内容完全没有意义,因为它是高带宽数据,从头到尾一次读取,缓存其中的任何内容都会完全浪费内存。延迟不是大问题,由于数据高度可压缩,带宽充足。该池由 8 个 z2 模式的 HDD 组成,可用容量为 24TB。

池 2 是压缩视频帧存储。在合成视频项目时,经常读取此内容的某些部分。经常使用的数据部分通常高于服务器的总 RAM 量,延迟要求低,但不是超低,带宽更重要。池由 z1 中的 3 个 HDD 组成,可用容量为 8TB,以及用于 L2ARC 的 1TB NVME SSD。

池 3 是通用存储,用作多个计算机系统的存储,这些计算机系统从池中启动和运行软件,而不是从本地存储中启动和运行软件。由于它必须为多台机器和主系统存储提供服务,因此此处对延迟和带宽的要求最高。此池主要是读取,写入仅限于客户端系统执行的操作。该池由 3 个 z1 模式的 SATA SSD 组成,可用容量为 1TB。

我的优化目的是尽量减小前两个池的 ARC 大小,以便最大化第三个池的 ARC 大小。

池 1 根本无法从缓存中获得任何好处,那么我可以为其设置的 ARC 的最小安全量是多少?

池 2 可以从 ARC 中受益,但实际上并不值得,因为 L2ARC 的速度足够快,并且驱动器具有 1 TB 的容量。理想情况下,如果我可以不使用任何 ARC 来处理此卷,并使用完整的 L2ARC TB,我会很高兴,但似乎至少需要一些 ARC 来处理 L2ARC 标头数据。

因此,考虑到 L2ARC 容量为 1 TB,池记录大小为 64k,1tb / 64kb * 70b 等于 ~0.995gb。这是否意味着我可以安全地将该池的 ARC 限制为 1GB?或者可能需要更多?

ARC 似乎既包含读取缓存,也包含处理 L2ARC 的信息,因此看起来我需要一些选项来强调管理更大的 L2ARC,而不是费心在 RAM 中缓存实际数据。并且如果有必要,如果缓存驱逐策略不符合通常的缓存层次结构策略,则强制要求将来自 ARC 的任何缓存驱逐移至 L2ARC。

我读过的一般建议是每 1TB 存储大约需要 1GB RAM,我计划每 33TB 存储需要 32GB RAM,我几乎完全同意,但 L2ARC 与 ARC 的比例是 4 或 5 比 1,我远远达不到这个比例。目标是将池 1 ARC 削减到尽可能低,并将池 2 ARC 削减到仅需要的量,以便能够利用整个 1TB 的 L2ARC,从而最大化池 3 ARC 可用的 RAM。

答案1

首先,我真的建议您重新考虑池 n.2 和 n.3 的布局:三向镜像不会为您带来低延迟或高带宽。我不会使用昂贵的 1 TB NVMe 磁盘用于 L2ARC(顺便说一句,由于 32 GB ARC 较小,因此不平衡),而是使用更多 7200 RPM 磁盘以 RAID10 方式或更便宜但可靠的 SSD(例如:Samsung 850 Pro/Evo 或 Crucial MX500)。

至少,您可以将所有磁盘放在单个 RAID10 池(带有 SSD L2ARC)上,并根据多个数据集对单个池进行细分。

primarycache也就是说,您可以使用和选项指定如何在每个数据集上使用 ARC/L2ARC secondarycache

  • zfs set primarycache=none <dataset1> ; zfs set secondarycache=none <dataset1>将禁用任何ARC/L2ARC 数据集缓存。您还可以zfs set logbias=throughput <dataset1>在写入操作期间发出特权吞吐量而不是延迟;
  • zfs set primarycache=metadata <dataset2>将为第二个数据集启用仅元数据缓存。请注意,L2ARC 由 ARC 提供;这意味着如果 ARC 仅缓存元数据,则 L2ARC 也是如此;
  • 保留第三个数据集的 ARC/L2ARC 默认选项。

最后,你可以将 ZFS 实例设置为使用超过 50% 的 RAM(默认值)用于 ARC(zfs_arc_max模块手册页

相关内容