为什么Linux不自动清除缓存?

为什么Linux不自动清除缓存?

背景

我的问题基本上是这个问题的后续问题回答,特别是这个评论

每当我必须复制或 rsync 大量文件时,系统上的内存往往会被填满,因此我运行如下脚本(以 root 身份运行):

while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;

问题

  • 这会以任何方式损害系统,或造成任何负面影响吗? (特别是,引用的评论中提到的“风险”是什么?)
  • 如果答案是“否”(这就是我的怀疑),那么为什么 Linux 默认情况下不自动运行这个命令呢? (我没有看到任何明显的变化,我只注意到我没有耗尽内存......)

答案1

因为删除缓存从来没有任何好处。忘记事情并不是收获所在。好处在于重用内存,无论如何这都会发生。因为某些点数据将从内存中清除。

然而,执行这些大型作业可能会对性能造成损害:如果数据被缓存但从未重新使用,那么它会导致其他数据被逐出,而没有任何好处。

因此,您需要在没有缓存的情况下运行作业(不幸的是我不记得执行此操作的命令)。

答案2

为什么Linux不自动清除缓存?

它会。

ron> free -g
             total       used       free     shared    buffers     cached
Mem:           504        415         88          1          0        352
-/+ buffers/cache:         62        441
Swap:            0          0          0

缓存内存仍应被视为空闲内存。

当 free 减少到 0 时,就会从缓存中拉取。

这会以任何方式损害系统,或造成任何负面影响吗?

危害=不。研究echo 3 > /proc/sys/vm/drop_caches一下你会发现它是一个非破坏性的手术。

负面影响是由于必须从磁盘上读取缓存中的内容而导致性能损失。例如编写一个读取 10GB 数据文件的 C 程序。第一次运行它会很慢,因为它从磁盘读取,但之后的任何时候都会快得多,因为该数据文件缓存在内存中。删除缓存,程序读取数据文件的下一次后续运行将像第一次运行一样缓慢。这是很容易观察和重复的。

如果答案是否定的,那么为什么 Linux 默认不自动运行这个命令呢?

您必须详细说明您如何以及在何处看到这种情况发生。我在当前的 linux(例如 RHEL/CentOS 7.7)上不知道它。但较旧的 Linux(例如 3.x 之前的内核)可能是该发行版在缓存不如现在强大时做出的决定(在我看来)。几年前使用 SLES 11.4,我很确定 SuSE 的人没有编写代码来自动删除缓存,但对于一些工作服务器,我让我们购买它们并当时为我们配置 SLES 的人做了一个 crontab进行周期性的丢弃缓存,对于为什么这样做是一个灰色地带。我怀疑这是一种持家态度=良好的心态,因为它从来都不是一个破坏性的命令,不会真正造成伤害。我在 sles 11.4 上手动执行的几次操作echo 3 > drop_caches是为了进行故障排除,因为它从未真正解决任何最终需要重新启动的问题。

查看 RHEL 性能调整指南和调整虚拟内存。我不知道其中有多少是 RHEL 特定的,而不是足够低级别的,所有 Linux 内核都相关,而不是特定于 Linux 发行版。另外,从内核 2.6 到 3.x,再到 4.x,我确信在这方面发生的变化很重要,因此请考虑阅读 Linux 内核发行说明。

相关内容