2011-03-28 24 views
14

我得到了meminfo和ps之间的内存使用情况差异。 Free报告的可用内存比根据ps显然使用的进程少得多。Linux内存报告不一致

据自由,我只有3188mb免费:

free -m 
      total  used  free  shared buffers  cached 
Mem:   15360  13273  2086   0   79  1022 
-/+ buffers/cache:  12171  3188 
Swap:   0   0   0 

我试图追查在内存用ps会(剪断低于非0 RSS值):

ps -A --sort -rss -o comm,pmem,rss 

COMMAND   %MEM RSS 
mysqld   13.1 2062272 
java    6.2 978072 
ruby    0.7 114248 
ruby    0.7 114144 
squid   0.1 30716 
ruby    0.0 11868 
apache2   0.0 10132 
apache2   0.0 9092 
apache2   0.0 8504 
PassengerHelper 0.0 5784 
sshd    0.0 3008 
apache2   0.0 2420 
apache2   0.0 2228 
bash    0.0 2120 
sshd    0.0 1708 
rsyslogd   0.0 1164 
PassengerLoggin 0.0 880 
ps    0.0 844 
dbus-daemon  0.0 736 
sshd    0.0 736 
ntpd    0.0 664 
squid   0.0 584 
cron    0.0 532 
ntpd    0.0 512 
exim4   0.0 504 
nrpe    0.0 496 
PassengerWatchd 0.0 416 
dhclient3  0.0 344 
mysqld_safe  0.0 316 
unlinkd   0.0 284 
logger   0.0 252 
init    0.0 200 
getty   0.0 120 

然而,这是没有意义的,因为加起来的RSS列导致总共只有大约3287mb的内存使用率,应该几乎留下12gb免费!

我在Amazon AWS上使用内核2.6.16.33-xenU#2 SMP x86_64。

我的记忆在哪里?任何人都可以阐明如何追踪这一点?

+5

http://www.linuxatemyram.com/ – Erik 2011-03-28 19:09:27

+0

这也可能更适合于unix.stackexchange.com。好的问题,以及来自Erik的相当有趣的(如果不是简短的)评论。另外,我刚刚注意到,在我的Fedora系统上,虽然顶级报告只有大约4GB可用,但free -m命令(来自Erik的链接)报告大约7GB免费。 gnome-system-monitor也考虑磁盘缓存。 – 2011-03-28 19:14:58

+6

这与linuxatemyram.com不一样。注意我引用了3188mb免费的,这是正确的缓冲区/缓存空闲列。 – 2011-03-28 19:30:02

回答

21

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

如果板块高速缓存对于大部分“缺失内存”是可重复使用的,请检查/proc/slabinfo以查看它消失的位置。如果它是dentries或inode,则可以使用sync ; echo 2 > /proc/sys/vm/drop_caches来摆脱它们。

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

+0

这是解决方案。我想知道是否有办法限制内核使用这个缓存的全部/大部分空闲内存?如果应用程序需要它,我想它会从这个缓存中回收内存,但内存监控工具似乎没有考虑到它,所以他们大叫我没有留下空闲内存。 – 2011-03-30 17:07:59

+1

@Zoltan:不确定。这是堆栈溢出,我建议修复内存监视工具,以便它添加'SReclaimable'。哪一块板块是大部分使用量的负责人? – caf 2011-03-30 21:51:35

+0

我实际登录只是为了upvote这个答案。我有一台服务器报告使用1.6 GB的RAM(2GB,这是令人担忧的),当它的应用程序消耗至多300 MB。 'echo'解决了它(190 *实际*使用MBs)。根本原因可能是配置错误的logrotate脚本,它创建了数百万个文件,其名称为/var/log/dovecot/dovecot.log.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.gz.2。 gz。有时,在Linux中,感觉我们前往Twilight Zone并返回。 – 2015-03-27 03:47:31

3

您不能只是将RSS或VSZ列加起来以获得使用的内存量。不幸的是,Linux上的内存使用比这要复杂得多。有关更详细的说明,请参阅Understanding memory usage on Linux,它解释了共享库如何在进程之间共享,但是通过诸如ps之类的工具进行了重复计算。

我不知道如何自由计算它显示的数字,但如果你需要更多的细节,你总是可以挖掘它的源代码。

+0

这是一个非常丰富的链接。谢谢 – Sk606 2012-12-07 00:50:48

1

我相信你错过了共享内存值。我不认为ps将共享RAM报告为RSS字段的一部分。与top RES字段相比较以查看。

当然,如果你添加共享RAM,你添加了多少?因为它是共享的,所以相同的RAM可能会出现在许多不同的进程中。

您可以尝试通过创建解析/ proc/[pid]/smaps文件来解决该问题。

但仍然,这只会让你的一部分。一些内存页面是共享的,但是作为常驻账户。在拨打fork()后,这些页面会被共享。他们可以在任何时候取消共享,但直到他们不计入总使用的系统RAM。 proc smaps文件也不显示这些。

+0

在上述任何一种情况下,加起来的RSS内存不应该太高而不是太低? – 2013-12-16 12:07:34

相关问题