我有mongoengine的Django应用程序,它经常执行一些聚合查询。
主要问题是 mongod 占用所有内存然后崩溃,因此没有LRU工作, mongod 只是试图获得越来越多的内存。
我的mongodb版本是3.2,默认引擎是MMAPv1。正如文档所说,对于缓存MMAPv1需要dataSize + indexSize的RAM量。在我的情况下,大约370Mb(dataSize约为290,indexSize约为80)。
这是我的db.stats():
{
"db" : "random_db",
"collections" : 14,
"objects" : 155613,
"avgObjSize" : 1859.8720672437394,
"dataSize" : 289420272,
"storageSize" : 338821120,
"numExtents" : 32,
"indexes" : 22,
"indexSize" : 82512192,
"fileSize" : 1006632960,
"nsSizeMB" : 16,
"extentFreeList" : {
"num" : 25,
"totalSize" : 258314240
},
"dataFileVersion" : {
"major" : 4,
"minor" : 22
},
"ok" : 1
}
实际上我已经拥有1GB内存,并为另外1GB做了交换文件。 当我的应用程序执行第一个聚合查询(从集合中只获取50个文档)时,mongod RAM使用量增加到~300Mb(当我开始服务时它大约是50-100Mb),直到~70个这样的查询被执行 - 我所有的内存+交换结束, mongod 崩溃。
我已经创建了所有索引,需要聚合的'$ match',如果需要,我可以在这里添加一些。
那么为什么〜缓存中的4000个文档占用超过2GB的RAM,如果我的整个数据库只需要370Mb而db中只有150k文件?我知道我做错了,问题很简单,但我仍无法在文档中找到解释。
BTW,这是我的db.serverStatus.mem:
{
"bits" : 64,
"resident" : 112,//this value growth when queries executed
"virtual" : 2523,
"supported" : true,
"mapped" : 1136,
"mappedWithJournal" : 2272
}
所以,我想,我的 mongod 对于缓存中的整个数据包不能超过2523Mb?