mongodb内存混乱。页面错误和索引大小

mongodb内存混乱。页面错误和索引大小,mongodb,indexing,Mongodb,Indexing,我完全搞不清楚我的mongodb实际使用了多少内存 发出db.stats(1024*1024)我得到一个输出 > db.stats(1024*1024) { "db" : "test", "collections" : 9, "objects" : 38035503, "avgObjSize" : 535.2138471259339, "dataSize" : 19414, "storageSize" : 22280, "numExt

我完全搞不清楚我的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
所以我猜它实际上已经用完了内存,现在直接从磁盘交换和拾取


基本上,我的问题是,在RAM耗尽之前,我如何确定能够存储的数据量?。统计数据告诉我,它只有4GB的索引,但mongo似乎被阻塞了,交换并消耗了所有17GB。我遗漏了什么?

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

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


您关心的不是数据存储,而是正在使用、查询或访问的数据。如果它不能全部留在RAM中,那么它将被调出,然后在再次访问时需要重新调回。

索引大小与此无关。重要的是您的工作集大小。MongoDB的最新版本确实有一种可能计算工作集大小的方法:尽管它只能给出一个粗略的估计。基本上你需要考虑的是:A。我所有的查询都在索引中,b。我的查询是否包括在内,如果不包括的话,在给定的时间内我要分页到我的工作集中的文档有多少?这些是单个数据库的统计数据,mongostat显示您有27.9G的数据文件。还有其他的星展银行吗?复制打开了吗?@Sammaye你又错了。数据和索引大小与此有关-您认为还有什么占用了RAM?@AsyaKamsky工作集并不像OP所想的那样,只包含您的索引?它是数据大小加上索引大小。这如何使索引大小变得无关紧要?