在我们的服务器中,我们习惯于在午夜删除缓存。
sync; echo 3 > /proc/sys/vm/drop_caches
当我运行代码时,似乎释放了很多RAM,但是我确实需要这样做。可用内存不是浪费吗?
在我们的服务器中,我们习惯于在午夜删除缓存。
sync; echo 3 > /proc/sys/vm/drop_caches
当我运行代码时,似乎释放了很多RAM,但是我确实需要这样做。可用内存不是浪费吗?
Answers:
您是100%正确的。这是不以释放RAM一个很好的做法。这可能是货物崇拜系统管理的一个示例。
是的,清除缓存将释放RAM,但是这会导致内核在磁盘上而不是在缓存中查找文件,这可能会导致性能问题。
通常,当可用RAM耗尽时,内核会清除缓存。它经常使用pdflush将脏内容写入磁盘。
这样删除高速缓存的原因是为了对磁盘性能进行基准测试,这是它存在的唯一原因。
在运行I / O密集型基准测试时,您要确保尝试的各种设置实际上都是在执行磁盘I / O,因此Linux允许您删除缓存而不是完全重新引导。
引用文档:
该文件不是控制各种内核高速缓存(inodes,dentries,页面高速缓存等)增长的一种手段,当系统上其他地方需要内存时,内核会自动回收这些对象。
使用此文件可能会导致性能问题。由于它丢弃了缓存的对象,因此重新创建被丢弃的对象可能会花费大量的I / O和CPU,尤其是当它们使用过多时。因此,不建议在测试或调试环境之外使用。
这里的基本思想可能还不错(只是非常幼稚和误导):可能有正在缓存的文件,例如在不久的将来不太可能访问的文件。这些“吃掉”的内存,稍后在必要时将由操作系统以一种或另一种方式释放。
取决于交换设置,文件访问模式,内存分配模式以及更多不可预测的事情,有可能发生的情况是,当您不释放这些缓存时,它们稍后将被强制重用,这需要花费更多的时间。从未使用的内存池中分配内存。在最坏的情况下,Linux的swappiness设置将导致程序存储器被换出,因为linux认为这些文件在不久的将来比程序存储器更可能被使用。
在我的环境中,Linux经常会猜错,并且在大多数欧洲证券交易所开始时(当地时间0900左右),服务器将开始执行它们每天仅执行一次的操作,需要交换以前由于写入而换出的内存日志文件,压缩它们,将它们复制等正在将缓存填满,以至于必须将其交换出去。
但是,删除缓存是否可以解决此问题?绝对不是。这里的解决方案是告诉linux不知道的东西:这些文件可能不再使用了。这可以通过编写应用程序使用posix_fadvise()
或使用cmd线工具vmtouch
(也可以用于查看事物以及缓存文件)来完成。
这样,您可以从缓存中删除不再需要的数据,并保留应缓存的内容,因为删除所有缓存时,必须从磁盘重新读取很多内容。那是在最坏的时刻:何时需要;在您的应用程序中造成明显的延迟,并且通常是不可接受的。
您应该拥有的是一个系统,该系统可以监视您的内存使用模式(例如,某些事物正在交换),然后进行相应的分析并采取相应的措施。解决方案可能是在一天结束时使用vtouch逐出一些大文件。也可能是增加更多的内存,因为服务器的每日高峰使用量就是这样。
cat /dev/null > path/nohup.out
随着nohup.out的迅速发展,我每隔15分钟就要完成一次正式任务。也许linux正在缓存nohup.out,即使我正在清除它
nohup
则应将其重定向到/dev/null
。听起来您有时在系统上有一些经验不足的系统管理员。参见stackoverflow.com/questions/10408816/…,了解如何将nohup
输出引导至/dev/null
我看到启动一堆虚拟机时,丢弃缓存非常有用。或其他使用大页面的东西,例如某些数据库服务器。
Linux中的大页面通常需要对RAM进行碎片整理,以便找到2MB的连续物理RAM放入页面中。释放所有文件缓存使此过程非常容易。
但是我同意大多数其他答案,因为通常没有理由每天晚上删除文件缓存。
sysctl -w vm.nr_hugepages=...
)甚至无法工作,除非我先删除高速缓存(Arch linux)。
当没有人真正拥有发现问题的技能或经验时,这可能是一种稳定系统的方法。
删除高速缓存本质上将释放一些资源,但这具有使系统实际上更难以执行其要执行的操作的副作用。如果系统交换(试图读取并从磁盘交换分区写入速度比它实际上是能够)再滴加缓存定期可以缓解症状,但无助于根治的原因。
您应该确定是什么导致大量内存消耗,从而导致删除高速缓存似乎可以正常工作。这可能是由于任何数量的配置不当或只是简单地错误使用服务器进程引起的。例如,在一台服务器上,当Magento网站在15分钟的间隔内达到一定数量的访问者时,我见证了内存利用率最大化。这最终是由于将Apache配置为允许太多进程同时运行而引起的。进程太多,占用大量内存(Magento有时是野兽)=交换。
不要仅仅认为这是必要的。主动找出原因所在,如果其他人认为它是错误的,则有胆量禁用它,并观察系统-了解真正的问题并解决。
Linux / m68k实际上有一个内核错误,该错误会导致kswapd疯狂并吞噬100%的CPU(如果还有其他CPU绑定任务,例如Debian二进制软件包autobuilder – vulgo –已经运行),则将消耗50%的CPU。时间;并非总是如此)可通过每隔几个小时运行一次此特定命令来缓解。
话虽这么说……您的服务器很可能不是m68k(Atari,Amiga,Classic Macintosh,VME,Q40 / Q60,Sun3)系统;-)
在这种情况下,插队的人要么遵循一些可疑的建议,要么充其量是过时的建议,或者对如何使用RAM产生了错误的想法(现代思维确实表示“空闲RAM浪费了RAM”并建议进行缓存) ,或“发现”此问题“解决”了其他问题(并且懒得寻找适当的解决方法)。
一个原因可能是该站点正在运行某种监视,该监视检查免费RAM的数量,并在免费RAM下降到一定百分比以下时向管理员发送警告。如果该监视工具足够愚蠢,无法在自由内存计算中不包括缓存,则它可能会发送错误警告;定期清空缓存可以抑制这些警告,同时仍然允许工具在“实际”内存变低时发出通知。
当然,在这种情况下,真正的解决方案是修改监视工具,以将缓存包括在自由内存计算中。清理缓存只是一种解决方法,也是一种不好的选择,因为当进程访问磁盘时,缓存将快速重新填充。
因此,即使我的假设是正确的,缓存清理也不是很有意义的事情,但是对于那些没有能力解决主要问题的人来说,这只是一种解决方法。
我可以想到一个合理的理由,在每晚的Cron工作中执行此操作。
在大型系统上,定期删除缓存可能很有用,这样您就可以消除内存碎片。
内核透明大页面支持会定期进行内存扫描,以将小页面合并为大页面。在退化的情况下,这可能会导致系统暂停一到两分钟(我的经验是在RHEL6中;希望它有所改善)。删除缓存可能会使大型页面清除程序有一些工作空间。
您可能会争辩说,这是禁用透明大页面的一个很好的理由。OTOH您可能会相信透明大页带来的整体性能提高值得拥有,并且值得付出每天丢失一次缓存的代价。
我想过了另一个原因,尽管您不是在做正式的工作,但您仍想这样做。在虚拟化系统将VM迁移到新硬件之前,这将是一个很好的时机。较少的内存内容可复制到新主机。当然,您最终将不得不从存储中读取内容,但是我可能会权衡取舍。
我不知道任何virt软件是否确实可以做到这一点。
问题是从2014年开始的,但是由于这一问题在某些隐藏的centos 6.8后端上一直存在,因此对于某些人可能仍然有用。
https://github.com/zfsonlinux/zfs/issues/1548 描述了zfs的问题。在那里,无法为已删除的文件释放磁盘空间,因为如果在zfs上使用nfs,则不会从内核的inode缓存中删除文件的inode。
引用错误线程的话,behlendorf,2015年1月6日写道:
当前的推测是由于某种原因,NFS服务器保留了文件句柄的缓存版本。在NFS服务器删除该文件句柄之前,ZFS无法取消链接此文件。一些简单的测试表明,在服务器上删除高速缓存将导致该引用被删除(例如NFS文件句柄),此时将正确释放空间。内存压力也可能导致内存下降。
例如,如果您不希望因停机而重组zfs,则夜间echo 3> / proc / sys / vm / drop_caches是解决该错误的最简单方法。
因此,也许不是货物崇拜管理,但原因是一些相当好的调试。
这在NUMA(非统一内存访问)系统上可能是有意义的,在该系统上,通常每个CPU(套接字)都可以透明地访问所有内存,但是与并行HPC应用程序关联,可以比其他套接字的内存更快地访问其自己的内存。
许多简单的并行应用程序倾向于从单个进程执行文件I / O,从而在退出时在分配给磁盘高速缓存的单个NUMA节点上留下很大一部分内存,而在另一个NUMA节点上,内存可能大部分都是空闲的。在这种情况下,据我所知,由于Linux内核中的缓存回收过程仍不支持NUMA,因此在已将内存分配给缓存的NUMA节点上运行的进程被迫在另一个NUMA节点上分配内存,只要另一个节点上有可用的RAM,就会破坏性能。
但是,在HPC系统中,明智的做法是在开始新的用户作业之前而不是在cron的特定时间清理缓存。
对于非并行应用程序,此问题不太可能出现。
当页面缓存很大(比当前的交换使用量大很多),并且交换和交换又交替发生时,这就是您需要删除缓存的时候。我已经看到在运行Ubuntu 16.04LTS的我的MariaDB数据库服务器之一中内存使用率增加的情况,而Linux只是选择增加交换使用率,而不是删除未使用的页面缓存。我的系统中已经禁用了透明的大页面,因为TokuDB要求将其禁用。无论如何,也许这不是一个错误,但是linux仍然在做这种行为令我感到困惑。各种资料表明,Linux将在应用程序请求时删除页面缓存:
但是现实并非如此简单。解决方法是:
例子dd run:
dd if=/var/log/apache2/access_log.1 iflag=nocache count=0
示例python-fadvise:
pyadvise -d /var/log/apache2/access_log.1
我有一台在PAE内核上运行16GB RAM的台式机。一两个小时后,磁盘性能会急剧下降,直到删除高速缓存为止,因此我将其放入cron。我不知道这是否是PAE内核的问题,或者如果有足够的内存,那么缓存的实现是如此缓慢。