Mongodb 在内存不足时终止

Sim*_*ini 4 ram limit mongodb docker

我有以下配置:

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

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

我已经阅读了以下有关此问题的先前问题:

  1. 限制 MongoDB RAM 使用:显然大部分 RAM 已被 WiredTiger 缓存占用
  2. MongoDB 限制内存:这里显然问题是日志数据
  3. 限制 MongoDB 中的 RAM 内存使用:这里他们建议限制 mongo 的内存,以便它使用较少的内存来缓存/日志/数据
  4. MongoDB 使用太多内存:这里他们说它是 WiredTiger 缓存系统,它倾向于使用尽可能多的 RAM 来提供更快的访问。他们还表示it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. 有没有限制mongodb内存使用的选项?: 再次缓存,他们还添加MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
  6. MongoDB 索引/RAM 关系:引用:MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
  7. 如何释放Mongodb使用的缓存?: 与5相同的答案。

现在我从所有这些答案中似乎明白的是:

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

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

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

Sim*_*ini 7

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

通过使用此配置选项将wiredTiger 的缓存大小限制为小于Docker 分配的值解决了该问题。

  • 啊,你可以使用命令行选项 https://docs.mongodb.com/manual/reference/program/mongod/#wiredtiger-options - `--wiredTigerCacheSizeGB` (3认同)