我有以下配置:
- 运行三个Docker容器的主机:
- MongoDB
- 雷迪斯
- 一个使用前两个容器存储数据的程序
Redis和MongoDB都用于存储大量数据。我知道Redis需要将其所有数据保留在RAM中,对此我很好。不幸的是,发生的事情是mongo开始占用大量RAM,并且一旦主机RAM已满(我们在这里谈论32GB),mongo或Redis就会崩溃。
我已阅读以下有关此问题的问题:
- 限制MongoDB RAM的使用:显然,大多数RAM被WiredTiger缓存用尽
- MongoDB限制内存:显然这里的问题是日志数据
- 限制MongoDB中的RAM内存使用量:在这里,他们建议限制mongo的内存,以便它的缓存/日志/数据使用较少的内存
- MongoDB使用了过多的内存:在这里,他们说这是WiredTiger缓存系统,该系统倾向于使用尽可能多的RAM以提供更快的访问速度。他们还说
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- 是否有任何限制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
- MongoDB索引/ RAM关系:Quote:
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.
- 如何释放MongoDB使用的缓存?:与5中相同的答案。
现在,从所有这些答案中我似乎都可以理解:
- 为了更快地访问,最好让mongo适应RAM中的所有索引。但是,就我而言,因为我有一个相当快的SSD,所以索引可以部分驻留在磁盘上很好。
- RAM主要由mongo用于缓存。
考虑到这一点,我期望mongo尝试使用尽可能多的RAM空间,但也能够以较少的RAM空间运行并从磁盘中获取大多数内容。但是,我通过使用--memory
和将mongo Docker容器的内存(例如,限制为8GB),--memory-swap
但是mongo刚从内存中耗尽时就崩溃了,而不是从磁盘上获取东西。
如何强制mongo仅使用可用内存,并从磁盘中获取所有不适合内存的内容?
dmesg
与意外关闭相关联?Docker最有可能的可能性是容器中的进程检测到整个可用RAM,而不是容器限制。
mongod
在无法访问系统中所有可用RAM 的容器(lxc
,,cgroups
Docker等)中运行,则必须将其设置为小于以下容器中可用RAM量的值:容器。确切的数量取决于容器中运行的其他进程,但是通常不应超过默认值50%RAM减去1GB。storage.wiredTiger.engineConfig.cacheSizeGB