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