2014-03-01 54 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

请参阅我的回答更新 –