我可以在不使用文件缓存的情况下更快地复制大文件吗?

Vea*_*zer 20 kernel cache memory-usage

添加preload包后,我的应用程序似乎加快了速度,但如果我复制一个大文件,文件缓存会增长两倍以上的文件大小。

通过将单个 3-4 GB 的虚拟机图像或视频文件传输到外部驱动器,这个巨大的缓存似乎从内存中删除了所有预加载的应用程序,导致加载时间增加和总体性能下降。

有没有办法复制大的、多千兆字节的文件而不缓存它们(即绕过文件缓存)?或者一种将特定文件夹列入白名单或黑名单以防止缓存的方法?

小智 24

有一个nocache实用程序,它可以添加到像ioniceand 之类的命令之前nice。它通过预加载它增加了一个图书馆posix_fadvisePOSIX_FADV_DONTNEED标志所有打开的呼叫。

简单来说,它告诉内核该特定文件不需要缓存;内核通常不会缓存文件。有关技术细节,请参见此处

它对任何大型复制作业都有奇效,例如,如果您想在后台备份一个多 TB 的磁盘,同时对您正在运行的系统的影响最小,您可以做一些事情nice -n19 ionice -c3 nocache cp -a /vol /vol2

Ubuntu 13.10 及更高版本将提供一个软件包。如果您使用的是以前的版本,您可以安装13.10 软件包或选择François Marier 的12.04 backport


ish*_*ish 12

对于单一大文件,使用dd带有直接I / O,以绕过文件缓存:

如果您想传输一个(或几个)多 GB 的大文件,使用以下方法很容易dd

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
Run Code Online (Sandbox Code Playgroud)
  • 这些direct标志告诉在读写时dd使用内核的直接 I/O 选项 ( O_DIRECT),从而完全绕过文件缓存。
  • bs块大小选项必须设置为一个相当大的值,因为,以尽量减少物理磁盘操作的数量dd必须执行,因为读/写操作都不再缓存,并可能导致严重的经济放缓太多的小的直接操作。
    • 随意尝试 1 到 32 MB 的值;上面的设置是 4 MB ( 4M)。

不幸的是,对于多/递归目录副本,没有容易使用的工具;通常的cp支持直接 I/O。

/e iflags & oflags 更改为正确的 iflag & oflag