添加preload
软件包后,我的应用程序似乎速度加快了,但如果我复制一个大文件,文件缓存就会增长到文件大小的两倍以上。
通过将单个 3-4 GB 的 VirtualBox 图像或视频文件传输到外部驱动器,这个巨大的缓存似乎会从内存中删除所有预加载的应用程序,从而导致加载时间增加和整体性能下降。
有没有办法复制大型、数 GB 的文件没有缓存它们(即绕过文件缓存)?或者有办法将特定文件夹列入白名单或黑名单以防止缓存?
答案1
有nocache
实用程序,可以添加到命令前面,如ionice
和nice
。它的工作原理是预加载一个库,该库会将标志添加posix_fadvise
到POSIX_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
)。
- 请随意尝试从 1 到 32 MB 的值;上面的设置为 4 MB (
对于多个/递归目录复制不幸的是,没有容易获得的工具;通常的cp
,等等不要支持直接 I/O。
/e iflags & oflags 更改为正确的 iflag & oflag
答案3
dd
您可以使用find
和递归复制目录mkdir
我们需要解决两个问题:
dd
不知道如何处理目录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 \;
请注意,这不会保留文件修改时间、所有权和其他属性。