2013-04-25 26 views
0

我多少实际内存心乱如麻正在使用MongoDB的我..mongodb记忆混乱。缺页和索引的大小

发行db.stats(1024 * 1024),我得到一个输出

> db.stats(1024*1024) 
{ 
    "db" : "test", 
    "collections" : 9, 
    "objects" : 38035503, 
    "avgObjSize" : 535.2138471259339, 
    "dataSize" : 19414, 
    "storageSize" : 22280, 
    "numExtents" : 62, 
    "indexes" : 12, 
    "indexSize" : 4039, 
    "fileSize" : 30642, 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

所以我有一个小于4000万的对象和4GB的索引大小。 在具有17GB RAM的Windows服务器上运行该工具,查看资源监视器和任务管理器,我的mongodb实例有一个17GB的工作集和相同数量的可共享。

我的第一个虽然是“好的,所以它已经预先分配数据文件,以便当它实际上需要空间时会有更快的插入”。

但后来我开始mongostat并可以清楚地看到一个非常高的页面错误:

insert query update delete getmore command flushes mapped vsize res faults 
time 
    220 2419  0  0  0  221  0 27.9g 56.1g 16.8g 2659 

所以即时猜测,它实际上已经耗尽内存,现在交换,直接从磁盘回升。

我的问题基本上是我如何才能真正确定数据量,我将能够在我用完内存之前存储?统计数据告诉我,它的索引值只有4GB,但mongo似乎被阻塞,交换和消耗全部17GB。我错过了什么?

+0

指数大小是无关紧要的。重要的是你的工作集大小。最新版本的MongoDB确实可以计算出您的工作集大小:http://docs.mongodb.org/manual/reference/server-status/#workingset尽管它只能给出一个粗略的估计。基本上你需要考虑的是:a。我所有的查询都碰到索引,b。我的查询是否包含在内,如果不是在给定的时间内分配到我的工作集中的文档数量是多少? – Sammaye 2013-04-25 07:45:46

+0

这些是单个数据库的统计数据,mongostat显示您拥有27.9G的数据文件。还有其他数据库吗?是复制吗? – 2013-04-25 07:46:23

+0

@Sammaye你再次失败了。数据和索引大小都与它有关 - 你认为还有什么是占用RAM的? – 2013-04-25 07:47:10

回答

2

你有17GB的RAM可用于大约20GB的数据加上4GB的索引(这只是在这个数据库 - 我不知道你的系统中是否还有更多,但mongostat说你有总数据文件大小约28GB)。

如果您正在查询整个数据集,难道您不希望最终读取的新数据记录不再适合RAM而不显示先前读取(并加载到RAM中)的某些记录吗?这就是你在页面错误中看到的。

这不是您关心的数据存储,而是数据的使用或查询或访问。如果所有内容都不能保留在RAM中,则它将被换出,然后在再次访问时需要重新进入交换状态。