2014-03-01 114 views
0

我使用Mongo 2.4.9,我有一個副本集爲三個節點。 我已執行db.serverStatus()MEM和看到的映射該尺寸是非常高的,47GB:MongoDB:大尺寸的映射內存

db.serverStatus().mem 
{ 
     "bits" : 64, 
     "resident" : 266, 
     "virtual" : 10149, 
     "supported" : true, 
     "mapped" : 47402, 
     "mappedWithJournal" : 65730 
} 

結果db.stats的(1024)

{ 
     "db" : "xxxxx", 
     "collections" : 7, 
     "objects" : 670488, 
     "avgObjSize" : 2890.6140721385023, 
     "dataSize" : 1892697, 
     "storageSize" : 2273304, 
     "numExtents" : 49, 
     "indexes" : 42, 
     "indexSize" : 399378, 
     "fileSize" : 10416128, 
     "nsSizeMB" : 16, 
     "dataFileVersion" : { 
       "major" : 4, 
       "minor" : 5 
     }, 
     "ok" : 1 
} 

在兆字節

"dataSize" : 1848mb 
"storageSize" : 2220mb 
"fileSize" : 10172mb 

工作集信息:

"workingSet" : { 
     "note" : "thisIsAnEstimate", 
     "pagesInMemory" : 152599, 
     "computationTimeMicros" : 31143, 
     "overSeconds" : 1728 
} 

大小(Mb)= 152599 * 4kb - >轉換爲Mb = 596 Mb

我的問題是爲什麼映射內存的大小是fileSize的4,2倍並且比storageSize或dataSize大15159倍? 映射內存內存繼續增長緩慢。

注: OS:紅帽企業Linux服務器版本5.7(Tikanga) 物理內存:3892Mb

我讀這article但還是不明白,爲什麼映射內存的大小,使大考慮到足夠小的實際數據量(文件大小)。

謝謝。

回答

2

你有多少個數據庫在你的mongo實例上?事情是serverStatus提供實例信息考慮到它擁有所有的數據庫,對於mapped場:

的映射值提供了一個映射內存量,以兆字節 (MB),通過數據庫。由於MongoDB使用內存映射文件,因此此 值可能大致相當於您的數據庫或數據庫的總大小 。

雖然db.stats:

返回反映單個數據庫的使用狀況統計數據。

如果您的實例上沒有任何其他數據庫,請查看您的大小local db。這可能會很大,具體取決於副本集的oplog大小。

答案的評論:

更改OPLOG大小不是一個簡單的操作,它也是非常重要的挑選合適的OPLOG大小,因爲它影響延遲成員和複製延遲。我建議先閱讀這篇文章Change the Size of the Oplog

您不必擔心映射內存的大小超過了您的物理內存,它本身不應該是查詢性能差的原因。映射內存不是「真正的」內存分配。它是駐留內存,它顯示了mongo在RAM中明確擁有多少內存。

oplog在工作集中的部分應該取決於你的輔助節點在主節點後面的距離。

希望它有幫助!

+0

感謝您的快速響應。你是對的,serverStatus命令返回所有數據庫的信息。 我有以下數據庫: >節目數據庫 27017(空) 管理(空) 配置(空) 當地24.06640625GB 測試(空) MYDB 9.94921875GB oplog.rs集合的大小是23386Mb =〜23gb – user1932034

+0

我有下一個問題:我可以安全地刪除oplog集合來更改init大小嗎?映射內存的大尺寸是否會影響查詢的性能,但不考慮物理內存的大小(映射32gb>物理4gb)? oplog coll的數據是否是工作集的一部分?謝謝 – user1932034

+0

請參閱我的回答更新 –