![为什么Linux不自动清除缓存?](https://linux22.com/image/169007/%E4%B8%BA%E4%BB%80%E4%B9%88Linux%E4%B8%8D%E8%87%AA%E5%8A%A8%E6%B8%85%E9%99%A4%E7%BC%93%E5%AD%98%EF%BC%9F.png)
背景
每当我必须复制或 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 内核发行说明。