我的情况很简单:我备份了一些文档并把它们放在 NAS 上,因为我宁愿传输一个大文件而不是一百万个小文件,所以我创建了一个 tar
tar cf backup/2013-07-12-pictures.tar Pictures
我的Pictures
目录包含大约 12GB 的数据,而我的缓存会逐渐填满。如果我再 tar 一些文件(例如我的项目,等等),用不了多久,我的所有32GB 内存使用:
sheldor:~$ free -g
total used free shared buffers cached
Mem: 31 31 0 0 0 27
-/+ buffers/cache: 2 28
Swap: 29 0 29
此时,尽管鼠标和系统通常都能够正常工作,但启动程序(从磁盘读取)需要很长时间。确实是很长时间:我有一个 SSD,启动 Chrome 通常需要一秒钟,但现在需要大约 2 分钟。
现在,你会发现互联网上有很多帖子说清除缓存不好等等。在这里,询问 Ubuntu你也找到这样的帖子它通过提供命令拯救了我的生命
sudo sync && sudo sysctl -w vm.drop_caches=3
如果你阅读评论,你会发现例如这样的:
这不是问题,这就是页面缓存的工作原理。它会尽可能长时间地保留缓存内容,但当其他应用程序的内存压力增加时,会自动释放项目。无需手动清除。 – Caesium 2011 年 11 月 22 日 16:08
什么?我的系统(Intel Core i7 3.50GHz × 8、32GB RAM、NVidia Gtx 590)在执行简单的 tar 后就冻结了。我的意思是,我需要施加多大的压力才能自动释放缓存?
问题:有没有办法调整设置,让我的缓存更频繁地被清除?或者这是我必须忍受的事情?
答案1
我同意 Linux 中的缓存处理远非最佳。事实上,在许多方面,Linux 仍然感觉更适合服务器/工作站使用,而不是桌面使用。请参阅此问答与 CPU/IO 调度类似的问题。
话虽如此,还是有一些解决方案可以缓解这个问题。你可以手动清除缓存或设置一个 cronjob,例如用户197590指出。另一种方法是禁用特定应用程序的缓存生成。您可以使用nocache
实用程序。目前它仅在13.10 仓库但我能够在 12.04 上安装 Saucy 包,没有任何问题。
nocache
使用起来相当简单。你可以将它添加到任何想要不带缓存执行的命令前面,例如:
nocache tar cf backup/2013-07-12-pictures.tar Pictures
这不是一个解决问题的办法,但它绝对可以解决过度缓存的症状。
答案2
使用内存预取守护进程,例如预加载是我发现的最佳解决方案。它的作用与 MS Windows 预取机制相同。
从预加载网站:
preload 是一个自适应预读守护进程。它监视用户运行的应用程序,并通过分析这些数据来预测用户可能运行的应用程序,并将这些二进制文件及其依赖项提取到内存中以缩短启动时间。
12.04 默认仓库中肯定有预加载,因此
sudo apt-get install preload
就是这样。Preload 将了解您正在使用哪些应用程序,并负责用正确的文件填充缓存。
我已经在 HDD 和 SSD PC 上使用过它,效果很好。
答案3
您可以使用以下简单命令手动释放内存缓存:
sk@sk:~$ sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
但是,如果您想强制 Linux 操作系统在特定时间间隔内清除内存缓存,只需将命令添加到 cron 作业中。在这里,我向您展示如何操作。
打开终端并输入以下命令来创建一个名为 cacheclear.sh 的文件。例如,我在 /home 目录中创建了 cacheclear.sh 文件:
sk@sk:~$ sudo vi /home/cacheclear.sh
将以下行添加到 cacheclear.sh 文件:
#!/bin/sh
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
保存并退出文件。现在将此文件添加到根 crontab:
sk@sk:~$ sudo crontab -e
此命令打开根 crontab。
将以下行添加到末尾:
0 * * * * /home/cacheclear.sh
保存并退出文件。完成后,cron 作业将每小时运行此命令并清除系统内存缓存。