zfs:刷新缓存但不导出

zfs:刷新缓存但不导出

为了测试,我需要 zfs 的缓存是冷的。

我可以通过移除缓存磁盘、导出和导入池来清除池中的缓存。这可以达到我想要的效果。但我真的不想导出池。

有没有不那么激烈的方法来达到同样的效果?

我所寻找的是相当于:

echo 3 > /proc/sys/vm/drop_caches

它满足我对 ext4 的要求。

背景

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

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

我可以在开发人员机器上导出/导入,但无法在生产中执行此操作。但是,刷新缓存将要在生产中是可以接受的。

我更希望 ARC 仍然有效,这样冷数据在读取后会被缓存(再次类似于 ext4),但我可以忍受在测试期间完全禁用 ARC。

答案1

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

以上内容将会删除几乎所有 ZFS ARC,仅留下与基本池元数据相关的少数 MB。

相关内容