为什么要在 Linux 中删除缓存?

ivc*_*ode 89 linux memory cache

在我们的服务器中,我们习惯于在午夜丢弃缓存。

sync; echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它似乎释放了大量 RAM,但我真的需要这样做吗?空闲内存不是浪费吗?

Dav*_*rtz 93

你是 100% 正确的。这是以释放RAM一个很好的做法。这可能是货物崇拜系统管理的一个例子。

  • +1 提及 Cargo Cult 系统管理。任何不知道该术语及其含义的系统管理员都应该被解雇。 (12认同)
  • @Tonny:那么我们就没有系统管理部门了:( (11认同)
  • 像大多数人一样,我喜欢能得到很多认可的简洁鲁莽的断言,但引用或推理会为我的超我赢得 +1。 (2认同)
  • 如果您不介意,请解释货物崇拜管理以及上述内容。也许在后续编辑中?我仍然保留我的 +1 ......:P (2认同)
  • “有可能虽然您的应用程序可能没有使用这些 RAM,但 Linux 正在积极地缓存到其内存中,即使应用程序需要内存,它也不会释放其中的一些缓存,而是宁愿开始交换。” 不是很具体。在实践中,内存管理并不完美,当不完美出现时有一个旋钮可以转动是一件好事。 (2认同)
  • 积极缓存是一种胜利。缓存如此积极以至于您的应用程序开始交换......不是那么多。 (2认同)

ana*_*han 64

是的,清除缓存将释放 RAM,但它会导致内核在磁盘上而不是在缓存中查找文件,这会导致性能问题。

通常,当可用 RAM 耗尽时,内核会清除缓存。它经常使用 pdflush 将脏内容写入磁盘。

  • +1 用于解释*为什么*这是一个坏主意。 (22认同)

小智 36

像这样丢弃缓存的原因是为了对磁盘性能进行基准测试,这也是它存在的唯一原因。

在运行 I/O 密集型基准测试时,您希望确保您尝试的各种设置实际上都在执行磁盘 I/O,因此 Linux 允许您删除缓存而不是完全重新启动。

文档中引用:

该文件不是控制各种内核缓存(inode、dentries、pagecache 等)增长的手段,当系统其他地方需要内存时,内核会自动回收这些对象。

使用此文件可能会导致性能问题。由于它会丢弃缓存的对象,因此可能会花费大量的 I/O 和 CPU 来重新创建丢弃的对象,尤其是在它们被大量使用的情况下。因此,不建议在测试或调试环境之外使用。

  • 明显的情况是当您想要清除 RAM 以允许分配更多(非透明)大页面时;另一种情况是透明的大页垃圾收集暂停错误(请参阅我在此问题其他地方的回答/评论)。但我的评论是针对一般情况的。有时,操作系统的人比设计/实施系统的人更了解。通常,不是 - 这就是他们的评论试图防止的。我很高兴 (3认同)

Pla*_*aHH 29

这里的基本思想可能并没有那么糟糕(只是非常幼稚和误导):可能有文件被缓存,在不久的将来不太可能被访问,例如日志文件。这些“吃掉”的 ram,稍后将在必要时由操作系统以一种或另一种方式释放。

根据你的swappiness设置、文件访问模式、内存分配模式和更多不可预测的事情,当你不释放这些缓存时,它们可能会在以后被强制重用,这需要多一点时间从未使用的内存池中分配内存。在最坏的情况下,linux 的 swappiness 设置会导致程序内存被换出,因为 linux 认为这些文件在不久的将来可能比程序内存更有可能被使用。

在我的环境中,linux 的猜测经常是错误的,并且在大多数欧洲证券交易所开始时(当地时间 0900 左右)服务器将开始做他们每天只做一次的事情,需要交换之前因为写入而换出的内存日志文件,压缩它们,复制它们等等,正在填满缓存,以至于必须换掉一些东西。

但是删除缓存是解决这个问题的方法吗?绝对不是。这里的解决方案是告诉 linux 它不知道什么:这些文件可能不再使用。这可以通过编写应用程序使用类似的东西posix_fadvise()或使用类似的 cmd 行工具来完成vmtouch(它也可以用于查看事物以及缓存文件)。

这样您就可以从缓存中删除不再需要的数据,并保留应该缓存的内容,因为当您删除所有缓存时,必须从磁盘重新读取很多内容。在最糟糕的时刻:在需要的时候;导致您的申请出现明显且通常不可接受的延迟。

你应该有一个系统来监控你的内存使用模式(例如,如果有东西正在交换),然后进行相应的分析,并采取相应的行动。解决方案可能是在一天结束时使用 vtouch 驱逐一些大文件;也可能是添加更多内存,因为服务器的每日高峰使用量就是这样。

  • @ivcode 如果你不需要 `nohup` 的输出,你应该将它重定向到 `/dev/null`。听起来您在某些时候有一些非常缺乏经验的系统管理员在您的系统上工作。请参阅 http://stackoverflow.com/questions/10408816/how-to-use-unix-command-nohup-without-nohup-out 了解如何将 `nohup` 的输出定向到 `/dev/null` (5认同)

Zan*_*ynx 19

我已经看到删除缓存在启动一堆虚拟机时很有用。或者其他任何使用大页面的东西,比如一些数据库服务器。

Linux 中的大页面通常需要对 RAM 进行碎片整理,以便找到 2MB 的连续物理 RAM 放入页面。释放所有文件缓存使这个过程变得非常容易。

但我同意大多数其他答案,因为通常没有充分的理由每晚删除文件缓存。

  • 此外,在高内存节点 (1Tb) 上的 HPC 应用程序中,读取几个大文件会导致缓存大量内存。由于许多 HPC 应用程序执行数百 GB 的 malloc,因此一旦系统到达缓存内存“边界”,迁移过程就会徒劳地跨 NUMA 节点移动微小的碎片内存块,因此系统可能会停滞数小时。更糟糕的是,除了欺骗系统立即分配它可以分配的所有微小 2MB 块然后释放,让大页碎片整理和应用程序正常运行之外,您在用户态中无法执行任何操作来释放缓存。 (2认同)

Dav*_*ins 8

当没有人具有实际发现问题的技能或经验时,这可能是为了稳定系统而制定的。

释放资源

删除缓存本质上会释放一些资源,但这会产生副作用,使系统实际上更努力地做它想要做的事情。如果系统交换(试图读取并从磁盘交换分区写入速度比它实际上是能够)再滴加缓存定期可以缓解症状,但无助于根治的原因

什么是占用内存?

您应该确定是什么导致了大量内存消耗,从而使删除缓存似乎有效。这可能是由任意数量的配置不当或只是简单地错误使用的服务器进程引起的。例如,在一台服务器上,当 Magento 网站在 15 分钟的时间间隔内达到一定数量的访问者时,我看到内存利用率达到最大值。这最终是由于 Apache 被配置为允许同时运行太多进程造成的。进程太多,使用大量内存(Magento 有时是野兽)= 交换。

底线

不要只是假设它是必要的。主动找出它存在的原因,如果其他人认为它是错误的,有胆量将其禁用,并观察系统——了解真正的问题是什么并修复它。