我对我的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。我错过了什么?
答案 0 :(得分:2)
你有17GB的RAM可用于大约20GB的数据加上4GB的索引(这只是在这个数据库上 - 我不知道你的系统中是否还有更多,但是mongostat说你的总数据文件大小约为28GB )。
如果您要查询整个数据集,您是否不期望最终读取的新数据记录不再适合RAM而不显示以前读取的某些(并加载到RAM)记录中?这就是你所看到的页面错误。
您关注的不是数据存储,而是使用或查询或访问的数据。如果它都不能保留在RAM中,那么它将被换出,然后再次访问时需要重新交换。