zfs:刷新缓存而不导出

Ole*_*nge 5 zfs-l2arc zfsonlinux

为了进行测试,我需要 zfs 的缓存处于冷状态。

我可以通过删除缓存磁盘、导出和导入池来刷新池中的缓存。这给出了我想要的效果。但真的不想导出池。

有没有更简单的方法来达到同样的效果?

我正在寻找的是相当于:

echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

这满足了我对 ext4 的需求。

背景

我可以用不同的方式运行我的算法。我不关心最好情况下的性能。我确实关心最坏情况下的性能。最坏的情况是冷数据(很久以前接触过的数据,不再存在于 ARC/L2ARC 中)。

为了选择运行算法的最佳方式,我需要能够在相同的测试集上运行。而且这个测试集必须是冷的。这完全违背了 ZFS 的缓存策略:如果我一次又一次地在同一个测试集上运行,它会将数据放入 ARC 中 - 这在正常情况下是完全有意义的,但在这里不是。

我可以在我的开发计算机上导出/导入,但无法在生产中执行此操作。然而,刷新缓存在生产中可以接受的。

我更喜欢 ARC 仍然有效,因此冷数据在读取后会被缓存(再次类似于 ext4),但我可以在测试期间完全禁用 ARC。

sho*_*hok 4

echo 3 > /proc/sys/vm/drop_caches 用于清除 ZFS 缓存,但最近的一些提交将其更改为仅部分清除它。

要恢复旧的行为,必须将zfs_arc_shrinker_limit模块参数设置为0(请参阅此处)。

因此,要删除 ARC 而不导出池:

echo 0 > /sys/module/zfs/parameters/zfs_arc_shrinker_limit
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

上述操作将删除几乎所有 ZFS ARC,仅留下与基本池元数据相关的少量 MB。