我在meminfo和ps之间遇到内存使用差异。 Free报告的可用内存比根据ps显然使用的进程少得多。
根据免费,我只有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。
我的记忆在哪里?任何人都可以了解如何追踪这一点吗?
答案 0 :(得分:21)
检查Slab:
中的平板缓存(SReclaimable:
,SUnreclaim:
和/proc/meminfo
的使用情况。这是内核数据结构的缓存,与free
报告的页面缓存分开。
如果slab缓存对于“缺少的内存”的大部分是可以使用的,请检查/proc/slabinfo
以查看它已经消失的位置。如果它是dentries或inode,您可以使用sync ; echo 2 > /proc/sys/vm/drop_caches
来删除它们。
您还可以使用slabtop
工具以友好的格式显示Slab缓存的当前使用情况。 c
将按当前缓存大小对列表进行排序。
答案 1 :(得分:3)
您不能只添加RSS或VSZ列来获取使用的内存量。不幸的是,Linux上的内存使用要复杂得多。有关更详尽的说明,请参阅Understanding memory usage on Linux,其中说明了如何在进程之间共享共享库,但是使用ps
等工具进行了重复计算。
我不知道如何免费计算显示的数字,但如果您需要更多详细信息,您可以随时挖掘其源代码。
答案 2 :(得分:1)
我相信你错过了共享内存值。我不认为ps
将共享RAM报告为RSS字段的一部分。与top
RES字段进行比较以查看。
当然,如果你确实添加了共享内存,你添加了多少?因为它是共享的,所以相同的RAM可能会显示出许多不同的进程。
您可以尝试通过创建解析/ proc / [pid] / smaps文件来解决该问题。
但是,这只会让你成为一部分。一些内存页面是共享的,但作为常驻页面。 fork()
电话后,这些页面会被共享。它们可以随时变为非共享状态,但在它们存在之前它们不会计入总使用系统RAM。 proc smaps文件也没有显示这些。