这是一个关于 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 的内存图将缓存和缓冲区返回到备份前的状态。
这是 Munin 图:
外部托管图像是无效链接。
您遇到了Linux Ate My Ram问题。
不要恐慌。
这不是问题。
您的系统正在按设计工作。
问题不在于您的操作系统——问题在于您对什么是“空闲”内存的理解。
Unix 系统不仅仅将内存用于运行程序。内存可能用于:
以下是对现代 Unix 系统如何报告 RAM 使用情况的简要(但大部分不完整)的介绍。
什么是可用内存(操作系统定义)?
当 Unix 系统将 RAM 报告为可用时,这意味着“我没有将此 RAM 用于任何用途”。
免费RAM 实际上毫无价值 - 它不会让您的系统更快,它只是坐在那里“免费”以备不时之需。那东西可能是我上面提到的其他三个项目中的任何一个。
什么是缓存和缓冲内存?
高速缓存和缓冲内存是操作系统用来提高系统速度的 RAM。现在运行程序不需要
这个内存,所以你的操作系统用它来保存它经常需要的数据——例如 C 库(你运行的几乎每个程序都需要)几乎总是保存在内存中,所以系统不必去磁盘上寻找在屏幕上打印“Hello World”所需的指令。它实际上比这复杂得多——有共享内存、有线内存等——但对于我们的目的来说,这个简单的解释就足够了。
cache
什么是主动记忆?
活动内存是我们理解为“已用”内存的一部分——应用程序正在使用的 RAM,无论它们做什么——排序电子表格、提供网页、编辑图形等。
“活动”内存最近一直处于“活动”状态—— - 程序声称它已经使用了它的内容(读或写),并且它不被认为是换出的好候选者。
什么是非活动内存?
与活动内存一样,非活动内存是应用程序用于执行任何操作的 RAM。不同之处在于这段内存有一段时间没有被访问过,所以如果迫不得已,操作系统认为它可以换出到磁盘,并且(运气好的话)程序声称它不会再次请求它,所以它永远不会注意到。
什么是“已用”内存(人类定义)
您和我所认为的“已用”内存本质上是活动内存和非活动内存的总和。应用程序当前要求使用的所有 RAM。
只要您安装的 RAM 多于活动内存和非活动内存的总和(加上顶部 512-1024MB 的良好安全余量),您就处于一个好的位置:您的操作系统可能不会遇到交换和降低性能.
什么是“免费”内存(人类定义)?
您和我认为的“空闲”内存是可用于运行程序的内存。
这比您的操作系统报告的“免费”数字稍微复杂一些。当程序请求 RAM 时,操作系统将尝试以破坏性最小的方式获取该 RAM:
(这就是性能通常受制于狗的地方:每次程序启动 CPU 时,它换出的位都需要返回到 RAM 中,这意味着必须换出其他一些程序的活动内存——交换中的高周转率称为颠簸)
malloc()
将失败。这是符合 POSIX 规范的行为——操作系统会告诉请求 RAM 的程序它不能满足请求。该程序可以要求更少的 RAM,或者如果它不能使用更小的内存块,它可以清理并退出。(如果程序写得不好,它只会崩溃。)
如果您无法通过我在这里的描述和我对链接问题的回答来判断,我认为这是处理问题的糟糕方法。
为什么删除文件时 Free RAM 会增加?
在此处问题的示例中,您注意到可以通过删除备份文件来“释放”RAM——对此的解释非常简单:因为没有任何东西正在使用该文件(没有打开的文件句柄)并且它不再可以从文件系统(未链接)操作系统知道没有人会再次访问该数据,因此它会从文件系统缓存中清除数据。
这使得操作系统报告更多的可用内存,但对系统性能没有影响。
这与服务器拒绝使用交换分区和该站点上的其他一些类似问题的“问题”相同。(Linux 服务器上的高内存使用率、LINUX中的内存使用率、内存不足的Web 服务器等)
注意内存消耗来自cache。这意味着它在内存中保存了一个文件。缓存内存是“空闲”内存。您的操作系统不会将内存块留空,而是将最近读取的文件保存在该空间中。如果应用程序确实需要该内存,则该应用程序将使用它。到那时,如果文件被频繁引用,您就有机会避免再次从磁盘读取文件。
根据这张图,您的有效内存消耗在整个图表持续时间内根本没有变化。
其他检查上述是否失败的东西:
来自:https ://stackoverflow.com/a/5467207