Mongodb在内存不足时终止

Mongodb在内存不足时终止,mongodb,docker,limit,ram,Mongodb,Docker,Limit,Ram,我有以下配置: 运行三个docker容器的主机: 蒙哥达 雷迪斯 使用前两个容器存储数据的程序 Redis和Mongodb都用于存储大量数据。我知道Redis需要将所有数据保存在RAM中,我对此很满意。不幸的是,Mongo开始占用大量RAM,一旦主机RAM满了(我们这里说的是32GB),Mongo或Redis就会崩溃 我已经阅读了关于这一点的以下问题: :显然,大多数RAM已被WiredTiger缓存耗尽 :这里的问题显然是日志数据 :在这里,他们建议限制mongo的内存,以便它使用更少

我有以下配置:

  • 运行三个docker容器的主机:
    • 蒙哥达
    • 雷迪斯
    • 使用前两个容器存储数据的程序
Redis和Mongodb都用于存储大量数据。我知道Redis需要将所有数据保存在RAM中,我对此很满意。不幸的是,Mongo开始占用大量RAM,一旦主机RAM满了(我们这里说的是32GB),Mongo或Redis就会崩溃

我已经阅读了关于这一点的以下问题:

  • :显然,大多数RAM已被WiredTiger缓存耗尽
  • :这里的问题显然是日志数据
  • :在这里,他们建议限制mongo的内存,以便它使用更少的内存来缓存/日志/数据
  • :这里他们说是WiredTiger缓存系统,它倾向于使用尽可能多的RAM来提供更快的访问。他们还声明
    限制WiredTiger缓存大小完全可以,因为它可以非常有效地处理I/O操作
  • :再次缓存,他们还添加了
    MongoDB使用LRU(最近使用最少的)缓存算法来确定要释放哪些“页面”,您将在这两个问题中找到更多信息
  • :quote:
    MongoDB将尽可能多的索引保存在RAM中。他们将在LRU的基础上被交换出去。您经常会看到一些文档建议您应该将“工作集”保存在内存中:如果您实际访问的索引部分适合内存,您就可以了。
  • :答案与第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
    (在我的情况下,这应该是
    15GB


    通过使用小于Docker分配的值来限制wiredTiger的缓存大小,解决了问题。

    这确实更适合于or,因为它是关于数据库服务器软件,而不是应用程序代码。好的,管理员可以移动它。我应该对此做些什么吗?(虽然我链接的大多数问题都来自StackOverflow)其中一些问题是在这两个网站之前提出的。关于MongoDB的这两个问题,每一个都有1500多个问题。如果是关于安装,我会说是服务器故障站点。如果是关于调优的,DBA。很好的研究工作,但问题本身相当模糊。存储配置和实际错误消息是关键缺失位。理想情况下,如果您可以共享Dockerfile和最简单的mgenerate,则会重现问题。对于运行在无法访问整个内存的容器中的mongodb,这是一个特别的注意事项。您是如何将配置选项放入docker容器中的?啊,您可以使用命令行选项--
    --wiredTigerCacheSizeGB
    Hi@rjmunro如果存储引擎是MMAPv1怎么办?没有配置缓存大小的选项。嘿@Simone我们正在docker中运行MongoDB,内存有问题。当我看到free-m时,它使用了超过8gb的大量内存,所以我假设它与此问题有关?