如何限制复制因此仍有内存可用于其他高速缓存使用的缓存?(How can I limit the ca

2019-07-28 22:10发布

基本情况:

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

我的猜测:

我相信这可能是由于高速缓存。 Linux的决定丢弃有用的高速缓存(如KDE4膨胀,虚拟机磁盘,LibreOffice的二进制代码,二进制文件雷鸟等),而不是从复制的磁盘,这将是一次阅读的东西填满所有可用的内存(24 GB的总数)然后写入永不再使用。 于是我使用这些应用程序(或KDE4)任何时候,磁盘需要重新阅读,阅读膨胀关闭磁盘再次使事情冻结/打嗝。

由于正在消失缓存,事实上,这些臃肿的应用程序需要大量的缓存,这使得系统异常缓慢。

既然是USB接口,磁盘和磁盘控制器是不是瓶颈,因此使用ionice不使其更快。

我相信这是高速缓存,而不是仅仅在主板去太慢,因为如果我停止一切复制,它仍然运行震荡一段时间,直到它recaches一切。 如果我重新启动复制,它需要一分钟之前,它是波涛汹涌的一次。 而且,我可以把它限制在大约40 MB /秒,并再次将其运行速度更快(不是因为它具有高速缓存正确的事情,但因为主板总线有很多额外的带宽为系统盘)。 我完全可以接受我的主板的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

我也试过在Ubuntu同样的事情,这会导致整个系统挂起代替。 ;)

并澄清,我不是问怎么离开可用内存的“系统”,但对于“缓存”。 我知道,高速缓存会自动返还给系统需要的时候,但我的问题是,它是不是保留给具体的事情缓存。

题:

是否有某种方式来告诉这些复制操作,以限制使用内存使一些重要的事情保持高速缓存,因此任何放缓是正常的磁盘使用情况的结果,而不是重读同一常用的文件? 例如,有每个进程/用户/文件系统最大存储器的允许被用作高速缓冲存储器/缓冲器设置?

Answer 1:

在非缓存的命令是最普遍的回答这个问题! 见https://github.com/Feh/nocache或发现它在Debian和Ubuntu 13.10(无礼)。

谢谢你,彼得,提醒我们的--drop缓存”选项中的rsync但那是上游拒绝( 错误9560 -降-cache选项 ),赞成这一更广泛的解决方案:新的‘非缓存’命令基于与fadvise rsync的工作。

你只是在前面加上“非缓存”,以任何你想要的命令。 它也有描述和修改文件的缓存状态不错的工具。 例如,这里有有和没有非缓存的影响:

$ ./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,口是心非,rdiff进行备份,阿曼达,s3sync,s3ql,焦油等)和其他命令的工作。



Answer 2:

克里斯托夫教务长是非常接近,但在我的情况,我不想用dd或写我自己的软件,因此该解决方案是使用的rsync中的“--drop缓存”选项。

因为创建了这个问题我已经使用过很多次,它似乎彻底解决这一问题。 当我使用rsync从FreeBSD机器,不支持“--drop缓存”复制一个例外了。 所以我写了一个包装,以取代在/ 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


Answer 3:

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

posix_fadvise()讲述你的预期访问模式的内核。 在这种情况下,你只所以没有点在其高速缓存使用数据一次。 Linux内核表彰这些标志,所以不应该被任何更多的缓存中的数据。



Answer 4:

尝试使用dd ,而不是cp

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

我不能完全肯定,如果这些方法绕过交换,但它可能是值得给予一试。

只是我2C。



Answer 5:

内核可以不知道,你不会抄袭agains使用缓存的数据。 这是你的信息优势。

但是你可以设置swapiness以0:须藤的sysctl vm.swappiness = 0。 这将导致库等被写入到交换之前的Linux下降缓存。

作品对我来说也不错,特别是在休RAM(16-32 GB)的组合非常高性能的。



Answer 6:

我复制了一些NTFS磁盘[...]系统运行缓慢。 [...]既然是USB [...]

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

使用较新的Linux内核。 大一点的孩子有USB数据和“透明大内存页”的问题。 看到这个LWN文章 。 就在最近这个问题解决了,请参阅“内存管理” LinuxChanges 。



Answer 7:

好了,现在我知道你用rsync ,我可以挖掘更多一些:

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

谷歌搜索周围有人建议将拆分倍数同步rsync调用

希望能帮助到你。



文章来源: How can I limit the cache used by copying so there is still memory available for other cache?