为什么我的系统使用这么多缓存?

Que*_*ner 3 performance swap cache ram

以前,在运行 Ubuntu 14.04 的台式计算机上,我有 4GB 内存,我认为应该足够了。但是,打开一段时间后,我的计算机似乎变慢了。我的 Gnome 面板中有一个系统资源监视器应用程序,我认为它代表可用的 RAM (?)。它显示深绿色区域为“内存”,浅绿色区域为“缓存”。“缓存”会慢慢增长,直到填满整个图,然后程序加载会变慢,或者需要一段时间来切换程序。

我可以用这个命令在一定程度上缓解这个问题,但最终计算机缓存再次填满,所以它只是一个创可贴:

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
Run Code Online (Sandbox Code Playgroud)

所以,我想我会得到更多的内存,所以我用一个 8GB 的​​内存条替换了一个 2GB 内存条,现在我有 10GB 内存。

而我的“缓存”仍然缓慢地最大化,结果我的电脑变慢了。此外,有时当我第一次启动和登录时,计算机开始时“缓存”已达到最大值。但并非总是如此,我不知道是否存在确定其发生原因的模式。

为什么 Ubuntu 使用了这么多缓存?10GB 对 Ubuntu 来说还不够吗?

这是我的系统监视器在 Gnome 面板中的样子。中间方块显示 RAM 使用情况。浅绿色区域是“缓存”:

缓存接近最大值

这是我的内存和交换历史记录,它似乎不包含任何有关“缓存”的信息。我意识到此时我并不完全清楚“缓存”和“交换”之间的区别:

内存和交换

sмu*_*urf 6

可能需要减少swappiness。

内核认为最好使用空闲 ram 作为缓存,而不是逐出缓存页面并将 ram 标记为真正空闲。增加缓存通常是一件好事。

现在的问题是当所有内存都分配给缓存并且您的应用程序需要更多内存时该怎么办。通常正确的做法是从缓存中驱逐一个页面并将其交给您的应用程序,但偶尔换出一个很少使用的页面,将其提供给您的应用程序并保持缓存完好无损是有益的。

这个过程由 松散地控制/proc/sys/vm/swappiness。有关更多信息,请查看为什么大多数人建议将 swappiness 减少到 10-20?以及如何配置swappiness?.


RAO*_*AOF 6

而我的“缓存”仍然缓慢地最大化,结果我的电脑变慢了。

你需要在别处寻找导致你减速的原因;被描述为“缓存”的内存是内核可以在其他任何需要 RAM 的情况下自由丢弃的内存。就像最近从光盘中读取的数据一样。

虽然很旧,但仍然是对内存子系统中某些活动部件的合理描述。正如它所说,

Linux 有一个基本规则:一页空闲 RAM 是浪费的 RAM。

无论您拥有多少 RAM,您的缓存都会增长以填满它。这不是值得关注的原因。远非如此,这是一项非常重要的性能优化 - RAM 比快速SSD快约 100 倍,因此任何时候您不必从光盘读取都是一个巨大的胜利。


Jon*_*nna 5

您的系统使用了如此多的缓存,因为它可供使用,并且可以帮助它更快地运行。

一般而言,缓存是我们将检索缓慢或计算缓慢的内容的副本放在检索速度较快的地方。程序可能将计算结果存储在内存中,Web 代理可能将来自 Web 的资源副本存储在 LAN 上的机器上,在这种情况下,系统可能将来自硬盘驱动器的数据存储在 RAM(和一些其他数据)。

并且因为它使系统运行得更快,所以使用没有被其他东西使用的每一千字节是合乎逻辑的。毕竟,没有其他任何东西使用的内存块的选项是:

                      |Use For Cache | Don't Use For Cache
——————————————————————+——————————————+————————————————————
Data needed again     |Faster system | No difference
Data not needed again |No difference | No difference
Run Code Online (Sandbox Code Playgroud)

因此,您应该始终使用对缓存没有任何作用的每一位内存。

一个系统 10% 的 RAM 用于各种用途,其中 90% 用于缓存,不应被认为是“最大化”。它应该被认为是 10% 正在使用,另外 90% 是免费的,因此被用于缓存而没有什么需要它。

然而,如果我们考虑交换,这几乎与在 RAM 中从磁盘缓存数据相反:缓存使用 RAM 来加速 I/O(以及可能的其他事情),分页使用磁盘空间来扩展 RAM。

因此,当系统使用了所有 RAM 并且需要更多 RAM 时,它有两个选择:

  1. 扔掉一些缓存,因为它毕竟只是一个优化。
  2. 调出一些用于其他用途的 RAM。

对于这些中哪一个是最好的,没有统一的答案。完美的答案取决于很多无法预测的事情,即使是最好的答案也取决于很多事情,这些事情取决于您的系统设置和使用方式。

请注意,这些相反的操作确实同时有意义:一个是优先考虑您可能需要的缓慢获取的信息,另一个是降低您很快不需要的信息的优先级。

250MB 不是很多,所以我不会非常担心,但是对于用于交互式(而不是服务器)使用的高 RAM 桌面系统,我可能会尝试减少swappiness,以改变这里的平衡行为。这个答案很好地说明了为什么它可能不会产生太大影响,但这是一个合理的尝试,看看它是否会发生。

您首先要处理一个更大的问题,那就是有人时不时地sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"在您的机器上运行,这会从其他未使用的 RAM 中清除快速访问的数据,并强制系统重新计算或重新检索什么它应该能够从内存中抓取。这会使系统变慢,而且 RAM 会浪费金钱。