当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

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

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

有没有办法复制大型 multi-gigabyte 文件而不缓存它们(即绕过文件缓存)?或者将特定文件夹列入白名单或黑名单以防止缓存的方法?

最佳答案

nocache 实用程序,它可以添加到 ionicenice 等命令之前。它的工作原理是预加载一个库,该库将带有 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 &奥弗拉格

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14099.html,未经允许,请勿转载。