dd您可以使用find和递归复制目录mkdir

dd您可以使用find和递归复制目录mkdir

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

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

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

答案1

nocache实用程序,可以添加到命令前面,如ionicenice。它的工作原理是预加载一个库,该库会将标志添加posix_fadvisePOSIX_FADV_DONTNEED任何打开的调用中。

简单来说,它建议内核认为该文件不需要缓存;然后内核将通常情况下不缓存该文件。请参阅这里了解技术细节。

它对于任何巨大的复制工作都有奇效,例如,如果您想在后台备份一个多 TB 的磁盘,同时尽量减少对正在运行的系统的影响,您可以采取一些措施nice -n19 ionice -c3 nocache cp -a /vol /vol2

Ubuntu 13.10 及更高版本将提供软件包。如果你使用的是旧版本,你可以安装13.10 包或选择此 12.04 反向移植作者:弗朗索瓦·马里尔(François Marier)。

答案2

对于单个大文件,dd使用直接的绕过文件缓存的 I/O:

如果您要传输一个(或几个)大型多 GB 文件,则可以轻松完成dd

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

对于多个/递归目录复制不幸的是,没有容易获得的工具;通常的cp,等等不要支持直接 I/O。

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

答案3

dd您可以使用find和递归复制目录mkdir

我们需要解决两个问题:

  1. dd不知道如何处理目录
  2. dd一次只能复制一个文件

首先让我们定义输入和输出目录:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

现在让我们cd进入源目录,这样find就会报告我们可以轻松操作的相对目录:

cd "$SOURCE"

将目录树从复制$SOURCE$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

重复文件从$SOURCE省略$TARGET写入缓存(但利用读取缓存!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

请注意,这不会保留文件修改时间、所有权和其他属性。

相关内容