0

我对我的 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 的工作集和一个相同数量的 Shareable。

我的第一个想法是“好的,所以它具有预先分配的数据文件,以便在它实际需要空间时会有更快的插入”。

但是后来我启动了 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。我错过了什么?

4

1 回答 1

2

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

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

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

于 2013-04-25T07:55:26.263 回答