为什么Linux会奇怪地报告“空闲”内存?

这是Unix操作系统如何报告内存使用情况的一个典型问题 。
类似问题:

  • 服务器拒绝使用交换分区
  • 内存使用在LINUX中

我有运行Debian 6.0.6 Squeeze的生产服务器

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux 

每天cron以root身份执行备份脚本:

#crontab -e

 0 5 * * * /root/sites_backup.sh > /dev/null 2>&1 

#nano /root/sites_backup.sh

 #!/bin/bash str=`date +%Y-%m-%d-%H-%M-%S` tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz cd /home/backups/sites/ sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS cd ~ 

一切正常,但我注意到,Munin的内存图显示备份后caching缓冲区的增加。

然后我只是下载备份文件并删除它们。 删除之后,Munin的内存图cachingcaching返回到备份前的状态。

这是穆宁图:

外部托pipe的图像是一个死链接。

这是从服务器拒绝使用交换分区和一些其他类似的问题,在这个网站上的“问题”相同。 ( Linux服务器上的 内存使用率高 , LINUX中的内存使用率 , 内存中 运行低的Web服务器等)

注意内存消耗来自caching的事实。 这意味着它将文件保存在内存中。 caching的内存是“免费”的内存。 您的操作系统不会将内存块留空,而是将最近读取的文件保留在该空间中。 如果一个应用程序确实需要这个内存,它将被应用程序使用。 在此之前,如果经常引用磁盘,则有机会再次从磁盘读取文件。

根据这个图表,您的有效内存消耗在整个图表的持续时间内完全没有改变。

您正在遇到Linux Ate My Ram问题。

不要惊慌。

这不是一个问题。

你的系统是按devise工作的。

问题不是你的操作系统 – 问题是你对“空闲”内存的理解。


Unix系统使用内存不仅仅是运行程序。 内存可能用于:

  • 正在运行的程序(活动/使用)
  • 缓冲传输中的数据(缓冲区)
  • caching最近读取/写入磁盘的数据(caching)
  • 绝对没有(免费)

接下来是一个关于现代Unix系统如何报告RAM使用情况的简短(而且大部分是不完整的)巡视。

什么是空闲内存(OS定义)

当Unix系统将RAM报告为空闲时 ,意味着“我没有使用这个RAM”。
免费的 RAM实际上是毫无价值的 – 它不会让你的系统更快,它只是坐在那里“免费”,以防万一需要它。 这可能是我上面提到的其他三个项目中的任何一个。

什么是caching和caching?

高速caching和缓冲区内存是操作系统正在使用的内存,以使您的系统更快。
这个内存不是现在运行程序所需要的 ,所以你的操作系统正在使用它来保存它经常需要的数据 – 例如C库(几乎每个你运行的程序都需要)几乎总是保存在cache中,所以系统不必去磁盘上find它需要在屏幕上打印“Hello World”的指令。
实际上比这更复杂 – 共享内存, 有线内存等等,但是对于我们的目的来说,这个简单的解释就足够了。

什么是活动内存?

活动内存是我们理解为“已用”内存的一部分 – 应用程序正在使用的内存 – 对电子表格,服务网页,编辑graphics等进行sorting。
“主动”内存最近一直处于“主动”状态 – 该程序声称已经使用了内容(读取或写入),并不被认为是更换的好select。

什么是非活动内存?

像活动内存一样,非活动内存是应用程序正在使用的内存。 不同的是这个内存有一段时间没有被访问,所以如果推动来推动操作系统认为它可以交换到磁盘和(有点运气)程序声称它不会再要求它,所以它永远不会通知。

什么是“使用”记忆(人类的定义)

你和我所认为的“使用”内存本质上是活动和非活动内存的总和。 目前所有的应用程序要求使用的RAM。
只要你有更多的安装内存比积极和不活跃的内存(加上一个不错的安全余地,如512-1024MB顶部),你是在一个好的地方:你的操作系统可能不会交换和查杀性能。

什么是“自由”记忆(人类定义)

你和我所认为的“免费”内存是可用于运行程序的内存。
这比你的操作系统报告的“Free”数字稍微复杂一些。 当一个程序要求RAM时,操作系统将尝试以最小的破坏性方式获得该RAM,它可以:

  • 如果有可用空闲内存(坐在什么都不做)RAM将被分配。
  • 如果没有空闲的内存可用,操作系统会调用缓冲区和缓冲区空间:缓冲池中最近最less/最less访问的内容将被抛出,并且该内存被赋予程序。
  • 如果没有缓冲区/高速缓冲存储器内存来拆分交换将看看不活动的内存,并select它认为是最不可能被访问的区域。 该数据将被换到交换(磁盘),以及给予程序的新释放的RAM。
  • 如果所有非活动RAM都被换出,则交换器将开始将活动RAM放入磁盘。
    (这是关于性能通常在哪里狗的地方:每当一个程序开始在CPU上它的换出位需要被带回到RAM,这意味着其他一些程序的活动内存必须被换出 -掉期高营业额被称为颠簸
  • 如果系统把所有东西都换掉了(并且填满了交换分区),或者如果你正在运行一个没有交换分区的系统,就会发生坏事 。 在这一点上会发生两件事情之一:
    • malloc()将失败。 这是符合POSIX的行为 – 操作系统会告诉程序要求RAM不能满足要求。
      该程序可以要求更less的内存,或者如果它不能做一个较小的内存块可以清理和退出。 (如果程序写得不好,就会崩溃。)
    • 如果你在一个Linux机器上,那么OOM-Killer可能会通过团伙式的驱动来杀死狂热分子,终止其他进程来释放足够的RAM来满足请求。
      如果你不能说出我的描述和我对这个相关问题的回答,我认为这是处理这个问题的一个可怕的方法。

为什么删除文件时Free RAM会上升?

在这个问题的例子中,您注意到可以通过删除备份文件来“释放”RAM – 对此的解释非常简单:由于没有使用该文件(没有打开的文件句柄),并且不能从操作系统知道没有人会再次访问这些数据的文件系统(取消链接),并从文件系统caching中清除数据。
这会使操作系统报告更多的空闲内存,但对系统性能没有影响。

别的东西来检查是否上述失败:

检查Slabcaching( Slab:SReclaimable:SUnreclaim: in /proc/meminfo )的用法。 这是一个内核内部数据结构的caching,并且与free报告的页面caching分开。

如果slab高速caching对于“缺less的内存”的/proc/slabinfo/proc/slabinfo ,请检查/proc/slabinfo以查看它消失的位置。 如果是dentries或inode,则可以使用sync ; echo 2 > /proc/sys/vm/drop_caches sync ; echo 2 > /proc/sys/vm/drop_caches摆脱它们。

您还可以使用slabtop工具以友好的格式显示Slabcaching的当前使用情况。 c将按当前caching大小对列表进行sorting。

来自: https : //stackoverflow.com/a/5467207