有没有限制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,我们的任务可以通过几个简单的步骤来完成。
-
创build控制组:
cgcreate -g memory:DBLimitedGroup
(确保在您的系统上安装了cgroups二进制文件,请参阅您最喜欢的Linux分发手册了解如何做到这一点)
-
指定该组有多less内存可用:
echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
这个命令将内存限制在16G(好事情,这限制了malloc分配和OScaching的内存)
-
现在,放弃已经留在caching中的页面将是一个好主意:
sync; echo 3 > /proc/sys/vm/drop_caches
-
最后分配一个服务器创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'