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


44

这是有关Unix操作系统如何报告内存使用情况的规范问题
类似问题:

我有运行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的内存图显示备份后缓存缓冲区的增加。

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

这是穆宁图:

外部托管的映像是无效链接。


3
恭喜,这个问题已被接受(就像今天的第六个问题一样,它恰好是最有趣,最漂亮的示例:-)
voretaq7

Answers:


27

这与服务器拒绝使用交换分区和该站点上的其他一些类似问题的“问题”相同。(高内存的Linux服务器的使用量在Linux的内存使用情况Web服务器中的内存不足等)

请注意以下事实:内存消耗来自缓存。这意味着它将文件保存在内存中。缓存的内存是“空闲”内存。您的操作系统没有保留内存块为空,而是将最近读取的文件保留在该空间中。如果某个应用程序确实需要该内存,它将被该应用程序使用。在此之前,如果经常引用该文件,则可以避免再次从磁盘读取文件。

根据此图,您的有效内存消耗在图的整个持续时间内都没有改变。


是否可以指示服务器不要缓存这些文件?我想sync; echo 3 > /proc/sys/vm/drop_caches备份后应该运行?

13
@ stan31337是的,有可能,不,您不应该这样做。将该文件存储在内存中不会花费您任何费用。如果清除所有缓存,则缓存的每个文件都必须从磁盘中再次读取,这只会降低系统速度。让它做它打算做的事情。
杰夫·费兰德

2
@ stan31337删除备份文件时,操作系统会自动将其从缓存中踢出(这就是为什么您的可用内存在删除后会再次跳出)– Linux足够聪明,可以知道一个未打开且无法打开的文件从文件系统树中访问将不再被访问。就像Je​​ff所说的那样,您绝对不希望转储整个FS缓存(系统将只需要从磁盘上重新读取和重新缓存该数据,这实际上会使您的服务器变慢一会儿)
voretaq7

61

您遇到Linux Ate My Ram问题。

不要惊慌。

这不是问题。

您的系统正在按设计工作。

问题不在于您的操作系统,而是您对什么是“可用”内存的理解。


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

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

接下来是对现代Unix系统如何报告RAM使用情况的简要介绍(并且在很大程度上是不完整的)。

什么是可用内存(操作系统定义)

当Unix系统将RAM报告为Free时,表示“我没有在任何东西上使用此RAM”。
免费 RAM是有效地毫无价值-这是不是让你的系统变得更快,它只是坐在那里的情况是“免费”的东西需要它。那可能是我上面提到的其他三个项目中的任何一个。

什么是缓存和缓冲存储器?

缓存和缓冲存储器是操作系统用来使您的系统更快的RAM。现在不需要运行该程序所需的
内存,因此您的操作系统正在使用它来保存其经常需要的数据-例如,C库(几乎所有运行的程序都需要此库)几乎总是保存在内存中,因此系统不必转到磁盘上即可找到在屏幕上打印“ Hello World”所需的说明。实际上,这要复杂得多-有共享内存,有线内存等-但就我们的目的而言,这种简单的解释就足够了。cache

什么是活动内存?

活动内存是我们理解为“已使用”内存的一部分-应用程序正在使用的RAM用于应用程序的工作-排序电子表格,提供网页,编辑图形等。
“活动”内存最近一直处于“活动”状态- -声称它已利用其内容(读取或写入)的程序,并且它不被认为是换出的理想选择。

什么是非活动内存?

像活动内存一样,非活动内存是应用程序正在使用的RAM。所不同的是,该存储器已经有一段时间没有被访问了,因此如果推一下推操作系统会认为它可以换出到磁盘上,并且(幸运的是)该程序声称不会再请求它,因此永远不会注意到。

什么是“已用”内存(人类定义)

您和我认为的“已用”内存实质上是活动内存和非活动内存的总和。应用程序当前要求其使用的所有RAM。
只要您安装的RAM超过活动内存和非活动内存的总和(再加上512-1024MB的安全裕度),您就可以放心:您的操作系统可能不会达到交换和破坏性能的目的。 。

什么是“空闲”内存(人类定义)

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

  • 如果有可用内存(无所事事),则会分配RAM。
  • 如果没有可用的可用内存,则OS会蚕食Cache和Buffer空间:将丢弃缓冲池中最近/最少访问的内容,并将该RAM分配给程序。
  • 如果没有缓冲区/高速缓存RAM用来蚕食交换器,它将查看不活动的内存并选择它认为最不可能访问的区域。该数据将被调以交换(磁盘),并将新释放的RAM分配给程序。
  • 如果所有非活动RAM已被换出,交换器将开始将活动RAM放入磁盘。
    (这是性能通常会受到影响的地方:每次程序打开CPU时,其换出的位都必须带回RAM中,这意味着其他程序的活动内存必须换出 -掉期的高周转率被称为th动
  • 如果系统已经交换了所有可能的东西(并填满了交换分区),或者如果您运行的系统没有交换分区,则发生坏事。此时,将发生以下两种情况之一:
    • malloc()将失败。这是符合POSIX的行为-操作系统将告知程序要求RAM的程序不能满足该请求。
      该程序可以请求较少的RAM,或者如果无法占用较小的内存块就可以清理并退出。(如果程序编写不当,将导致崩溃。)
    • 如果您使用的是Linux,则OOM-Killer可能会通过杀死狂潮来进行帮派风格的驱逐,终止其他进程以尝试释放足够的RAM以满足请求。
      如果您无法通过此处的描述和对链接问题的回答无法分辨,我认为这是解决问题的一种糟糕方法。

删除文件时,为什么可用RAM会增加?

在这里问题的示例中,您注意到可以通过删除备份文件来“释放” RAM的原因-解释很简单:由于没有文件在使用该文件(没有打开的文件句柄),并且不再可从该文件访问操作系统知道文件系统(未链接)后,再也没有人会再次访问该数据,因此它会从文件系统缓存中清除数据。
这使操作系统报告更多的可用内存,但对系统性能没有影响。


现在对我来说非常清楚...我的Linux经验大约需要2个月,而这一切都始于此Debian服务器。一个月前,我已经在家用笔记本电脑上安装了Gentoo,并对其性能感到惊讶,甚至在我的工作计算机上也从Windows用户变成了Linux用户。用Gentoo学习Linux很棒,但是仍然有很多东西需要学习。

@ stan31337您不是唯一一个尚不清楚的人-对于来自Windows背景的人来说尤其困难,因为除非您深入了解Windows,否则它不会以这种详细程度报告内存使用情况-它只是“已使用”(由程序使用) )和“免费”(供程序使用)。Mac用户可以轻松一点,因为Activity Monitor基本上是的图形版本,top并报告Free / Wired / Active / Inactive RAM。
voretaq7 2012年

我以前在Windows上使用过Process Explorer,它显示了很多Memory内容,但是其中大多数对我来说还是不清楚的,以至于我实际上没有看过它们……

2
另外,应该指出的是,尽管Windows通常不会显示太多细节,但是它具有非常相似的设置。
约阿希姆·绍尔

您知道,即使在Windows中,内存读数也令人困惑。这是操作系统制造商可能希望更加强调的事情,或者是用户应该比现在少关注的事情。
gparent

2

其他检查以上内容是否失败的方法:

检查板坯缓存(的使用Slab:SReclaimable:SUnreclaim:/proc/meminfo)。这是内核内数据结构的缓存,与所报告的页面缓存分开free

如果平板缓存可用于“丢失的内存”的很大一部分,请检查/proc/slabinfo它的去向。如果是牙科或inode,则可以sync ; echo 2 > /proc/sys/vm/drop_caches用来摆脱它们。

您也可以使用该slabtop工具以友好的格式显示Slab缓存的当前使用情况。 c将按当前缓存大小对列表进行排序。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.