1

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

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

4

2 回答 2

1

它似乎非常敏感,并且可能会崩溃,例如通过在非索引时间戳字段上运行一些带有 $lte/$gt 的查找查询。

杀死它的是 OOM 杀手,因为您的 mongod 实例正在将大量页面交换到 RAM 中。您可能有很多进程争夺 RAM。您可以指示 Linux 不要杀死 mongod 守护进程,如下所示:

sudo echo -17 > /proc/<process if of mongod>/oom_adj

不幸的是,您无法控制 mongodb 使用多少内存。我建议查看mongodb 上的背景索引文档。还有一些更有用的链接:

  1. 查看stackoverflow上的相关线程
  2. 如何限制缓存大小?
于 2013-02-05T20:52:55.567 回答
1

我无法控制它,但不应该有一个用于“安全”的 mongodb 配置设置,以确保一旦超过限制就释放 RAM?甚至可能在它阻塞其他进程或被 oom 杀手停止之前?

MongoDB 不使用自己的内存管理。相反,它使用操作系统的 LRU。操作系统正在大量分页文档,因为它使用了分配给的内存量mongod,也就是您的工作集大于您为 MongoDB 预留的 RAM 量,因为 MongoDB 正在交换页面错误,而不是所有数据(一个很好的分页参考:http ://en.wikipedia.org/wiki/Paging )。

我强烈不建议在这种情况下限制 MongoDB,因为它会运行得更糟,但是,尤其是在 Linux 上,你实际上可以在你用来运行ulimitmongo用户上使用:http mongod: //docs.mongodb.org/manual/administration/ulimit /

MongoDB 是否有任何选项可以在“安全模式”下运行查询或任务,例如不会过多地减少内存?

并不真地。

它似乎非常敏感并且可能会崩溃,例如通过在非索引时间戳字段上运行一些带有 $lte/$gt 的查找查询。

当然,这不会导致 MongoDB 出现 OOM 异常,它可能表明某处存在内存泄漏:http: //docs.mongodb.org/manual/administration/ulimit/

如果在运行 MongoDB 的系统上限制常驻内存大小,则可能会导致操作系统在正常情况下终止 mongod 进程。不要设置此值。如果操作系统(即 Linux)杀死了你的 mongod,使用 OOM 杀手,检查 serverStatus 的输出并确保 MongoDB 没有泄漏内存。

于 2013-02-05T21:13:26.093 回答