内存安全的mongodb任务


当在50GB集合的时间戳字段上添加单个索引时,MongoDB在96GB根服务器上的内存不足。

MongoDB是否有任何选项可以在"安全模式"下运行查询或任务,例如不需要太多内存?它似乎非常敏感,可能会崩溃,例如,通过在非索引时间戳字段上运行一些带有$lte/$gt的查找查询。

我无法控制它,但难道不应该有一个mongodb的"安全"配置设置,以确保在RAM突破限制时释放它吗?甚至可能在它阻塞其他进程或被oom杀手阻止之前?

MongoDB不使用自己的内存管理。相反,它使用操作系统的LRU。操作系统之所以如此频繁地对文档进行分页,是因为它使用了分配给mongod的内存量,也就是说,您的工作集比您为MongoDB腾出的RAM量还大,因为MongoDB正在将页面错误交换为大部分数据,而不是所有数据(分页的一个很好的参考:http://en.wikipedia.org/wiki/Paging(。

在这种情况下,我强烈建议不要限制MongoDB,因为它的运行情况会更糟,但是,尤其是在Linux上,您实际上可以在用于运行mongodmongo用户上使用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上的后台索引文档。还有一些更有用的链接:

  1. 参见stackoverflow上的相关线程
  2. 如何限制缓存大小

最新更新