2011-03-28 75 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