Mongodb 在内存不足时终止

标签 mongodb docker limit ram

我有以下配置:

  • 运行三个 docker 容器的主机:
    • MongoDB
    • Redis
    • 使用前面两个容器存储数据的程序

Redis和Mongodb都是用来存储海量数据的。我知道 Redis 需要将其所有数据保存在 RAM 中,我对此没有意见。不幸的是,Mongo 开始占用大量 RAM,一旦主机 RAM 已满(我们在这里谈论的是 32GB),Mongo 或 Redis 就会崩溃。

我已经阅读了以下关于此的问题:

  1. Limit MongoDB RAM Usage : 显然大多数 RAM 都被 WiredTiger 缓存用完了
  2. MongoDB limit memory : 显然这里的问题是日志数据
  3. Limit the RAM memory usage in MongoDB : 他们在这里建议限制 mongo 的内存,以便它为其缓存/日志/数据使用更少量的内存
  4. MongoDB using too much memory :这里他们说它是 WiredTiger 缓存系统,它倾向于使用尽可能多的 RAM 来提供更快的访问。他们还声明 完全可以限制 WiredTiger 缓存大小,因为它可以非常有效地处理 I/O 操作
  5. Is there any option to limit mongodb memory usage? : 再次缓存,他们还添加了 MongoDB 使用 LRU (Least Recently Used) 缓存算法来确定释放哪些“页面”,你会在这两个问题中找到更多信息
  6. MongoDB index/RAM relationship : quote: MongoDB 在 RAM 中尽可能保留索引。它们将在 LRU 基础上被换出。您经常会看到建议您将“工作集”保存在内存中的文档:如果您实际访问的索引部分适合内存,就没问题。
  7. how to release the caching which is used by Mongodb? : 与 5 中的答案相同。

现在我似乎从所有这些答案中了解到:

  1. 为了更快地访问,Mongo 最好将所有索引放入 RAM 中。但是,就我而言,我可以接受部分驻留在磁盘上的索引,因为我有一个非常快的 SSD。
  2. RAM 主要用于 Mongo 的缓存。

考虑到这一点,我期待 Mongo 尝试使用尽可能多的 RAM 空间,但也能够在很少的 RAM 空间下运行并从磁盘中获取大部分内容。但是,我通过使用 --memory--memory-swap 限制了 Mongo Docker 容器的内存(例如 8GB),但不是从磁盘中获取内容,Mongo刚用完内存就崩溃了。

我如何强制 Mongo 仅使用可用内存并从磁盘中获取内存中不适合的所有内容?

最佳答案

感谢@AlexBlex 的评论,我解决了我的问题。显然,问题在于 Docker 将容器的 RAM 限制为 8GB,但 wiredTiger 存储引擎仍在尝试用尽其缓存的总系统 RAM 的 50% - 1GB(在我的例子中应该是 15 GB)。

使用 this configuration option 限制 wiredTiger 的缓存大小一个小于 Docker 分配的值解决了这个问题。

关于Mongodb 在内存不足时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47639084/

相关文章:

python - Popen 中的缓冲区有限

json - MongoDB/Node : Insert part of a doc in a collection into a doc in another collection

docker - 如何修复 docker 错误 "no subsystem for mount"?

点和美元符号的mongodb含义

docker - 使docker-machine在不使用tlsverify的情况下创建主机

python - 'docker' 未被识别为内部或外部命令

nginx - 你能为 nginx 的每秒请求数设置一个异常(exception)吗?

python - 超过最大递归深度(无法确定无限循环的原因)

java - 使用 Joda-Time 为 Mongo 插入形成正确的 ISODate

ruby-on-rails - Node.js 和 Rails 应用程序托管,具有共享 MongoDB 数据库和定价