dte*_*ech 4 performance zfs storage memory
我正在配置一台运行 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 并使用完整 TB 的 L2ARC,我会很高兴,但似乎 L2ARC 标头数据至少需要一些 ARC。
因此,考虑到 1 TB 的 L2ARC 容量和 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 。
首先,我真的建议您重新考虑池 n.2 和 n.3 的布局:三向镜像不会为您提供低延迟,也不会为您提供高带宽。我不会使用昂贵的 1 TB NVMe 磁盘用于 L2ARC(顺便说一句,由于 32 GB ARC 较小,所以不平衡),我会以 RAID10 方式使用更多 7200 RPM 磁盘,甚至更便宜但可靠的 SSD(例如:三星 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 也是如此;最后,您可以将 ZFS 实例设置为将超过(默认)50% 的 RAM 用于 ARC(zfs_arc_max
在模块手册页中查找)