如何限制复制使用的caching,以便其他caching仍有内存可用?

基本情况:

我在openSuSE中复制一些NTFS磁盘。 每个是2TB。 当我这样做,系统运行缓慢。

我的猜测:

我相信这可能是由于caching。 Linux决定放弃有用的caching(例如,kde4膨胀,虚拟机磁盘,LibreOffice二进制文件,Thunderbird二进制文件等),而是用复制磁盘中的东西填充所有可用的内存(总共24 GB),这些内容只能读取一次,然后写,永远不会再使用。 因此,无论何时我使用这些应用程序(或kde4),都需要再次读取磁盘,再次读取磁盘上的臃肿信息会导致冻结/打嗝。

由于caching消失,并且这些膨胀的应用程序需要大量的caching,这使得系统非常缓慢。

由于是USB,所以磁盘和磁盘控制器不是瓶颈,所以使用ionice不会使速度更快。

我相信这是caching,而不仅仅是主板太慢,因为如果我停止一切复制,它仍然运行起伏不定,直到它recache一切。 如果我重新开始复制​​,它需要一分钟才能再次波动。 而且,我可以将其限制在40 MB / s左右,并且运行速度更快(不是因为它有正确的caching,而是因为主板总线为系统磁盘提供了额外的带宽)。 我可以完全接受主板IOfunction被完全消耗(这是100%的使用,这意味着0%的浪费的功率,这使我感到高兴)的性能损失,但我不能接受,这种caching机制在这个具体的使用案件。

# free total used free shared buffers cached Mem: 24731556 24531876 199680 0 8834056 12998916 -/+ buffers/cache: 2698904 22032652 Swap: 4194300 24764 4169536 

我也在Ubuntu上尝试了同样的事情,导致整个系统挂起。 ;)

而且为了澄清,我不是问如何为“系统”留下内存,而是为了“caching”。 我知道高速缓冲存储器会在需要的时候自动返回给系统,但是我的问题是它不能保留特定的东西。

题:

有一些方法可以告诉这些复制操作限制内存的使用,所以一些重要的东西仍然被caching,所以任何减速是正常的磁盘使用的结果,而不是重读相同的常用文件? 例如,是否允许每个进程/用户/文件系统允许用作caching/缓冲区的最大内存设置?

Solutions Collecting From Web of "如何限制复制使用的caching,以便其他caching仍有内存可用?"

nocache命令是这个问题的一般答案! 请参阅https://github.com/Feh/nocache或在Debian和Ubuntu 13.10(saucy)中找到它。

感谢Peter,提醒我们在rsync中有–drop-cache选项,但是上游拒绝了这个选项( Bug 9560 – drop-cache选项 ),而采用更通用的解决方案:新的“nocache”命令基于与fadvise的rsync工作。

你只要把“nocache”放在你想要的任何命令上即可。 它也有很好的工具来描述和修改文件的缓存状态。 例如这里有和没有nocache的效果:

 $ ./cachestats ~/file.mp3 pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K] $ ./nocache cp ~/file.mp3 /tmp $ ./cachestats ~/file.mp3 pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K]\ $ cp ~/file.mp3 /tmp $ ./cachestats ~/file.mp3 pages in cache: 1945/1945 (100.0%) [filesize=7776.2K, pagesize=4K] 

所以希望这将适用于其他备份程序(rsnapshot,duplicity,rdiff-backup,amanda,s3sync,s3ql,tar等)以及其他不想要垃圾缓存的命令。

Kristof Provost非常接近,但在我的情况下,我不想使用dd或编写自己的软件,所以解决方案是使用rsync中的“–drop-cache”选项。

自从创建这个问题以来,我用了很多次,似乎完全解决了这个问题。 当我使用rsync从不支持“–drop-cache”的FreeBSD机器上复制时,有一个例外。 所以我写了一个包装来替换/ usr / local / bin / rsync命令,并删除该选项,现在它也可以从那里复制。

它仍然使用大量的内存缓冲区,似乎几乎没有缓存,但工作顺利无论如何。

 $ free total used free shared buffers cached Mem: 24731544 24531576 199968 0 15349680 850624 -/+ buffers/cache: 8331272 16400272 Swap: 4194300 602648 3591652 

这是不可能的,如果你使用普通的旧cp ,但如果你愿意重新实现或自己修补它posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE)在输入和输出文件上设置posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE)可能会有所帮助。

posix_fadvise()告诉内核你的目标访问模式。 在这种情况下,你只能使用一次数据,所以没有必要缓存它。 Linux内核承认这些标志,所以不应该再缓存数据。

尝试使用dd而不是cp

或者用sync标志mount文件系统。

我不完全确定这些方法是否绕过交换,但可能值得一试。

只是我的2C。

我正在复制一些NTFS磁盘系统运行缓慢。 […]因为它是USB […]

放缓是一个已知的内存管理问题 。

使用更新的Linux内核。 较旧的USB数据和“透明巨大页面”有问题。 看到这个LWN文章 。 最近这个问题已经解决,请参阅LinuxChanges中的 “内存管理”。

内核不知道,你不会再使用缓存的数据复制。 这是你的信息优势。

但是你可以设置交换为0:sudo sysctl vm.swappiness = 0。 这会导致Linux在将库等写入交换之前删除缓存。

对我来说也不错,尤其是与休拉姆(16-32 GB)相结合的性能。

好吧,现在我知道你使用的rsync和我可以多挖一点:

看来rsync在与大量文件同时使用时是无效的,在常见问题中有一个条目,它不是Linux /缓存问题,这是一个rsync问题,吃的太多的RAM。

搜索某人建议在多个rsync调用中拆分同步

希望能帮助到你。