这是一个典型问题关于 Unix 操作系统如何报告内存使用情况。
类似问题:
我有正在运行的生产服务器Debian 6.0.6 压缩
#uname -a
Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux
每天计划任务以 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 图表:
外部托管的图像是一个无效链接。
答案1
这与服务器拒绝使用交换分区以及本网站上其他一些类似的问题。(Linux 服务器上的高内存使用率,LINUX 中的内存使用情况,Web 服务器内存不足, ETC。)
注意内存消耗来自缓存。这意味着它将文件保存在内存中。缓存内存是“空闲”内存。您的操作系统不会让内存块空着,而是将最近读取的文件保存在该空间中。如果应用程序确实需要该内存,它将被该应用程序使用。在此之前,如果文件被频繁引用,它有机会让您免于再次从磁盘读取文件。
根据该图表,您的有效内存消耗在整个图表持续期间根本没有变化。
答案2
您正在经历Linux 占用了我的内存问题。
不要恐慌。
这不是问题。
您的系统按照设计运行。
问题不在于您的操作系统——问题在于您对“可用”内存的理解。
Unix 系统使用内存不仅仅是为了运行程序。内存可能用于:
- 正在运行的程序(活跃/已使用)
- 缓冲传输中的数据(缓冲区)
- 缓存最近从磁盘读取或写入磁盘的数据(缓存)
- 绝对没有(免费)
接下来是对现代 Unix 系统如何报告 RAM 使用情况的简要(且基本上不完整)介绍。
什么是可用内存(操作系统定义)?
当 Unix 系统报告 RAM 为自由的它的意思是“我没有将此 RAM 用于任何用途”。
自由的RAM 实际上毫无价值 - 它不会让您的系统运行得更快,只是闲置在那里以备不时之需。这个“闲置”的东西可能是我上面提到的其他三项中的任何一项。
什么是缓存和缓冲存储器?
缓存和缓冲内存是操作系统用来提高系统速度的 RAM。
这些内存是现在不需要运行程序,因此您的操作系统会使用它来保存经常需要的数据——例如,C 库(您运行的几乎每个程序都需要它)几乎总是保存在cache
内存中,因此系统不必去磁盘查找在屏幕上打印“Hello World”所需的指令。
实际上,情况要复杂得多——有共享记忆,有线记忆等等——但对于我们的目的来说,这个简单的解释就足够了。
什么是主动记忆?
活动内存是我们理解的“已用”内存的一部分——应用程序正在使用的 RAM,用于执行任何操作——排序电子表格、提供网页、编辑图形等。
“活动”内存最近一直处于“活动”状态——程序声称它已经使用了其内容(读取或写入),并且它不被认为是交换出去的好候选者。
什么是非活动内存?
与活动内存一样,非活动内存是应用程序用于执行任何操作的 RAM。不同之处在于,这块内存已经有一段时间没有被访问过了,因此如果情况紧急,操作系统认为可以将其交换到磁盘,并且(如果运气好的话)程序声称不会再次请求这块内存,因此它永远不会注意到。
什么是“已用”内存(人类的定义)
你我所认为的“已用”内存本质上是活动内存和非活动内存的总和。应用程序当前占用的所有 RAM。
只要你安装的 RAM 大于活动内存和非活动内存的总和(再加上一个不错的安全范围,比如 512-1024MB),你就没问题:你的操作系统大概不会影响交换并降低性能。
什么是“可用”内存(人类的定义)?
你和我所认为的“空闲”内存是可用于运行程序的内存。
这比操作系统报告的“空闲”数字略微复杂一些。当程序请求 RAM 时,操作系统将尝试以尽可能不具破坏性的方式获取该 RAM:
- 如果有可用内存(闲置不执行任何操作),则会分配 RAM。
- 如果没有可用的内存,操作系统将蚕食缓存和缓冲区空间:缓冲池中最近最少/最不频繁访问的内容将被丢弃,并将该 RAM 提供给程序。
- 如果没有缓冲区/缓存 RAM 可供利用,交换器将查看非活动内存,并选择它认为最不可能被访问的区域。这些数据将分页输出到交换(磁盘),并将新释放的 RAM 提供给程序。
- 如果所有非活动 RAM 都已换出,交换器将开始将活动 RAM 放入磁盘。
(这通常是性能下降的原因:每次程序轮到 CPU 时,其换出的位都需要重新放入 RAM,这意味着其他一些程序的活动内存必须被换出-- 掉期交易的高周转率被称为鞭笞) - 如果系统已经交换了所有可以交换的内容(并填满了交换分区),或者你正在运行系统没有交换分区,坏事发生。此时将发生以下两种情况之一:
malloc()
将会失败。这是符合 POSIX 的行为 - 操作系统将告诉请求 RAM 的程序它无法满足请求。
程序可以请求较少的 RAM,或者如果它无法使用较小的内存块,它可以清理并退出。(如果程序编写得不好,它就会崩溃。)- 如果你使用的是 Linux,OOM 杀手可能会像团伙一样疯狂杀戮,终止其他进程以尝试释放足够的 RAM 来满足请求。
如果您无法通过我在此处的描述和我在链接问题上的回答看出这一点,我认为这是解决问题的糟糕方法。
为什么删除文件时可用 RAM 会增加?
在本问题的示例中,您注意到可以通过删除备份文件来“释放”RAM——对此的解释非常简单:由于没有任何东西在使用该文件(没有打开的文件句柄),并且无法再从文件系统访问它(未链接),因此操作系统知道没有人会再次访问该数据,因此它会从文件系统缓存中清除数据。
这会使操作系统报告更多的可用内存,但不会影响系统性能。
答案3
如果上述操作失败,还需要检查其他内容:
检查 Slab 缓存的使用情况(
Slab:
,SReclaimable:
和SUnreclaim:
中的/proc/meminfo
)。这是内核数据结构的缓存,与 报告的页面缓存是分开的free
。如果 slab 缓存占了“丢失内存”的很大一部分,请检查
/proc/slabinfo
它去哪儿了。如果是 dentry 或 inode,您可以使用sync ; echo 2 > /proc/sys/vm/drop_caches
它们来清除它们。您还可以使用该
slabtop
工具以友好的格式显示 Slab 缓存的当前使用情况。c
将按当前缓存大小对列表进行排序。