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

Pet*_*ter 20 linux filesystems usb caching file-copying

基本情况:

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

我的猜测:

我相信这可能是由于缓存.Linux决定丢弃有用的缓存(例如kde4膨胀,虚拟机磁盘,LibreOffice二进制文件,Thunderbird二进制文件等),而是用复制磁盘中的东西填充所有可用内存(总共24 GB),这些内容只读一次,然后写,再也没用过.因此,每当我使用这些应用程序(或kde4)时,需要再次读取磁盘,并再次读取磁盘上的膨胀使得事情冻结/打嗝.

由于缓存消失以及这些膨胀的应用程序需要大量缓存的事实,这使得系统非常慢.

由于它是USB,磁盘和磁盘控制器不是瓶颈,因此使用ionice不会使它更快.

我相信这是缓存,而不仅仅是主板太慢,因为如果我停止一切复制,它仍会运行一段时间,直到它重新读取所有内容.如果我重新启动复制,它需要一分钟才能再次出现波动.但是,我可以将它限制在大约40 MB/s,并且它再次运行得更快(不是因为它具有正确的缓存,而是因为主板总线为系统磁盘提供了大量额外带宽).我可以完全接受主板的IO功能被完全消耗的性能损失(100%使用,意味着0%的浪费功率让我开心),但我不能接受这种缓存机制在这个特定用途中表现如此糟糕案件.

# free
             total       used       free     shared    buffers     cached
Mem:      24731556   24531876     199680          0    8834056   12998916
-/+ buffers/cache:    2698904   22032652
Swap:      4194300      24764    4169536
Run Code Online (Sandbox Code Playgroud)

我也在Ubuntu上做了同样的事情,这导致整个系统挂起.;)

为了澄清,我不是要求如何为"系统"留出内存,而是为了"缓存".我知道缓存内存会在需要时自动返回给系统,但我的问题是它不会保留用于缓存特定的东西.

题:

有没有办法告诉这些复制操作限制内存使用,所以一些重要的事情仍然被缓存,因此任何减速是由于正常的磁盘使用而不重读相同的常用文件?例如,是否允许将每个进程/用户/文件系统的最大内存设置用作缓存/缓冲区?

nea*_*mcb 20

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]
Run Code Online (Sandbox Code Playgroud)

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