【问题标题】:memory-safe mongodb tasks内存安全的 mongodb 任务
【发布时间】:2013-02-05 20:33:38
【问题描述】:

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

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

【问题讨论】:

  • 是的,2.6.32-5-amd64,debian。
  • 这是否可以或与 mongo“不兼容”? dmesg | grep -i numa [0.000000] NUMA:分配的 memnodemap 从 40000 - 58840 [0.000000] NUMA:使用 20 进行哈希移位。

标签: mongodb memory crash


【解决方案1】:

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

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

我强烈不建议在这种情况下限制 MongoDB,因为它会运行得更糟,但是,尤其是在 Linux 上,您实际上可以在用于运行 mongodmongo 用户上使用 ulimithttp://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 没有泄漏内存。

【讨论】:

  • 我不敢相信我的内存少了。我使用的唯一集合是 50GB,总 RAM 略小于 96GB。它在哈希字段上只有 1 个单一索引。当然,值得尝试在时间戳上建立索引以进入“有序”状态。但这不应该是当前不稳定并且在完成某些 .find 查询时经常被 oom Killer 杀死的原因。除了 .find 之外,每秒大约有 20 个插入。在我看来,这并不多,尤其是在几乎没有任何索引的情况下。
  • @ledy 不是不是这里可能有另一个问题,我认为您可能遇到了内存泄漏,我添加了一个关于它的编辑
  • ulimit 应该没问题: ulimit -a nopaste.info/340ff18546.html 和 serverStatus 没有警告:mem { "bits": NumberInt(64), "resident": NumberInt(35877), "virtual": NumberInt (393373),“支持”:真,“映射”:NumberInt(196545),“mappedWithJournal”:NumberInt(393090)}
  • @ledy 是的,似乎物理上包含 MongoDB 可能在这里工作,但深入了解它可能会很有趣,它可能是某个地方的错误,导致 MongoDB 只是呕吐在这个地方
【解决方案2】:

它似乎很敏感,可能会崩溃,例如通过在非索引时间戳字段上使用 $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?

【讨论】:

  • 我无法控制它,但不应该有一个用于“安全”的 mongodb 配置设置,以确保一旦超出限制就释放 RAM?甚至在它阻塞其他进程或被 oom Killer 停止之前?
  • 没有,mongodb依赖操作系统的虚拟内存管理器来交换数据文件。我已经用相关链接更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多