mongodb记忆混乱。页面错误和索引大小

时间:2013-04-25 07:40:01

标签: mongodb indexing

我对我的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。我错过了什么?

1 个答案:

答案 0 :(得分:2)

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

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

您关注的不是数据存储,而是使用或查询或访问的数据。如果它都不能保留在RAM中,那么它将被换出,然后再次访问时需要重新交换。