MongoDB将OOM杀死

我们在三台机器上运行一个mongodb复制器。 所有三台机器都有大约16GB,但只有255MB的交换。 Swappiness留在默认值60上。机器正在运行CentOS 6.4。 数据库比16GB大得多,但对我们来说没关系。 真正的工作集是小得多。

我们面临的问题是,主要的消耗会吃掉所有可用的内存,而不是获得OOM杀死。 我知道这是mongodb如何pipe理内存的方式。

在服务器得到OOM之后,有人必须手动重新启动它。

有什么办法可以防止mongodb被OOM杀死? 调整swappiness? 增加交换空间? 我认为这些设置只会增加mongod死亡之前的宽限期。

OOM杀手并不是任何人pipe理记忆的方式; 最后希望避免系统死锁是Linux内核的方式来处理致命的故障!

你应该做的是:

  • 确保你有足够的交换。 如果您确定,仍然添加更多。

  • 实施资源限制! 至less应用程序,你期望会使用内存(甚至更多,如果你不期望他们 – 这些通常最终成为问题)。 请参阅shell中的ulimit -v(或limit addressspace)命令,并在应用程序启动之前将其放在init脚本中。 你还应该限制其他的东西(比如进程的数量等等)…这样,当没有足够的内存的时候,应用程序会得到ENOMEM的错误,而不是内核给他们不存在的内存,然后在周围发生的疯狂的杀死!

  • 告诉内核不要过度使用内存。 你可以这样做:

    echo“0”> / proc / sys / vm / overcommit_memory

    甚至更好(取决于你的交换空间量)

    echo“2”> / proc / sys / vm / overcommit_memory; echo“80”> / proc / sys / vm / overcommit_ratio

    请参阅closures超量使用以获取更多相关信息。

    这将指示内核在给予应用程序内存时更加谨慎,这种内存并不具备真正的内存(类似于全球经济危机令人吃惊)

  • 作为最后一个手段,如果你的系统上除了MangoDB之外的所有东西都是可消耗的(但是请先修正两点以上!),可以降低被杀死的几率 (或者甚至确保它不会被杀死)是hangup机器没有任何工作)通过调整/ proc / $ pid / oom_score_adj和/或/ proc / $ pid / oom_score。

    echo“-1000”> / proc /`pidof mangod` / oom_score_adj

    有关该主题的更多信息,请参阅驯服OOM杀手 。