MongoDB:映射内存的大小

时间:2014-03-01 17:54:47

标签: linux mongodb memory memory-management

我使用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,但仍然不明白为什么映射内存的大小如此之大,考虑到足够小的实际数据(文件大小)。

感谢。

1 个答案:

答案 0 :(得分:2)

您的mongo实例上有多少个数据库?事情是serverStatus提供实例信息,考虑到它所拥有的所有数据库,关于mapped字段:

  

mapped的值提供映射内存量,以兆字节为单位   (MB),由数据库。因为MongoDB使用内存映射文件,所以   价值可能大致相当于总的大小   您的数据库或数据库

db.stats:

  

返回反映单个数据库的使用状态的统计信息。

如果您的实例上没有任何其他数据库,请查看您local db的大小。这可能会非常大,具体取决于副本集的oplog大小。

回应评论:

更改oplog大小并不是一项简单的操作,选择合适的oplog大小也非常重要,因为它会影响延迟成员和复制滞后。我建议先阅读这篇文章Change the Size of the Oplog

您不必担心映射内存的大小超出您的物理内存,并且它本身不应该是查询性能不佳的原因。映射内存不是“真正的”内存分配。它是驻留内存,显示mongo在RAM中明确拥有多少内存。

工作集中的oplog部分应该取决于你的辅助人员在主人身后的距离。

希望它有所帮助!