有没有限制mongodb内存使用的选项?

我正在使用Mongo-DBv1.8.1。 我的服务器内存是4GB,但Mongo-DB使用超过3GB。 Mongo-DB中是否有内存限制选项?

这个问题已经被问了几次了…

看到这个相关的问题/答案(下面引用)… 如何释放Mongodb使用的caching?


MongoDB将会(至less看起来)耗尽大量可用的内存,但实际上它会让操作系统的VMM告诉它释放内存(请参阅MongoDB文档中的caching )。

您应该能够通过重新启动MongoDB来释放所有内存。

但是,在某种程度上,MongoDB并不是真的“使用”内存。

例如从MongoDB文档检查服务器内存使用情况 …

根据平台的不同,您可能会将映射的文件视为进程中的内存,但这不是严格正确的。 Unix顶端可能为mongod显示更多的内存比真正合适。 操作系统(虚拟内存pipe理器,具体取决于操作系统)pipe理“内存映射文件”所在的内存。 这个号码通常显示在一个像“free -lmt”这样的程序中。

它被称为“caching”的内存。

MongoDB使用LRU( 最近最less使用 )cachingalgorithm来确定要释放哪些“页面”,您将在这两个问题中find更多信息…

  • MongoDB限制内存
  • MongoDB索引/ RAM关系
  • Mongod以内存限制开始 (你不能

你可以在Linux上使用cgroups来限制mongod进程的使用。

使用cgroups,我们的任务可以通过几个简单的步骤来完成。

  1. 创build控制组:

    cgcreate -g memory:DBLimitedGroup 

    (确保在您的系统上安装了cgroups二进制文件,请参阅您最喜欢的Linux分发手册了解如何做到这一点)

  2. 指定该组有多less内存可用:

     echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes 

    这个命令将内存限制在16G(好事情,这限制了malloc分配和OScaching的内存)

  3. 现在,放弃已经留在caching中的页面将是一个好主意:

     sync; echo 3 > /proc/sys/vm/drop_caches 
  4. 最后分配一个服务器创build控制组:

     cgclassify -g memory:DBLimitedGroup \`pidof mongod\` 

    这将为正在运行的mongod进程分配一个仅由16GB内存限制的组。

来源:使用Cgroups来限制MySQL和MongoDB的内存使用量

从3.2开始,MongoDB使用WiredTiger作为默认存储引擎。 以前的版本使用MMAPv1作为默认的存储引擎。

  • 使用WiredTiger,MongoDB同时使用WiredTiger内部caching和文件系统caching。
  • 在MongoDB 3.2中,默认情况下,WiredTiger内部caching将使用较大的内存RAM的60%减去1 GB或1 GB。
  • 对于具有高达10 GB RAM的系统,新的默认设置小于或等于3.0默认设置(对于MongoDB 3.0,WiredTiger内部高速caching使用1 GB或半数安装的物理RAM,以较大者为准)。 对于RAM大于10 GB的系统,新的默认设置大于3.0设置。

限制wiredTriggeredcaching添加以下行到.config文件:

wiredTigerCacheSizeGB = 1

我不认为你可以configuration多less内存的MongoDB使用,但没关系(阅读下面)。

引用来自官方的消息来源 :

对于mongod进程,虚拟内存大小和常驻大小似乎非常大。 这是良性的:虚拟内存空间将大于打开和映射的数据文件的大小; 常驻大小将根据机器上其他进程未使用的内存量而有所不同。

换句话说,Mongo会让其他程序使用内存,如果他们要求的话。

如果您运行的是mongodb 3.2+,则可以像上面提到的那样限制wiredTigercaching。

/etc/mongod.conf添加wiredTigre部分

 ... # Where and how to store data. storage: dbPath: /var/lib/mongodb journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 1 ... 

这将限制caching大小为1Gb,更多信息在docker

这解决了我的问题,运行Ubuntu 16.04和mongoDB 3.2

对于Windows,似乎可以控制MongoDB使用的内存量,请参阅Captain Codeman上的本教程:

限制在没有虚拟化的情况下在Windows上使用MongoDB内存

不是真的,限制内存有一些技巧,就像在Windows上一样,你可以使用Windows系统资源pipe理器(WSRM) ,但是一般来说,Mongo可以在专用服务器上工作得最好,而且可以自由地使用内存,而不会与其他系统争用太多。

尽pipe操作系统会根据需要为其他进程分配内存,但实际上,如果其他系统也需要高内存,则会导致性能问题。

如果你真的需要限制内存,只有一台服务器,那么你最好的select就是虚拟化。

这可以用cgroups来完成,通过结合这两篇文章的知识: https : //www.percona.com/blog/2015/07/01/using-cgroups-to-limit-mysql-and-mongodb-memory-usage /
http://frank2.net/cgroups-ubuntu-14-04/

你可以在这里find一个小的shell脚本,它将为Ubuntu 14.04创buildconfiguration和初始化文件: http : //brainsuckerna.blogspot.com.by/2016/05/limiting-mongodb-memory-usage-with.html

就像那样:

 sudo bash -c 'curl -o- http://brains.by/misc/mongodb_memory_limit_ubuntu1404.sh | bash'