我正在使用Mongo-DBv1.8.1。我的服务器内存为4GB,但是Mongo-DB占用的内存超过3GB。Mongo-DB中是否有内存限制选项?
我正在使用Mongo-DBv1.8.1。我的服务器内存为4GB,但是Mongo-DB占用的内存超过3GB。Mongo-DB中是否有内存限制选项?
Answers:
如果您正在运行MongoDB 3.2或更高版本,则可以如上所述限制wiredTiger
缓存。
在/etc/mongod.conf
添加wiredTiger
部分
...
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
...
这会将缓存大小限制为1GB,有关更多信息,请参阅Doc
这为我解决了问题,运行ubuntu 16.04
并mongoDB 3.2
PS:更改配置后,重新启动mongo守护程序。
$ sudo service mongod restart
# check the status
$ sudo service mongod status
从3.2开始,MongoDB使用WiredTiger作为默认存储引擎。以前的版本使用MMAPv1作为默认存储引擎。
限制wireTriggered缓存在.config文件中添加以下行:
wiredTigerCacheSizeGB = 1
storage.wiredTiger.engineConfig.cacheSizeGB
,不过--wiredTigerCacheSizeGB
是一个命令行PARAM?
这个问题已经问了几次...
请参阅此相关问题/答案(在下面引用)...如何释放Mongodb使用的缓存?
MongoDB(至少看起来)将使用大量可用内存,但实际上将其留给操作系统的VMM告知其释放内存(请参阅MongoDB文档中的缓存)。
您应该能够通过重新启动MongoDB释放所有内存。
但是,在某种程度上,MongoDB并没有真正“使用”内存。
例如,来自MongoDB文档“检查服务器内存使用情况” ...
在不同的平台上,您可能会在过程中将映射的文件视为内存,但这并不完全正确。Unix top可能显示出比mongod更多的内存而不是真正合适的内存。操作系统(具体来说是虚拟内存管理器,取决于OS)由操作系统管理“内存映射文件”所在的内存。该数字通常显示在“ free -lmt”之类的程序中。
它称为“缓存”内存。
MongoDB使用LRU(最近最少使用)缓存算法来确定要释放的“页面”,您将在这两个问题中找到更多信息...
您可以在Linux上使用cgroups限制mongod进程的使用。
使用cgroups,我们的任务可以通过几个简单的步骤完成。
创建控制组:
cgcreate -g memory:DBLimitedGroup
(确保在系统上安装了cgroups二进制文件,有关该操作,请查阅您最喜欢的Linux发行手册)
指定该组有多少可用内存:
echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
此命令将内存限制为16G(这很好,这限制了malloc分配和OS缓存的内存)
现在,删除已经保留在缓存中的页面将是一个好主意:
sync; echo 3 > /proc/sys/vm/drop_caches
最后将服务器分配给创建的控制组:
cgclassify -g memory:DBLimitedGroup \`pidof mongod\`
这会将正在运行的mongod进程分配给仅受16GB内存限制的组。
sudo bash -c 'curl -o- http://brains.by/misc/mongodb_memory_limit_ubuntu1404.sh | bash'
我认为您无法配置MongoDB使用的内存量,但这没关系(请阅读下文)。
引用官方消息:
对于mongod进程,虚拟内存大小和常驻大小似乎非常大。这是良性的:虚拟内存空间将大于打开和映射的数据文件的大小;驻留大小将因计算机上其他进程未使用的内存量而异。
换句话说,Mongo将允许其他程序在需要时使用内存。
并非如此,有一些技巧可以限制内存,例如在Windows上,您可以使用Windows系统资源管理器(WSRM),但是通常,Mongo在专用服务器上可以自由使用内存而不会与其他系统发生过多争用,因此在专用服务器上效果最佳。
尽管操作系统将尝试根据需要将内存分配给其他进程,但实际上,如果其他系统也具有很高的内存要求,则可能导致性能问题。
如果您确实需要限制内存,并且只有一台服务器,那么最好的选择是虚拟化。
可以通过组合以下两篇文章中的知识来使用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/
您可以在此处找到一个小的Shell脚本,该脚本将为Ubuntu 14.04创建配置文件和初始化文件: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'
没有理由限制MongoDB缓存,因为默认情况下,mongod进程将占用计算机内存的1/2,而不会占用更多内存。默认存储引擎为WiredTiger。“通过WiredTiger,MongoDB同时利用了WiredTiger内部缓存和文件系统缓存。”
您可能正在寻找顶部,并假设Mongo正在使用计算机上的所有内存。那就是虚拟内存。使用免费的-m:
total used free shared buff/cache available
Mem: 7982 1487 5601 8 893 6204
Swap: 0 0 0
只有当可用指标变为零时,计算机才将内存换出到磁盘。在这种情况下,数据库对于计算机而言太大。将另一个mongodb实例添加到您的集群。
在mongod控制台中使用以下两个命令来获取有关Mongodb使用了多少虚拟和物理内存的信息:
var mem = db.serverStatus().tcmalloc;
mem.tcmalloc.formattedString
------------------------------------------------
MALLOC: 360509952 ( 343.8 MiB) Bytes in use by application
MALLOC: + 477704192 ( 455.6 MiB) Bytes in page heap freelist
MALLOC: + 33152680 ( 31.6 MiB) Bytes in central cache freelist
MALLOC: + 2684032 ( 2.6 MiB) Bytes in transfer cache freelist
MALLOC: + 3508952 ( 3.3 MiB) Bytes in thread cache freelists
MALLOC: + 6349056 ( 6.1 MiB) Bytes in malloc metadata
MALLOC: ------------
MALLOC: = 883908864 ( 843.0 MiB) Actual memory used (physical + swap)
MALLOC: + 33611776 ( 32.1 MiB) Bytes released to OS (aka unmapped)
MALLOC: ------------
MALLOC: = 917520640 ( 875.0 MiB) Virtual address space used
MALLOC:
MALLOC: 26695 Spans in use
MALLOC: 22 Thread heaps in use
MALLOC: 4096 Tcmalloc page size
如果您使用的是内存不足的计算机,并且希望以wiredTigerCache
MB而不是整数GB来配置,则添加到投票最高的答案中,请使用此-
storage:
wiredTiger:
engineConfig:
configString : cache_size=345M
来源-https: //jira.mongodb.org/browse/SERVER-22274
这对我在一个AWS实例上起作用,至少可以清除mongo在使用的缓存内存。之后,您可以看到您的设置如何生效。
ubuntu@hongse:~$ free -m
total used free shared buffers cached
Mem: 3952 3667 284 0 617 514
-/+ buffers/cache: 2535 1416
Swap: 0 0 0
ubuntu@hongse:~$ sudo su
root@hongse:/home/ubuntu# sync; echo 3 > /proc/sys/vm/drop_caches
root@hongse:/home/ubuntu# free -m
total used free shared buffers cached
Mem: 3952 2269 1682 0 1 42
-/+ buffers/cache: 2225 1726
Swap: 0 0 0