MongoDB在内存不足时终止


11

我有以下配置:

  • 运行三个Docker容器的主机:
    • MongoDB
    • 雷迪斯
    • 一个使用前两个容器存储数据的程序

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关系: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.
  7. 如何释放MongoDB使用的缓存?:与5中相同的答案。

现在,从所有这些答案中我似乎都可以理解:

  1. 为了更快地访问,最好让mongo适应RAM中的所有索引。但是,就我而言,因为我有一个相当快的SSD,所以索引可以部分驻留在磁盘上很好。
  2. RAM主要由mongo用于缓存。

考虑到这一点,我期望mongo尝试使用尽可能多的RAM空间,但也能够以较少的RAM空间运行并从磁盘中获取大多数内容。但是,我通过使用--memory和将mongo Docker容器的内存(例如,限制为8GB),--memory-swap但是mongo刚从内存中耗尽时就崩溃了,而不是从磁盘上获取东西。

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


它被称为OOM杀手。MongoDB设计为在商品硬件上运行。我永远不会在人为限制的资源上运行它。如果您只有一个小型数据库,则MongoDB不是理想的选择。如果您有一个大型数据库(三位数以百万计,十亿个条目),那么限制资源是一个错误的选择。根据您的问题:您不能吃蛋糕。选择。
Markus W Mahlberg

如果配置正确,则MongoDB内存不足时不会崩溃。您可以确认正在使用的MongoDB服务器和操作系统的特定版本,也可以更详细地描述崩溃吗?例如,MongoDB日志中是否有任何消息或dmesg与意外关闭相关联?Docker最有可能的可能性是容器中的进程检测到整个可用RAM,而不是容器限制。
Stennie

根据MongoDB生产说明:如果您mongod无法访问系统中所有可用RAM 的容器(lxc,,cgroupsDocker等)中运行,则必须将其设置为小于以下容器中可用RAM量的值:容器。确切的数量取决于容器中运行的其他进程,但是通常不应超过默认值50%RAM减去1GB。storage.wiredTiger.engineConfig.cacheSizeGB
Stennie

Answers:


9

根据MongoDB BOL 此处 的版本3.4中的更改:值的范围可以从256MB到,10TB并且可以是float。此外,默认值也已更改。

从开始3.4,默认情况下,WiredTiger内部缓存将使用以下两者中的较大者:

50% of RAM minus 1 GB, or
256 MB.

使用时WiredTiger,MongoDB同时使用WiredTiger internal cachefilesystem cache

通过filesystem cache,MongoDB自动使用WiredTiger cache或其他进程未使用的所有可用内存。

storage.wiredTiger.engineConfig.cacheSizeGB限制的大小WiredTiger内部缓存。操作系统将使用可用的空闲内存进行文件系统缓存,从而允许压缩的MongoDB数据文件保留在内存中。此外,operating system它将使用任何可用的RAM来缓冲文件系统块和文件系统缓存。

为了容纳更多的RAM使用者,您可能必须减小WiredTiger内部缓存的大小。

有关更多信息,请参考WiredTiger存储引擎配置文件选项


4

实际上,如果仔细观察,并不是mongod会死于“内存不足”,而是内核OOM(内存不足)管理器杀死mongod,因为它具有最大的内存使用率。

是的,您可以尝试使用monngodb配置参数cacheSizeGB解决问题,但是在容器环境中,最好使用cgroups来限制三个容器中任何一个获得的资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.