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


19

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

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

有没有办法在缓存的情况下复制大的,千兆字节的文件(即绕过文件缓存)?还是一种将特定文件夹白名单或黑名单从缓存中删除的方法?

Answers:


19

有该nocache实用程序,可以在诸如ionice和的命令之前添加nice。它通过预加载一个库来工作,该库在任何打开的调用中添加posix_fadvisePOSIX_FADV_DONTNEED标志。

简单来说,它建议内核该特定文件不需要缓存。内核通常不会缓存文件。有关详细技术信息,请参见此处

它确实对任何大型复制作业都产生了奇迹,例如,如果您想在后台备份多TB磁盘,而对运行的系统造成的影响最小,则可以采取一些措施nice -n19 ionice -c3 nocache cp -a /vol /vol2

软件包将在Ubuntu 13.10及更高版本中提供。如果您使用的是先前版本,则可以安装13.10软件包,也可以选择FrançoisMarier 进行的12.04反向移植


我希望可以通过GUI来完成某些工作,以及希望将“无缓存”文件夹简单地列入黑名单的方法,但是现在必须这样做。
Veazer

12

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

如果您要传输一个(或几个)大的千兆字节文件,可以很容易地做到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


1
可以使用zsh**运算符进行递归。zsh需要从仓库中手动安装。
恢复莫妮卡-ζ-2012年

1
其实没有 dd怪异的语法使** oprtator犯规。你仍然可以使用(有争论通常一个shell脚本dd.sh in.file out.file的文件名与**)而得到的文件名来dd使用$1$2等等,这不应该由DD的怪异语法犯规。
恢复莫妮卡-ζ-2012年

1
Direct Makes非常慢,因为它的AFAIK也会禁用预读缓存,这可能不是您想要的,并且在基准测试场景中也不现实。请改用“ iflag = nocache oflag = nocache”,它向OS明确表示您不需要缓存文件内或文件外。
stolsvik

1

您可以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 \;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.