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


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

sync; echo 3 > /proc/sys/vm/drop_caches

当我运行代码时,似乎释放了大量的RAM,但我真的需要这样做。免费RAM是不是浪费?


81
2018-05-20 03:12




找到这个人,并问他为什么这样做。正如你猜测的那样,没有明显的理由。 - Michael Hampton♦
调试内核。就是这样。这实际上并没有释放任何RAM;顾名思义,它会丢弃缓存,从而降低性能。 - Michael Hampton♦
@ivcode然后你应该找到并解决该服务器的问题,而不是试图避免导致它的条件。如果我的车在每次右转弯时都会停转,避免急转弯是一个糟糕的修复。 - David Schwartz
有关 thedailywtf.com/Articles/Modern-Memory-Management.aspx 强烈主张这是一个坏主意。 - Drunix
相关,以及对“问题”的有用描述: linuxatemyram.com - Bill Weiss


答案:


你100%正确。它是  释放RAM的好习惯。这可能是货物崇拜系统管理的一个例子。


85
2018-05-20 04:59



+1提及货物崇拜系统管理。任何不知道该术语及其含义的系统管理员都应该被解雇。 - Tonny
@Tonny:我们将离开没有系统管理员部门然后:( - PlasmaHH
像大多数人一样,我喜欢简洁的断言,并且有很多赞同,但引用或推理可以获得我的超级+1。 - Aaron Hall
如果您不介意,请解释货物崇拜管理以及上述情况。也许在后续编辑?我还在扣留我的+1 ......:P - Aaron Hall
“虽然你的应用程序可能没有使用这些内存,但是Linux正在积极地缓存到它的内存中,但是它很可能,即使应用程序需要内存,它也不会释放一些缓存,而是宁愿开始交换。”不是很具体。在实践中,内存管理并不完美,并且当出现不完美时转动旋钮是一件好事。 - Dan Pritts


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

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


62
2018-05-20 06:26



+1用于解释 为什么 这是一个坏主意。 - Ogre Psalm33


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

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

引用 文件

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

使用此文件可能会导致性能问题。既然它丢弃了   缓存的对象,它可能需要大量的I / O和CPU   重新创建掉落的对象,特别是如果它们被大量使用。   因此,在测试或调试环境之外使用   不建议。


34
2018-05-20 13:51



当然,根据您要执行的操作,即使完全重新启动也可能无法充分清除磁盘缓存。 - α CVn
“当需要内存时,内核会自动回收这些对象”是设计目标,但它可能并不总是实际行为。 - Dan Pritts
@DanPritts究竟是什么让你认为不是这样? - Joe
显而易见的情况是,当你想要清除RAM以允许分配更多(非透明)大页面时;另一个案例是透明的hugepage垃圾收集暂停错误(请参阅我在这个问题的其他地方的回答/评论)。但我的评论是针对一般情况的。有时,操作系统的人比设计/实施系统的人更了解。通常,不是 - 这是他们的评论试图防范的。我很高兴 - Dan Pritts


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

根据您的swappiness,文件访问模式,内存分配模式和许多不可预测的事情的设置,可能会发生这样的情况:当您不释放这些缓存时,它们将被迫重用,这需要花费更多的时间。从未使用的内存池中分配内存。在最坏的情况下,linux的swappiness设置将导致程序内存被换出,因为linux认为这些文件在不久的将来可能比程序存储器更有可能被使用。

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

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

这样你就可以从缓存中删除不再需要的数据,并保留应缓存的内容,因为当你删除所有缓存时,必须从磁盘重新读取大量内容。那是在最糟糕的时刻:需要的时候;导致您的申请延迟,这是显而易见的,往往是不可接受的。

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


25
2018-05-20 19:46



我服务器上的所有应用程序都在nohup上运行。也许nohup.out被缓存并且吃掉内存? - ivcode
@ivcode:这可能是一个原因,检查nohup.out有多大。也许使用vmtouch来确定缓存了多少。 - PlasmaHH
我有一份cron工作 cat /dev/null > path/nohup.out 在nohup.out快速增长的每15分钟。也许linux正在缓存nohup.out,即使我正在清除它 - ivcode
@ivcode如果你不需要输出 nohup 你应该重新指导它 /dev/null。听起来你有一些非常缺乏经验的系统管理员在某些时候在你的系统上工作。看到 stackoverflow.com/questions/10408816/... 如何指导 nohup输出到 /dev/null - David Wilkins
虽然nohup.out以15分钟的间隔被清除,但如果应用程序进程因某种原因被杀死,nohup.out将自动从另一个脚本备份。我试过vmtouch。这确实是一个非常好的工具 - ivcode


我已经看到drop cache在启动一堆虚拟机时很有用。或者使用大页面的任何其他内容,例如某些数据库服务器。

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

但我同意大多数其他答案,因为通常没有理由每晚都放弃文件缓存。


16
2018-05-22 00:47



我赞成指出二阶偏见是对缓存缓存的响应。 - Noah Spurrier
此外,在高内存节点(1Tb)上的HPC应用程序中,读取几个大文件会导致大量内存缓存。由于许多HPC应用程序执行数百GB的malloc,因此系统可能会停滞数小时,因为一旦系统到达缓存内存“边界”,迁移过程会在NUMA节点上毫无结果地移动微小的碎片内存块。更糟糕的是,除了欺骗系统分配它可以立即释放的所有微小的2MB块,让大量的碎片整理和应用程序正常运行之外,你无法在userland中做任何事情来释放缓存。 - user1649948
+1创建大页面的命令(sysctl -w vm.nr_hugepages=...)除非我先删除缓存(Arch linux),否则拒绝工作。 - Aleksandr Dubinsky


当没有人具备实际发现问题的技能或经验时,有可能将其作为稳定系统的一种方式。

释放资源

删除缓存本质上会释放一些资源,但这会产生副作用,使系统实际上更难以完成它正在尝试的工作。如果系统交换(尝试从磁盘交换分区读取和写入的速度比实际能力更快),那么定期丢弃缓存可以减轻 症状,但没有什么可以治愈的 原因

什么是吃东西?

您应该确定导致大量内存消耗的原因使得丢弃缓存看起来有效。这可能是由任意数量的配置不当或仅仅是错误使用的服务器进程引起的。例如,在一台服务器上,当Magento网站在15分钟的间隔内达到一定数量的访问者时,我目睹了内存利用率最大化。这最终是由Apache配置为允许同时运行太多进程引起的。太多的进程,使用大量内存(Magento有时候是一个野兽)=交换。

底线

不要只是假设它是必要的东西。积极主动地找出它存在的原因,如果其他人认为它是错误的,那就有胆量禁用它,并观察系统 - 了解真正的问题并解决它。


8
2018-05-20 15:16





Linux / m68k实际上有一个内核错误导致kswapd疯狂并且吃掉了100%的CPU(50%,如果还有其他CPU绑定任务,比如Debian二进制包autobuilder - vulgo buildd - 已经运行),这可以(大多数)每隔几个小时运行一次这个特定命令可以减轻时间;并非总是如此)。

那就是说...你的服务器很可能不是m68k(Atari,Amiga,Classic Macintosh,VME,Q40 / Q60,Sun3)系统;-)

在这种情况下,排队的人要么遵循一些可疑的,或者至多是过时的建议,要么就如何错误地使用RAM得到了想法(现代思维确实说“免费RAM是RAM浪费”并建议缓存) ,或“发现”这个“修复”[原文如此!]其他地方的另一个问题(并且懒得搜索正确的修复)。


4
2018-05-21 08:03



“导致kswapd疯狂的内核错误” - 这是哪个错误? - Ben
@Ben看 这个帖子 (此消息和一些后续内容,其中一个包括猜测它可能来自哪里) - mirabilos
我遇到了类似的问题(虽然它是x86_64),此时唯一的解决方案是删除缓存 serverfault.com/questions/740790/... - Fernando
@Fernando我在m68k盒子上也有一个“drop caches”cronjob - mirabilos


一个原因可能是网站正在运行某种监控,它会检查免费ram的数量,并在免费ram降至某个百分比以下时向管理员发送警告。如果该监视工具足够愚蠢,不在自由ram计算中包含缓存,则可能会发送错误警告;定期清空缓存可以抑制这些警告,同时仍然允许工具注意“真实”ram何时变低。

当然,在这种情况下,真正的解决方案是修改监控工具,在自由ram计算中包含缓存;清理缓存只是一种解决方法,也是一种不好的方法,因为当进程访问磁盘时缓存会快速重新填充。

因此,即使我的假设是正确的,缓存清理也不是有意义的事情,而是一个没有足够能力解决主要问题的人的解决方法。


3
2018-05-21 06:20





我可以想到在夜间工作中这样做的一个合理的理由。

在大型系统上,定期删除缓存可能很有用,这样您就可以删除内存碎片。

内核透明的hugepage支持定期扫描内存,将小页面合并为大页面。在退化条件下,这可能导致系统暂停一两分钟(我在RHEL6中遇到的经验;希望它有所改善)。丢弃缓存可能会让巨大的页面清理工具有一些工作空间。

您可能会认为这是禁用透明大页面的一个很好的理由; OTOH您可能认为透明大页面的整体性能提升值得拥有,并且值得为每天丢失一次缓存付出代价。


我想到了你想要做的另一个原因,虽然不是在cron工作。在虚拟化系统将VM迁移到新硬件之前,这将是一个非常好的时机。减少要复制到新主机的内存内容。当然,你最终必须从存储中读取,但我可能会采取这种权衡。

我不知道是否有任何真正的软件实际上这样做。


3
2018-01-14 15:43



你有这方面的资料吗?如果这是一个问题,这听起来应该在内核中修复。 - gparent
我有透明的大页面暂停的个人经验。 RHEL6,戴尔R810,4CPU,64GB RAM。禁用透明的大页面(有一个/ proc文件来执行此操作)会立即修复暂停。我当时没有尝试缓存丢弃技术;相反,我重新配置我们的Java应用程序使用非透明的大页面,并禁用透明的大页面。 IIRC,我们调查了这种情况,足以意识到我们并不是唯一受影响的人,红帽知道这个问题。 - Dan Pritts
你好丹,我在我的服务器上保持相同的行为。我使用大量数据工作,并且在同一个python程序的10次计算(第一次计算时间的x2-3)之后,性能急剧下降。如果我看一下,内存缓存大小很大,100 + GB。如果我刷新这个内存缓存,并重新运行我的程序,我会恢复我的初始计算时间。你有任何文件或信息,分享这种现象吗?谢谢。 - Axel Borja
access.redhat.com/solutions/46111 描述它。您可以禁用透明的大页面,以查看是否存在问题。 - Dan Pritts