草庐IT

Mongodb 在内存不足时终止

coder 2023-10-29 原文

我有以下配置:

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

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

我已经阅读了以下关于此的问题:

  1. Limit MongoDB RAM Usage : 显然大多数 RAM 都被 WiredTiger 缓存用完了
  2. MongoDB limit memory : 显然这里的问题是日志数据
  3. Limit the RAM memory usage in MongoDB : 他们在这里建议限制 mongo 的内存,以便它为其缓存/日志/数据使用更少量的内存
  4. MongoDB using too much memory :这里他们说它是 WiredTiger 缓存系统,它倾向于使用尽可能多的 RAM 来提供更快的访问。他们还声明 完全可以限制 WiredTiger 缓存大小,因为它可以非常有效地处理 I/O 操作
  5. Is there any option to limit mongodb memory usage? : 再次缓存,他们还添加了 MongoDB 使用 LRU (Least Recently Used) 缓存算法来确定释放哪些“页面”,你会在这两个问题中找到更多信息
  6. MongoDB index/RAM relationship : quote: MongoDB 在 RAM 中尽可能保留索引。它们将在 LRU 基础上被换出。您经常会看到建议您将“工作集”保存在内存中的文档:如果您实际访问的索引部分适合内存,就没问题。
  7. how to release the caching which is used by Mongodb? : 与 5 中的答案相同。

现在我似乎从所有这些答案中了解到:

  1. 为了更快地访问,Mongo 最好将所有索引放入 RAM 中。但是,就我而言,我可以接受部分驻留在磁盘上的索引,因为我有一个非常快的 SSD。
  2. 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/

有关Mongodb 在内存不足时终止的更多相关文章

  1. ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中) - 2

    我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串

  2. c - Ruby 的 Enumerable#zip 是否在内部创建数组? - 2

    在Ruby-ComparetwoEnumeratorselegantly,据说Theproblemwithzipisthatitcreatesarraysinternally,nomatterwhatEnumerableyoupass.There'sanotherproblemwithlengthofinputparams我查看了YARV中Enumerable#zip的实现,并看到了staticVALUEenum_zip(intargc,VALUE*argv,VALUEobj){inti;IDconv;NODE*memo;VALUEresult=Qnil;VALUEargs=rb_ar

  3. ruby - Jekyll 存档页面中的嵌套液体循环不起作用。在内部条件中使用外部循环变量 - 2

    我正在使用jekyllstaticsitebuilder,我有难以执行以下操作:{%forcategoryinsite.categories%}{{category[0]}}{%forpostinsite.categories[{{category}}]%}{{post.title}}{%endfor%}↩{%endfor%}我的jekyll站点中有一个名为“测试”的帖子类别,我可以使用以下内容显示来自它的帖子:{%forpostinsite.categories.test%}{{post.title}}{%endfor%}但是,我想自动构建一个存档页面,并按顺序为此,我需要

  4. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  5. ruby - 如何在 ruby​​ 中控制(启动/终止)后台进程(服务器应用程序) - 2

    我正在尝试通过ruby​​为集成测试(实际上是规范)设置一个服务器,但不知道如何控制该过程。所以,我要做的是:为我的gem运行一个执行集成规范的rake任务任务需要先启动服务器(我使用webrick),然后运行规范执行规范后,它应该会杀死webrick,这样我就不会留下一些未使用的后台进程webrick不是必需的,但它包含在ruby​​标准库中,因此能够使用它会很棒。希望有人能提供帮助!附言。我在linux上运行,所以让这个适用于windows的工作不是我的主要优先事项(现在)。 最佳答案 标准方法是使用系统函数fork(复制当前进

  6. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  7. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  8. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  9. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  10. Ruby - 在内存中创建文件 - 2

    是否可以在不将文件写入磁盘的情况下用Ruby编写以下代码?temp_file='path/to/file.csv'users=[a@b.c,c@b.a]CSV.open(temp_file,"w")do|csv|csvReports.sendreport附加一个文件并发送一封电子邮件,所以它需要是一个文件... 最佳答案 你可以使用Tempfile.Tempfile将文件写入光盘,因此它不符合您的要求。但我认为Tempfile提供了一些您需要的功能:WhenaTempfileobjectisgarbagecollected,orwh

随机推荐