在为50 on集合的时间戳字段添加单个索引时,MongoDB在96 on根服务器上的内存不足。
MongoDB是否有在“安全模式”下运行查询或任务的选项,例如,不会过多地削减内存?它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。
发布于 2013-02-06 05:13:26
我不能控制它,但是是否应该有一个“安全”的mongodb配置设置,确保一旦内存超过限制就释放内存?也许甚至在它阻塞其他进程或被oom杀手停止之前?
MongoDB不使用自己的内存管理。相反,它使用操作系统的LRU。操作系统之所以大量地对文档进行分页,是因为它使用了分配给mongod的内存量,也就是说,您的工作集比您为MongoDB保留的内存量要大,因为MongoDB会为大多数数据交换分页错误,而不是所有数据(分页的一个很好的参考资料:http://en.wikipedia.org/wiki/Paging )。
我强烈不建议在这种情况下限制MongoDB,因为它的运行情况会更糟,但是,特别是在Linux上,您实际上可以在用于运行mongod:http://docs.mongodb.org/manual/administration/ulimit/的mongo用户上使用ulimit。
MongoDB是否有在“安全模式”下运行查询或任务的选项,例如,不会过多地削减内存?
不怎么有意思。
它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。
当然,这不应该导致MongoDB出现面向对象的异常,它可能表明某个地方存在内存泄漏:http://docs.mongodb.org/manual/administration/ulimit/
如果您在运行MongoDB的系统上限制驻留内存大小,则可能会允许操作系统在正常情况下终止MongoDB进程。请勿设置此值。如果操作系统(例如Linux)杀死了你的魔神,使用面向对象模型杀手,检查serverStatus的输出,并确保MongoDB没有泄漏内存。
发布于 2013-02-06 04:52:56
它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。
这是OOM杀手杀死它的原因,因为mongod实例正在将大量页面交换到RAM中。您可能有很多进程在争用RAM。您可以指示Linux不要终止mongod守护进程,如下所示:
sudo echo -17 > /proc/<process if of mongod>/oom_adj不幸的是,你无法控制mongodb使用了多少内存。我建议你看看background indexing docs on mongodb。还有一些更有用的链接:
https://stackoverflow.com/questions/14716387
复制相似问题