是否有任何限制mongodb内存使用的选项?


Answers:


42

如果您正在运行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.04mongoDB 3.2

PS:更改配置后,重新启动mongo守护程序。

$ sudo service mongod restart

# check the status
$ sudo service mongod status

2
更改配置文件后是否需要重启mongodb服务?
AveryLiu

3
这可能只是使mongo使用文件系统缓存。
dcsan

28

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

  • 通过WiredTiger,MongoDB可以利用WiredTiger内部缓存和文件系统缓存。
  • 在MongoDB 3.2中,默认情况下,WiredTiger内部缓存将使用以下两者中的较大者: 60%的RAM减去1 GB或1 GB。
  • 对于具有10 GB RAM的系统,新的默认设置小于或等于3.0默认设置(对于MongoDB 3.0,WiredTiger内部缓存使用的是1 GB或已安装物理RAM的一半,以较大者为准)。对于具有10 GB以上RAM的系统,新的默认设置大于3.0设置。

限制wireTriggered缓存在.config文件中添加以下行:

wiredTigerCacheSizeGB = 1


3
这里的文档:docs.mongodb.com/v3.2/reference/configuration-options/... -蒙戈在3.2,似乎配置值名称是:storage.wiredTiger.engineConfig.cacheSizeGB,不过--wiredTigerCacheSizeGB是一个命令行PARAM?
KajMagnus

1
您也可以将其添加到配置文件中
Rajniprabha 18/12/21

从3.4开始,它已占
manual/

24

这个问题已经问了几次...

请参阅此相关问题/答案(在下面引用)...如何释放Mongodb使用的缓存?


MongoDB(至少看起来)将使用大量可用内存,但实际上将其留给操作系统的VMM告知其释放内存(请参阅MongoDB文档中的缓存)。

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

但是,在某种程度上,MongoDB并没有真正“使用”内存。

例如,来自MongoDB文档“检查服务器内存使用情况” ...

在不同的平台上,您可能会在过程中将映射的文件视为内存,但这并不完全正确。Unix top可能显示出比mongod更多的内存而不是真正合适的内存。操作系统(具体来说是虚拟内存管理器,取决于OS)由操作系统管理“内存映射文件”所在的内存。该数字通常显示在“ free -lmt”之类的程序中。

它称为“缓存”内存。

MongoDB使用LRU(最近最少使用)缓存算法来确定要释放的“页面”,您将在这两个问题中找到更多信息...


19

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

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

  1. 创建控制组:

    cgcreate -g memory:DBLimitedGroup 
    

    (确保在系统上安装了cgroups二进制文件,有关该操作,请查阅您最喜欢的Linux发行手册)

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

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

    此命令将内存限制为16G(这很好,这限制了malloc分配和OS缓存的内存)

  3. 现在,删除已经保留在缓存中的页面将是一个好主意:

    sync; echo 3 > /proc/sys/vm/drop_caches
    
  4. 最后将服务器分配给创建的控制组:

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

    这会将正在运行的mongod进程分配给仅受16GB内存限制的组。

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


5
不幸的是,这些设置不会持续重启。您需要编写一些初始化脚本来解决此问题frank2.net/cgroups-ubuntu-14-04 对于Ubuntu 14.04 shell脚本可用于创建配置和初始化文件,详细信息在这里 sudo bash -c 'curl -o- http://brains.by/misc/mongodb_memory_limit_ubuntu1404.sh | bash'
brainsucker

6

我认为您无法配置MongoDB使用的内存量,但这没关系(请阅读下文)。

引用官方消息

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

换句话说,Mongo将允许其他程序在需要时使用内存。


6
有任何证据吗?我多次收到OOM(OutOfMemory)消息,因为mongo不会共享它的内存。
Stefan Rogin

通过添加一些交换来避免OOM杀手(官方推荐讨论)。
joeytwiddle

1
@joeytwiddle我的交换是24G,我的ram是8G,而且这种情况仍然发生。
总计1166877


3

并非如此,有一些技巧可以限制内存,例如在Windows上,您可以使用Windows系统资源管理器(WSRM),但是通常,Mongo在专用服务器上可以自由使用内存而不会与其他系统发生过多争用,因此在专用服务器上效果最佳。

尽管操作系统将尝试根据需要将内存分配给其他进程,但实际上,如果其他系统也具有很高的内存要求,则可能导致性能问题。

如果您确实需要限制内存,并且只有一台服务器,那么最好的选择是虚拟化。


3

可以通过组合以下两篇文章中的知识来使用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'

3
mongod --wiredTigerCacheSizeGB 2 xx

3
欢迎使用Stack Overflow!感谢您提供的代码段,它可能会提供一些有限的即时帮助。适当的解释将通过描述为什么这是解决问题的方式来极大地提高其长期价值,并将对以后有其他类似问题的读者更有用。请编辑您的答案以添加一些解释和参考,包括您所做的假设。
sepehr

2

没有理由限制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


0

您可以限制的一件事是mongodb在构建索引时使用的内存量。使用设置进行maxIndexBuildMemoryUsageMegabytes设置。下面是其设置示例:

mongo --eval "db.adminCommand( { setParameter: 1, maxIndexBuildMemoryUsageMegabytes: 70000 } )"


0

这对我在一个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.