我使用Mongo 2.4.9并且我有三个节点的副本集。 我已经执行了db.serverStatus()。mem并看到映射的大小非常高,47GB:
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信息:
"workingSet" : {
"note" : "thisIsAnEstimate",
"pagesInMemory" : 152599,
"computationTimeMicros" : 31143,
"overSeconds" : 1728
}
尺寸(Mb)= 152599 * 4kb - >转换为Mb = 596 Mb
我的问题是为什么映射内存的大小是fileSize的4.2倍,比storageSize或dataSize大15159倍? 映射的内存继续缓慢增长。
注意: 操作系统:Red Hat Enterprise Linux Server 5.7版(Tikanga) 物理内存:3892Mb
我读了这个article,但仍然不明白为什么映射内存的大小如此之大,考虑到足够小的实际数据(文件大小)。
感谢。
答案 0 :(得分:2)
您的mongo实例上有多少个数据库?事情是serverStatus
提供实例信息,考虑到它所拥有的所有数据库,关于mapped
字段:
mapped的值提供映射内存量,以兆字节为单位 (MB),由数据库。因为MongoDB使用内存映射文件,所以 价值可能大致相当于总的大小 您的数据库或数据库。
db.stats:
返回反映单个数据库的使用状态的统计信息。
如果您的实例上没有任何其他数据库,请查看您local
db的大小。这可能会非常大,具体取决于副本集的oplog大小。
回应评论:
更改oplog大小并不是一项简单的操作,选择合适的oplog大小也非常重要,因为它会影响延迟成员和复制滞后。我建议先阅读这篇文章Change the Size of the Oplog。
您不必担心映射内存的大小超出您的物理内存,并且它本身不应该是查询性能不佳的原因。映射内存不是“真正的”内存分配。它是驻留内存,显示mongo在RAM中明确拥有多少内存。
工作集中的oplog部分应该取决于你的辅助人员在主人身后的距离。
希望它有所帮助!