MongoDB是否有任何选项可以在"安全模式"下运行查询或任务,例如不需要太多内存?它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。
我无法控制它,但难道不应该有一个mongodb的"安全"配置设置,以确保在RAM突破限制时释放它吗?甚至可能在它阻塞其他进程或被oom杀手阻止之前?
MongoDB不使用自己的内存管理。相反,它使用操作系统的LRU。操作系统之所以如此频繁地对文档进行分页,是因为它使用了分配给mongod
的内存量,也就是说,您的工作集比您为MongoDB腾出的RAM量还大,因为MongoDB正在将页面错误交换为大部分数据,而不是所有数据(分页的一个很好的参考:http://en.wikipedia.org/wiki/Paging(。
在这种情况下,我强烈建议不要限制MongoDB,因为它的运行情况会更糟,但是,尤其是在Linux上,您实际上可以在用于运行mongod
的mongo
用户上使用ulimit
: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没有泄漏内存。
它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。
OOM杀手正在杀死它,因为您的mongod实例正在将大量页面交换到RAM中。您可能有很多进程在争夺RAM。您可以指示Linux不要杀死mongod守护进程,如下所示:
sudo echo -17 > /proc/<process if of mongod>/oom_adj
不幸的是,您无法控制mongodb使用了多少内存。我建议查看mongodb上的后台索引文档。还有一些更有用的链接:
- 参见stackoverflow上的相关线程
- 如何限制缓存大小