我如何防止ntfs-3g使用饿死我的ZFS ARC的内存?

我有一台基于Debian GNU / Linux 7(wheezy)的运行OpenMediaVault 2.1.18(Stone刻录机)的HP Microserver。

前几天,我需要从一个USB驱动器复制大量的文件,用NTFS格式化。 我连接它,装上它,开始复制,然后完成。

一天之后,我发现它几乎没有复制任何东西,而且我的NAS性能也一塌糊涂。 调查发现,页面缓冲区和缓冲区caching现在占用了超过3/4的系统内存(一起使用的时间通常less于10%),ZFS ARC现在被挤压到剩余的内存中(小于正常大小的1/4 )。

当我意识到出了什么问题的时候,我停止了拷贝,卸载并拔掉了驱动器,很快caching恢复到了正常的大小,然后ARC开始恢复到正常的水平。

所以,如果将来需要做更多的直接复制,我该如何防止挂载ntfs驱动器,导致大量的内存消耗,使得我所需要的内存不足ZFS ARC?


注意:正如shodanshok所 build议的 ,我尝试运行echo 3 > /proc/sys/vm/drop_caches (根据man 5 proc “free pagecache,dentries and inodes”),但是这也冲刷了我的ARC(除了需要caching的内存L2ARC标题)。 因此,我的系统有很多可用的内存,但是由于事情只能在ARC或L2ARC中caching,所以我的系统花了很多时间来驱动硬盘来重新填充ARC,而不是一个理想的状态。


在这张图片中,你可以看到5号开始时的ZFS饥饿,当我开始我的NTFS拷贝时,在6号早期卸载NTFS驱动器时,事情恢复正常,最后ARC被清除(并重build)在7日下午使用drop_caches。

ARC饿死

最简单的解决scheme是定期刷新缓冲区和页面caching内存。 你可以在后台(或者在另一个tty)轻松地运行一个类似的bash行:

while true; do echo 3 > /proc/sys/vm/drop_caches; sleep 5; done

更新:因为似乎上述解决scheme不能按需要工作,您可以尝试一种不同的方式来避免污染缓冲区/页面caching。 基本上,您需要使用DIRECT_IO复制每个文件,完全绕过页面caching。 您可以使用类似于以下的命令来执行此操作:

dd if=srcfile of=dstfile bs=1M iflag=direct

上面的命令是使用O_DIRECT选项打开src文件,在读取期间绕过页面caching, 而不是在写入期间 。 如果您需要绕过写caching,则可以追加更多的oflag=direct选项。

上述解决scheme的真正问题是,您必须逐个指定一个文件,执行多个(可能是数千个)文件。 这意味着你必须在dd周围编写脚本,这样才能复制整个目录三。

其他选项包括:

  • 使用ddrescue而不是dd
  • 首先装载libdirectio时使用一个简单的cp (详情请看这里 )

更新2:

看起来, echo 1 > /proc/sys/vm/drop_caches可以释放大部分缓冲区和页面caching,而不会释放ARC,所以这可能是一个很好的解决方法:

 while true; do echo 1 > /proc/sys/vm/drop_caches; sleep 5; done