缓存内存占用了所有的内存。

我几个月前切换到了Ubuntu。几天前,我发现系统将缓存存储在内存中,占用了很多空间,尽管我从缓存内存中获得了好处,但现在这给我带来了麻烦。

ubuntu cached memory

如您所见,Ubuntu占用了我超过50%的RAM。此外,我正在使用11.6 GiB的23.3%,这基本上意味着我的系统占用了超过75-80%的内存...
现在,我已经多次搜索了如何清除缓存的方法,并发现使用具有sudo权限的sync; echo 1 > /proc/sys/vm/drop_caches命令可以清除缓存,但是这个命令只在一开始起作用,就像当我使用这个命令并查看我的缓存时,它大幅减少了。但是现在,当我运行这个命令后查看我的缓存内存,它保持不变。
有人能帮我解决这个问题吗?
附言:我认为如果我尝试升级我的RAM,这个问题不会得到解决...

24这不是问题。这是有意设计的。如果你不使用它,为什么要有内存?当系统需要内存用于其他目的,比如应用程序等等时,缓存将被重新分配到交换空间或从内存中释放以满足即时需求。否则,系统将根据需要快速响应。这是Linux相对于其他操作系统(如Windows)的主要优势之一。 - matigo
嗯,我没有存储缓存内存的问题,只是希望它保持在限制范围内...因为如果系统占用了所有的缓存空间,我将无法使用内存...现在由于缓存内存问题,我的Chrome浏览器显示了SIGSEV错误。而且模拟器总是很糟糕。 - Labham Jain
3如果您的程序调用了malloc()(内存分配)函数,但没有可用的空闲内存,则会分配缓存内存,而该部分缓存将会丢失...我不明白限制如何能帮助解决您的问题,您可能关注的是错误的问题...(个人观点,我不了解代码,而且我对Linux内核工作原理的阅读已经很久以前了)。 - guiverc
14这不是问题,你弄错了。系统并没有使用任何用于应用程序的缓存内存。你认为这是个问题,但实际上并不是。 - Artur Meinild
不相关于问题:由于您拥有大量的RAM,考虑切换到基于ZRam而非HDD的交换空间。 - Archisman Panigrahi
8这是正常的。以我的32GB RAM日常使用系统为例,缓存的RAM占用了7.6GiB,可用内存约为31GiB。系统正在使用7GB的RAM。考虑到缓存,你可能会认为我使用了14.6GB的RAM,但实际上只使用了7GB的RAM。7.6GB的RAM在需要时会被释放,否则仅用于加快磁盘、缓存等操作的速度。缓存的RAM会一直保留,直到需要时才会立即释放-它实际上不会以任何方式影响您的内存使用情况。 - Thomas Ward
1@LabhamJain 听听你自己说的。系统正在使用内存。你希望它不使用内存。而你的理由是,如果系统使用内存,它就“无法使用内存”。这毫无意义。你希望系统能够使用内存,它正在使用内存,这证明它能够使用内存。 - David Schwartz
3SIGSEV是程序员错误的结果。它与RAM的可用量无关。当AVD在x86 CPU上模拟ARM指令时,总是很糟糕。 - OrangeDog
@matigo:Windows也会使用“未使用”的内存来缓存一些东西,但是大部分的用户界面都会将这一点隐藏起来,以免用户感到困惑和恐慌。 - Mooing Duck
1@OrangeDog 其实这是一个Chrome内存访问不足的问题...所以我所说的缓存内存是指我的系统大部分RAM都被缓存占用,因此从技术上讲,我只能使用可用内存,例如总共11GB - 缓存的6GB,所以我最多只能使用5GB... - Labham Jain
4@LabhamJain 如已多次解释,那是错误的。 - OrangeDog
3https://www.linuxatemyram.com/ 未使用的 RAM 就是浪费的 RAM,如果有其他程序需要这些内存,Linux 将会释放当前正在使用的内存。所以,这并不是一个真正的问题。 - exussum
2既然你提到了SIGSEGV,这看起来像是一个XY问题 - Ruslan
请注意,缓存内存并不总是指在需要更多RAM时可以丢弃的内存。例如,在tmpfs中的数据将显示为“缓存内存”。然而,系统监视器将显示此类内存既作为缓存又作为已使用(因此它将出现在饼图的彩色部分)。这曾经让我困扰过。(链接:https://askubuntu.com/questions/762717/high-shmem-memory-usage) - nulldev
1Windows也有缓存,只是它的缓存策略相对较为保守一些。@matigo - eckes
https://www.linuxatemyram.com - 这是一个经典的网站 ;) - kiler129
@OrangeDog 是的,但是由于失败的 malloc 返回 null,如果程序在虚拟内存耗尽且没有进行正确的返回检查时很常见导致程序崩溃,所以这两者之间存在着很强的相关性。例如,Java 运行时中的 ZIP 代码多年来一直存在这个问题。 - eckes
在Linux上,malloc()基本上永远不会返回NULL,所以这个问题无关紧要。 - marcelm
1@matigo 既然不使用内存,为什么要拥有它呢?这样一来,当需要时可以为程序分配内存,而不会让整个系统因为突然将2GB放入交换空间而挂起,给可怜的SSD带来压力。这是糟糕的设计。我有8GB内存,但我讨厌操作系统太自由地将3GB用于缓存,因为我知道很快就会耗尽内存并出现小的卡顿。 - Maciej Krawczyk
我刚刚注意到了。只是遇到了RAM溢出的问题,缓存仍然占用2GB的RAM,并且强制应用程序内存进行交换。 - Maciej Krawczyk
8个回答

如果系统占用了所有的缓存空间,那么我将无法使用内存。
这是不正确的。缓存的内存并不决定正在使用的内存。你仍然可以使用内存,这就是为什么它被称为缓存 - 它可以根据需要使用和丢弃。事实上,与你的假设相反,如果你清除缓存的内存,你将无法使用已经缓存的内容。
现在,我已经搜索了很多次如何清除我的缓存,我发现使用sudo权限的sync; echo 1 > /proc/sys/vm/drop_caches命令可以清除它,但是这个命令只在开始时起作用,比如当我使用这个命令并查看我的缓存时,它大幅减少。但是现在,当我运行这个命令后查看我的缓存内存,它保持不变。
只有在关闭了swappiness的情况下才需要手动清除缓存。禁用swappiness 不推荐以提高性能,因为这实际上会降低系统性能。
与Windows不同,Ubuntu在内存负载过重时不会崩溃,这是由于内存管理的差异。禁用这些功能将显著降低性能。
总结一下,缓存的RAM并不是正在使用的RAM,并且不会耗尽你的RAM或降低系统性能,因为缓存的RAM会根据需要自动丢弃。相反,当需要时,缓存的RAM会提高性能。

如果你想提高系统性能,最好的方法就是将硬盘驱动器更换为固态硬盘。 - mchid
个人而言,我换成了SSD,并将swappiness增加到70,以获得在5GB RAM上更好的性能。由于您有11GB RAM,除非系统变得阻塞,否则swappiness对系统性能的影响很小。在这种情况下,增加swappiness应该提高性能,而不是降低性能。 - mchid
1@MooingDuck: 你为什么认为Linux默认禁用了交换空间?我认为Ubuntu在默认安装过程中会创建一个交换分区 - 当然,如果你愿意,你可以坚持不使用交换空间。此外,“崩溃”是指系统变得无响应或重新启动 - 这与Linux在内存不足的情况下所做的事情非常不同(确定性地停止进程以释放内存)。 - Sergey
2不过说Ubuntu在RAM超载时不会崩溃并不完全公平。OOM(Out of Memory)杀死X服务器对于桌面体验来说与死机或内核恐慌一样糟糕。诚然,现代发行版通过对重要进程进行OOM分数调整,现在这种情况很少见,但我在大约5年前经常遇到这个问题。 - Ruslan
@terdon 我的意思是,它不会崩溃,因为有OOM killer来处理这种情况。当然,取决于你所说的“崩溃”是什么意思,但内核应该没问题。其他进程则可能会有问题。 - val is still with Monica
@terdon 是的,我在一台非常老旧的电脑上(只有1.5GB的RAM)经常遇到系统卡死的问题,但那是因为我的交换分区太小了,而且硬盘速度非常慢。增加了交换分区的大小(并将swappiness从10提高到60)之后,系统虽然变慢了,但不再无响应。 - mchid

缓存内存实际上是空闲内存。
只要其他空闲内存被使用完,它就可以(而且会)作为免费内存提供给任何需要内存的进程。
与此同时,内核会跟踪记录在这个本来是空闲内存中缓存的信息。
这些信息不需要通过耗时的输入/输出写入某个地方。它们要么已经被写入,要么已经被读取,并且从一开始就没有发生过改变。这些信息可以安全(且快速地)从内存中删除。

缓存对你没有任何伤害!

RAM并没有被缓存“使用”,而是被借用了!这意味着当你需要时,它会立即归还给你。

如果你的软件请求一个内存块,系统会说“给你”,然后提供这个块。如果碰巧有缓存存在,缓存的元素将被丢弃(也就是说它们不再在缓存中,如果需要的话,会从磁盘重新获取)。

更智能的系统会做出明智的选择,决定从缓存中清除哪些元素来为你释放内存。


这似乎不是真的,我尝试运行安卓模拟器,但当我的4GB内存被缓存填满时,它并没有删除缓存,而是导致了系统卡顿。 - Labham Jain
6@LabhamJain 听起来像是你的RAM和swap全都用完了。磁盘缓存不是问题所在。 - terdon
3@LabhamJain 缓存问题不会导致系统卡顿,所以我认为“缓存”只是一个误导,你可能面临着完全不同的问题... 这种情况在这里经常发生,被称为“XY问题”... - Harper - Reinstate Monica
@LabhamJain 我以前在一台旧电脑上经常遇到磁盘抖动的问题,后来发现需要增加交换分区的大小——系统试图将数据交换到并不存在的交换空间中。此外,由于硬盘速度慢,我也曾遇到临时卡顿的情况。解决方法是转换到固态硬盘(SSD)。 - mchid
根据我的经验,所有声称缓存不是问题的答案都是错误的。在某些情况下,内存无法及时为诸如Firefox之类的程序提供足够的空间,这时候问题就开始了,因为计算机开始进行交换,这会导致CPU因中断而飙升至满负荷使用,使计算机无法使用。你可以尝试手动调用最耗费内存的程序的内核杀手,但这并不起作用,因为键盘无法工作,CPU被交换引起的中断所淹没。缓存是Linux内核中最大的漏洞,而且通常被称为一个功能。 - atapaka

打开终端(Ctrl+Alt+T),然后输入命令:free -h。你会得到类似这样的输出:
              total        used        free      shared  buff/cache   available
Mem:           15Gi       2.0Gi        10Gi        33Mi       2.7Gi        13Gi
Swap:          31Gi          0B        31Gi

这里有15G的总内存,其中2G被使用,2.7G作为缓存,剩下的10G显示为“空闲”。但是看看最后一列:它显示13G为“可用”。这意味着你可以使用13G的内存(即空闲+缓存的总和),尽管只有10G显示为“空闲”。正如其他答案所指出的那样,缓存内存是临时的:如果需要,它会分配给应用程序,就像“空闲”内存一样;在这方面,这两者之间没有区别。
以这种方式来看待:系统使用计算机上的部分“空闲”内存来临时缓存从磁盘读取的数据,以加快磁盘操作。但是,无论是否用作缓存,这块内存仍然可以被应用程序使用,也就是说,如果应用程序需要,它将被分配给应用程序(使缓存失效)。

清空RAM用作SSD缓存是为了加快计算机的速度。如果您想每隔x分钟清除缓存,可以设置一个crontab条目来清除缓存。

这不是我想要的,我只想限制我的内存缓存... - Labham Jain
1@LabhamJain 不,你不需要。 - Boann

欢迎来到GNU/Linux,朋友!

在这个世界上,我们的内核不会浪费内存,除非应用程序之间争夺内存。

你所描述的是正常现象。

在GNU/Linux系统中,理想情况下100%的内存都会被使用。应用程序不需要的内存将被用于磁盘缓存。你宁愿让磁盘操作以内存的速度进行,而不是硬盘的速度吗?现在你可以免费享受到这一点。尽情享受吧,当你看到内存被缓存使用时不要担心。


嗯,我已经找出了使用sync; echo 1 > /proc/sys/vm/drop_caches命令时的问题所在,我在某个地方拼写错误了。现在,如果我正确使用这个命令,它会清除我的缓存内存,因此我的问题似乎已经解决了。不过,对于将来的参考和社区的意见,我还是希望能得到更多答案。