ZFS ARC 缓存和 Linux 缓冲区缓存争用(Ubuntu 16.04)

ZFS ARC 缓存和 Linux 缓冲区缓存争用(Ubuntu 16.04)

我的测试系统设置是一个简单的 raidz 5 磁盘(每个 8 TB)zpool,带有 256 GB RAM。性能一开始不错,吞吐量达到约 650 MB/秒。最终,Linux 缓冲区缓存填满并开始导致 ZFS ARC 缓存缩小,直到其大小达到约 32 MB。一旦发生这种情况,吞吐量就会下降到约 60 MB/秒。

我尝试了一些内核调整选项,例如将 vm.vfs_cache_pressure 设置为 200,但并没有改变问题的发生。

我目前的解决方法是将 /sys/module/zfs/parameters/zfs_arc_min 设置为 128 GB,将 zfs_arc_max 设置为 252 GB。由于 Linux 缓冲区缓存,ARC 永远不会超过 128 GB,但整个数据传输过程中的性能保持在 650 MB/秒的吞吐量水平。

理想情况下,我希望能够完全禁用 Linux 缓冲区缓存,并让 ZFS ARC 缓存的内存介于 0 到 256 GB 之间,其余内存可用于应用程序工作负载。如果可以赋予 ZFS ARC 缓存比 Linux 缓冲区缓存更高的优先级,这也是一个可以接受的答案,因为它可以有效地禁用 Linux 缓冲区缓存。

谢谢,扎克

编辑 1:我试图解决的问题是 Linux 缓冲区缓存将 ZFS ARC 从内存中逐出。我希望应用程序工作负载能够使用所有内存,并且 ZFS ARC 会相应缩小。作为解决方法,我必须将 ZFS ARC 最小大小设置为一个大值,因为如果将最小大小设置为 0,Linux 缓冲区缓存会将 ARC 从内存中逐出。

答案1

设置最小 ARC 值。这就是所需的全部内容。

ARC 将根据需要增大/缩小。占用缓冲区缓存的任何东西都不能位于 ZFS 文件系统上。这台服务器在做什么?

答案2

尝试使用syncmount 选项挂载您的 NFS 目录。

此外,为了限制 Linux 页面缓存的使用,您可以定期运行echo 3 > /proc/sys/vm/drop_caches

编辑:正如 eewhite 评论所说,最后一个命令似乎不仅删除了页面缓存,还删除了 ARC。因此,请谨慎发出该命令,并且仅在必要时发出。

echo 1 >/proc/sys/vm/drop_caches将触及 Linux 缓冲区缓存,但不影响 ARC

相关内容