创建 tar 填充系统缓存

创建 tar 填充系统缓存

我的情况很简单:我备份了一些文档并把它们放在 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 作业将每小时运行此命令并清除系统内存缓存。

相关内容