我有以下配置:
- 运行三个 docker 容器的主机:
- MongoDB
- Redis
- 使用前面两个容器存储数据的程序
Redis和Mongodb都是用来存储海量数据的。我知道 Redis 需要将其所有数据保存在 RAM 中,我对此没有意见。不幸的是,Mongo 开始占用大量 RAM,一旦主机 RAM 已满(我们在这里谈论的是 32GB),Mongo 或 Redis 就会崩溃。
我已经阅读了以下关于此的问题:
- Limit MongoDB RAM Usage : 显然大多数 RAM 都被 WiredTiger 缓存用完了
- MongoDB limit memory : 显然这里的问题是日志数据
- Limit the RAM memory usage in MongoDB : 他们在这里建议限制 mongo 的内存,以便它为其缓存/日志/数据使用更少量的内存
- MongoDB using too much memory :这里他们说它是 WiredTiger 缓存系统,它倾向于使用尽可能多的 RAM 来提供更快的访问。他们还声明
完全可以限制 WiredTiger 缓存大小,因为它可以非常有效地处理 I/O 操作
- Is there any option to limit mongodb memory usage? : 再次缓存,他们还添加了
MongoDB 使用 LRU (Least Recently Used) 缓存算法来确定释放哪些“页面”,你会在这两个问题中找到更多信息
- MongoDB index/RAM relationship : quote:
MongoDB 在 RAM 中尽可能保留索引。它们将在 LRU 基础上被换出。您经常会看到建议您将“工作集”保存在内存中的文档:如果您实际访问的索引部分适合内存,就没问题。
- how to release the caching which is used by Mongodb? : 与 5 中的答案相同。
现在我似乎从所有这些答案中了解到:
- 为了更快地访问,Mongo 最好将所有索引放入 RAM 中。但是,就我而言,我可以接受部分驻留在磁盘上的索引,因为我有一个非常快的 SSD。
- 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/