2013-04-25 69 views
0

我多少實際內存心亂如麻正在使用MongoDB的我..mongodb記憶混亂。缺頁和索引的大小

發行db.stats(1024 * 1024),我得到一個輸出

> db.stats(1024*1024) 
{ 
    "db" : "test", 
    "collections" : 9, 
    "objects" : 38035503, 
    "avgObjSize" : 535.2138471259339, 
    "dataSize" : 19414, 
    "storageSize" : 22280, 
    "numExtents" : 62, 
    "indexes" : 12, 
    "indexSize" : 4039, 
    "fileSize" : 30642, 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

所以我有一個小於4000萬的對象和4GB的索引大小。 在具有17GB RAM的Windows服務器上運行該工具,查看資源監視器和任務管理器,我的mongodb實例有一個17GB的工作集和相同數量的可共享。

我的第一個雖然是「好的,所以它已經預先分配數據文件,以便當它實際上需要空間時會有更快的插入」。

但後來我開始mongostat並可以清楚地看到一個非常高的頁面錯誤:

insert query update delete getmore command flushes mapped vsize res faults 
time 
    220 2419  0  0  0  221  0 27.9g 56.1g 16.8g 2659 

所以即時猜測,它實際上已經耗盡內存,現在交換,直接從磁盤迴升。

我的問題基本上是我如何才能真正確定數據量,我將能夠在我用完內存之前存儲?統計數據告訴我,它的索引值只有4GB,但mongo似乎被阻塞,交換和消耗全部17GB。我錯過了什麼?

+0

指數大小是無關緊要的。重要的是你的工作集大小。最新版本的MongoDB確實可以計算出您的工作集大小:http://docs.mongodb.org/manual/reference/server-status/#workingset儘管它只能給出一個粗略的估計。基本上你需要考慮的是:a。我所有的查詢都碰到索引,b。我的查詢是否包含在內,如果不是在給定的時間內分配到我的工作集中的文檔數量是多少? – Sammaye 2013-04-25 07:45:46

+0

這些是單個數據庫的統計數據,mongostat顯示您擁有27.9G的數據文件。還有其他數據庫嗎?是複製嗎? – 2013-04-25 07:46:23

+0

@Sammaye你再次失敗了。數據和索引大小都與它有關 - 你認爲還有什麼是佔用RAM的? – 2013-04-25 07:47:10

回答

2

你有17GB的RAM可用於大約20GB的數據加上4GB的索引(這只是在這個數據庫 - 我不知道你的系統中是否還有更多,但mongostat說你有總數據文件大小約28GB)。

如果您正在查詢整個數據集,難道您不希望最終讀取的新數據記錄不再適合RAM而不顯示先前讀取(並加載到RAM中)的某些記錄嗎?這就是你在頁面錯誤中看到的。

這不是您關心的數據存儲,而是數據的使用或查詢或訪問。如果所有內容都不能保留在RAM中,則它將被換出,然後在再次訪問時需要重新進入交換狀態。