如何清理或禁用内存缓存?

系统启动后,几分钟内我的内存缓存就会填满,并开始使用交换空间。这是/proc/meminfo的屏幕截图。

memory

然而,如果我能在此之后禁用这个进程/清理缓存,我认为我的系统会在某种程度上加快速度。如果我说错了,请纠正我。
我还尝试过使用Bleachbit来清理内存,但似乎无法正确清理内存缓存。而且,该功能仍处于实验阶段。

bleachbit memory

这里已经有一个类似的问题帖子:如何禁用预读缓存?,但它是关于Ubuntu服务器的,并且答案涉及到手动设置等。

所以,我想知道是否有一些软件可以用于禁用/启用Ubuntu 12.04的内存缓存。


1你确定这样做能解决你的问题吗?内存不会无缘无故地填满。我之前也遇到过内存填满的问题,后来追踪到是tracker-miner引起的。卸载了所有的tracker软件包后,问题就解决了。我也有4GB的内存,其中2GB被缓存使用,但我没有遇到任何问题。 - daniel kullmann
1@danielkullmann:他指的是缓存内存,而不是应用程序使用的内存... - ish
@izx 是的,我知道。可能只是因为他在寻找错误问题的解决方案。内核足够聪明,在程序需要时不会用缓存填满内存。这就是为什么我认为他的内存问题来自一个使用了过多内存的程序。 - daniel kullmann
@danielkullmann:我很好奇你是如何追踪到占用大量内存的那个进程的...有没有什么工具或命令可以做到这一点? - Bharadwaj Srigiriraju
我刚刚使用了htop命令,并按内存使用量进行了排序。 - daniel kullmann
@danielkullmann:哦,是的,htop... 我怎么会方便地忘记这个最好的工具之一呢。不管怎样,我以为你在使用我不知道的外星软件...哈哈 - Bharadwaj Srigiriraju
你在那个截图中几乎没有任何交换空间。我曾见过少量内存出于无明显原因而被交换,不太确定。但无论如何,在这里我不认为磁盘缓存有问题。 - sudo
由于我无法评论,所以我会回答。当磁盘上有写操作时,磁盘缓存会填满内存。如果你有很多写入操作,缓存将增长到系统开始交换的程度。我知道这是真的,因为我以前见过这种情况,对我来说听起来很疯狂,但显然对世界其他地方来说是正常的。想一下逻辑:你密集使用磁盘,结果是什么?更多的磁盘使用量,因为系统开始交换,你把东西倒在磁盘上。我的意思是...嗨,有人在家吗? 我的建议是尽可能多地使用sync && echo 3 | sudo tee /proc/sys/vm/drop_caches - Viktor Joras
4个回答

请注意:Linux并不会“吞噬”您的内存!请查看Geirha的优秀答案以了解原因...
在上述说明之后,如果您仍然认为“清理”缓存可能有所帮助,您可以尝试以下终端中的一行命令:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

没有简单的方法来禁用缓存,但是如果你愿意,你可以通过每分钟清理缓存来达到相同的效果:
- 将其设置为定时任务(cron-job) - 按下Alt-F2,输入gksudo gedit /etc/crontab,并在底部添加以下行: */15 * * * * root sync && echo 3 > /proc/sys/vm/drop_caches - 这将每15分钟清理一次。如果你真的想要每1或5分钟清理一次,可以将第一个参数更改为*或*/5,而不是*/15。

一行代码来获取真实的可用内存,不包括缓存

Geirha的答案解释了细节,但简而言之,你可以使用以下代码获取可用的兆字节数:
free -m | sed -n -e '3p' | grep -Po "\d+$"

在我的2GB命令行服务器上,返回一个非常健康的1835。

5Ergh!清除缓存已经够糟糕的了,但为此创建一个cronjob?我的意思是,这确实“解决”了问题,但这并不会减轻痛苦。 - Reid
2@Reid: "我们的责任不是去思考为什么;他们只需去行动并奋勇牺牲" 😉 - ish
@izx: 嗯...这就是创建cronjob的方法。如果我要定期清除缓存,那岂不是意味着我实际上在减慢系统的速度?如果是这样的话,我觉得你的回答更像是理论上的回答,而不是geirha的回答。:p顺便说一句,好答案... - Bharadwaj Srigiriraju
2@ForbiddenOverseer:我只是因为你想要“禁用”缓存才加入了这个选项,而定期清除缓存是实现这一目的的唯一方法。我在顶部的注释(以及geirha提供的链接)明确指出,大部分时间缓存实际上会加快系统速度,即使看起来它在“占用你的内存”。所以,依我之见,你会减慢系统速度,但既然你想尝试,我就回答了你的问题,而不是简单地唠叨告诉你这是个坏主意,你不应该这样做!我只是给了你实验的权力... :D - ish
1我正在使用Ubuntu Server 12.04 LTS作为VDS。我尝试了这个答案中提供的方法,但是一直收到tee: /proc/sys/vm/drop_caches: Permission denied的错误提示。有什么建议吗? - Eimantas
这个cron job在CentOS 7的Vagrant环境中对我起到了很好的作用:* * * * * sync; echo 3 > /proc/sys/vm/drop_caches - Damodar Bashyal
1在开始在生产环境中执行drop_caches之前,务必要绝对确定这真的有助于整体情况。很有可能,清除缓存会导致整体性能下降。 - Mikko Rantalainen
1请注意,如果您的工作负荷需要至少200 MB的空闲RAM(以便启动高达200 MB的进程而无需从缓存中抢占RAM),只需根据需要设置/proc/sys/vm/min_free_kbytes即可。不需要清除缓存来实现这一点! - Mikko Rantalainen

救命啊!Linux吃掉了我的内存!

www.linuxatemyram.com以FAQ的形式很好地解释了这个问题,其中要点如下:

发生了什么事?
Linux正在借用未使用的内存进行磁盘缓存。这使得你似乎内存不足,但实际上并不是!一切都很好!
为什么要这样做?
磁盘缓存使系统运行更快!除了让新手感到困惑之外,没有任何不利因素。它绝对不会以任何方式夺取应用程序的内存!
如果我想运行更多应用程序怎么办?
如果你的应用程序需要更多内存,它们只需收回磁盘缓存所借用的部分即可。磁盘缓存可以立即归还给应用程序!你的内存并不不足!
如何查看我真正有多少空闲内存?
要查看应用程序在不交换内存的情况下可以使用多少内存,请运行free -m命令,并查看“available”列:
$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1504        1491          13           0         855      792
Swap:          2047           6        2041
这是以Mebibytes为单位的答案。

来源:如上所述,优秀的www.linuxatemyram.com -- 请访问了解更多信息。


1@geirha:谢谢提供链接... 非常有信息量,我喜欢最后给出的实验! - Bharadwaj Srigiriraju
@izx:说实话,我很难决定接受的答案。更不用说,这个链接在其他方面确实很有信息量... ;) - Bharadwaj Srigiriraju
@ForbiddenOverseer:请查看我在回答中的评论,以获取详细的回复。我给出了你不应该这样做的简短版本,但还是回答了你的问题,让你有权利进行实验并自行尝试。如果你认为清理/删除缓存没有帮助,那就不要再这样做了 :) - ish
@izx,我发现这个案例有点难做。不过,你确实写了一篇有用的文章,也许你可以在回答中添加URL链接,然后我们删除我的回答? - geirha
不需要了,你的链接是一个很好的资源;我只是将其中一些部分并入答案中(并标明出处),这样它现在就成为了一个完全有效的替代方案(实际上是公众眼中更好的答案!)干得好,已点赞 - 欢迎加入5k! - ish
哦...我可以看到答案已经改变了...现在,这个肯定是一个很好的答案!!@geirha:我道歉。也许我对一个答案下判断太快了...下次投票时我会多考虑一下。 无论我接受了哪个答案,我相信这个答案得到的赞同显示它可能对人们更有帮助。 - Bharadwaj Srigiriraju
除了让新手感到困惑之外,没有任何缺点。- 你为什么要这样点名我呢。 - rocksNwaves
还值得一提的是,对于现代内核来说,“可用”是你应该关注的唯一数字。例如,如果你使用了10GB的shared_buffers设置来运行PostgreSQL,它将在buff/cache显示中额外显示10GB,并且内核无法根据需要释放这些缓存。 - Mikko Rantalainen
我有一台内存为0.5Tb的机器,尽管有很多可用的内存,但偶尔会发生交换...你知道为什么会这样吗?请参考https://superuser.com/questions/1517266 - Alexis Wilke
这个观点是有争议的,因为你的设备可能突然断电,而且任何在缓存中飞行但尚未写入磁盘的数据都会丢失。所以应该真实地说,以性能为代价的可靠性损失 - undefined

检查当前内存使用情况

 watch -n 1 free -m

或者

 watch -n 1 cat /proc/meminfo

释放空间
 sudo sysctl -w vm.drop_caches=3

注意:此操作不会使您的系统更快,也不会影响其稳定性和性能,只会清理Linux内核在缓存中使用的内存。

或者

 sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

注意:您可以使用cron作业来安排上述命令在特定时间间隔内运行。