在50GB集合的时间戳字段上添加单个索引时,MongoDB在96GB根服务器上的内存不足。
MongoDB是否可以选择以“安全模式”运行查询或任务,例如没有太多的记忆?它似乎非常敏感,可能会崩溃,例如通过在非索引时间戳字段上运行带有$ lte / $ gt的查询查询。
答案 0 :(得分:1)
它似乎非常敏感,可能会崩溃,例如通过在非索引时间戳字段上运行带有$ lte / $ gt的查询查询。
正是OOM杀手正在杀死它,因为你的mongod实例正在将大量页面交换到RAM中。你可能有很多进程争夺RAM。你可以指示Linux不要杀死mongod守护进程,如下所示:
sudo echo -17 > /proc/<process if of mongod>/oom_adj
不幸的是,您无法控制mongodb使用的内存量。我建议看一下background indexing docs on mongodb。还有一些更有用的链接:
答案 1 :(得分:1)
我无法控制它,但是不应该有“安全”的mongodb配置设置,这确保一旦它突破限制就释放RAM?也许甚至在它阻止其他进程或被oom杀手停止之前?
MongoDB不使用自己的内存管理。相反,它使用操作系统的LRU。操作系统分页文档非常重要,因为它使用了分配给mongod
的内存量,也就是说你的工作集大于你为MongoDB备用的RAM量,因为MongoDB正在为大多数内容交换页面错误并非所有数据(分页的良好参考:http://en.wikipedia.org/wiki/Paging)。
我强烈建议不要在这种情况下限制MongoDB,因为它会运行得更糟,尤其是在Linux上,你实际上可以使用ulimit
用户来运行mongo
mongod
}:http://docs.mongodb.org/manual/administration/ulimit/
MongoDB是否可以选择以“安全模式”运行查询或任务,例如没有太多记忆?
不是。
它似乎非常敏感,可能会崩溃,例如通过在非索引时间戳字段上运行带有$ lte / $ gt的查询查询。
当然,这不应该导致MongoDB的OOM异常,它可能表示某处存在内存泄漏:http://docs.mongodb.org/manual/administration/ulimit/
如果在运行MongoDB的系统上限制驻留内存大小,则可能会允许操作系统在正常情况下终止mongod进程。不要设置此值。如果操作系统(即Linux)使用OOM杀手杀死你的mongod,请检查serverStatus的输出并确保MongoDB没有泄漏内存。