问题描述
添加 preload
包后,我的应用程序似乎加快了速度,但如果我复制大文件,文件缓存的增长量将是文件大小的两倍以上。
通过将单个 3-4 GB 虚拟盒图像或视频文件传输到外部驱动器,这个巨大的缓存似乎会从内存中删除所有预加载的应用程序,从而导致加载时间增加和总体性能下降。
有没有办法复制大型 multi-gigabyte 文件而不缓存它们(即绕过文件缓存)?或者将特定文件夹列入白名单或黑名单以防止缓存的方法?
最佳答案
有 nocache
实用程序,它可以添加到 ionice
和 nice
等命令之前。它的工作原理是预加载一个库,该库将带有 POSIX_FADV_DONTNEED
标志的 posix_fadvise
添加到任何打开的调用中。
简单来说,它通知内核该特定文件不需要缓存;内核通常不会缓存该文件。有关技术详细信息,请参阅 here。
它对于任何大型复印工作都有奇迹,例如。 G。如果您想在后台备份多 TB 磁盘,同时对正在运行的系统影响最小,您可以沿着 nice -n19 ionice -c3 nocache cp -a /vol /vol2
执行某些操作。
Ubuntu 13.10 及更高版本中将提供一个软件包。如果您使用的是以前的版本,则可以安装 13.10 package 或选择 Fran\xe7ois Marier 的 this 12.04 backport。
次佳答案
对于单个大文件,使用带有直接 I/O 的 dd
来绕过文件缓存:
如果您想传输一个(或几个)大的 multi-gigabyte 文件,使用 dd
很容易做到:
dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
-
direct
标志告诉dd
在读写时使用内核的直接 I/O 选项 (O_DIRECT
),从而完全绕过文件缓存。 -
这
废话
必须将 blocksize 选项设置为相当大的值,以便最大限度地减少物理磁盘操作的数量
DD
必须执行,因为读/写不再被缓存,太多的小型直接操作可能会导致严重的速度减慢。\n
-
请随意尝试 1 到 32 MB 的值;上述设置为 4 MB (
4M
)。
\n
-
不幸的是,对于多个/递归目录副本,没有易于使用的工具;常见的cp
等不支持直接I/O。
/e iflags & oflags 更改为正确的 iflag &奥弗拉格