了解和配置缓存

Chi*_*rag 3 linux memory

我有几个关于高速缓存的问题。

在我的系统上,“free -h”命令给了我以下输出,

      total        used        free      shared  buff/cache   available
Mem:   7.6G        2.1G        1.5G         46M        4.0G        4.8G
Swap:  1.6G         28M        1.6G
Run Code Online (Sandbox Code Playgroud)
  1. 为什么在主内存中需要“缓存内存”?

    据我所知,“缓存内存”不同于主内存(RAM)。它非常昂贵,而且速度要快得多。如果我错了,请纠正我。

  2. 在 1 小时之前,此缓存内存为 3 GB。为什么它现在增加了 1 GB?

    请注意,我没有启动/运行任何新进程。

  3. 我可以启动新的进程/应用程序到什么限制?

    我的意思是根据free -h命令输出,

    free memory = 1.5 GB, Cache memory = 4 GB and Swap memory = 1.6 GB
    
    Run Code Online (Sandbox Code Playgroud)

    我可以开始一个新的应用程序(1.5 + 1.6) GB or (1.5 + 1.6 + 4) GB吗?

  4. 我可以设置/配置这个缓存内存值吗?

    如果是,那么如何?

sou*_*edi 6

  1. 我来纠正你!昂贵的是CPU 缓存
  2. 由于这是磁盘缓存,它被任何文件访问使用。
  3. 坏消息:这既复杂又令人讨厌。
  4. 好消息:现在您不必担心太多。8 GB RAM 对于通用桌面系统来说已经足够了。

1.我会纠正你的!昂贵的是CPU 缓存

CPU 有一小部分快速内部 RAM。CPU 自动将频繁访问的主内存中的数据复制到此缓存中。

如别处所述,free显示磁盘缓存。它不显示 CPU 缓存。磁盘缓存做同样的事情,除了磁盘块。它存储在主内存中,由操作系统管理。

所以我们有三层不同的内存!这被描述为“内存层次结构”。我们用于磁盘缓存的主内存实际上更快,每字节更昂贵 - 如果我们将其与磁盘进行比较。

2. 由于这是磁盘缓存,它被任何文件访问使用。

所以它可以在不加载任何新程序的情况下使用,只需使用它们。例如,当您访问网站时,它们会被复制到磁盘(另一种缓存策略!)

当我说缓存“经常访问”的数据时,我撒了谎。缓存所有内容是最简单和最有效的......

磁盘缓存将增长,直到您没有可用内存为止...

当您需要更多内存时,一些块将从磁盘缓存中逐出以腾出空间。这种驱逐由旨在最大限度提高效率的政策控制。例如,“LRU”:驱逐最近最少使用的块。

3. 坏消息:这既复杂又令人讨厌。

Windows 在开发时就考虑到了这些问题;如果您尝试打开太多应用程序,它应该会阻止您并抱怨,这可以让您大致了解一次可以保持打开的程度。

在 Linux 上,预期的行为是您开始填充交换区,系统突然变得太慢而无法恢复。或者,如果您没有交换,则可能会发生类似的事情,即程序代码的缓存和其他此类基本文件被逐出。尽管如此,如果您以某种方式设法取得足够的进展,以耗尽不受磁盘支持的页面的内存,则内存不足杀手将开始谋杀它不喜欢回收内存的进程。

您仍然可以大致了解多少是太多。您最终只能硬重启才能恢复:)。

您可以配置它以防止“过度使用”,并保持交换禁用或非常小。这是最接近 Windows 的地方。然而,很多 Linux 代码是在“过度使用”的假设下设计的。如果你有足够的内存,这不是什么大问题。并且磁盘缓存仍然会作为一种不太危险的过度使用;您不一定最终需要大量您永远无法从中获得任何优势的 RAM。

在实践中......有些人更喜欢在没有/非常小的交换的情况下运行,这很好。但是禁用过度使用并不常见。所以这不是建议,如果您启用它,那么您将处于不同的世界。例如,如果您询问一个问题并且它实际上与禁用过度使用有关,那么没有多少人有经验来识别它。

4. 好消息:现在你不用太担心了。8 GB RAM 对于通用桌面系统来说已经足够了。

4 GB 现在同样好用,而且也不贵。如果您想运行多个系统,即虚拟机,这只是一个限制。我现在倾向于使用 4 GB 运行。我不记得上次我遇到内存不足的问题是什么时候了。我的经验来自内存少得多的旧系统。

另一个答案提到的 sysctls限制磁盘缓存。它们限制了您可以拥有多少“脏”的磁盘缓存。这是指程序已写入数据但尚未同步回磁盘的缓存块。这种类型的缓存被描述为“回写缓存”。


也就是说,要大致了解利用率百分比,我会

  1. 在您的计算中考虑“使用”和“buff/缓存”的总数以获得全面的视图。
  2. 测量新启动以排除旧的缓存文件。或者运行后重新登录sync; echo 3 | sudo tee /proc/sys/vm/drop_caches。我希望后者给出的结果略低。其中哪一个更现实值得商榷。显然,删除缓存是一个更人为的测试,但如果您的工作负载实际上需要删除的文件,它们无论如何都会被读回。
  3. 这是假设您不会在磁盘缓存中得到大量数据文件,当您不介意它们不适合并且会对它们的磁盘性能感到满意时。如果您在播放视频文件后进行测量,可能会发生这种情况。在这种情况下,它会更难。如果完整的视频文件适合内存,你可以从 buff/cache 中减去它的大小。

您可以验证 X 内存量是否足以满足您的工作负载,例如,通过使用选项引导内核mem=X。就像mem=256M您想在与原始 Raspberry Pi 型号 A 相同数量的 RAM 上测试 32 位软件一样。