内存安全的mongodb任务

时间:2013-02-05 20:33:39

标签: mongodb memory crash

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

MongoDB是否可以选择以“安全模式”运行查询或任务,例如没有太多的记忆?它似乎非常敏感,可能会崩溃,例如通过在非索引时间戳字段上运行带有$ lte / $ gt的查询查询。

2 个答案:

答案 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. See the related thread on stackoverflow
  2. How do i limit the cache size?

答案 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没有泄漏内存。