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

kum*_*_88 59 mongodb

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

mik*_*kun 34

如果您运行的是mongodb 3.2+,则可以限制如上所述的wiredTiger缓存.

wiredTiger添加/etc/mongod.conf部分

...
# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
        cacheSizeGB: 1
...
Run Code Online (Sandbox Code Playgroud)

这会将缓存大小限制为1Gb,更多信息在docks中

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

  • 更改配置文件后是否需要重启mongodb服务? (2认同)
  • 这可能只是使mongo使用文件系统缓存。 (2认同)

小智 26

从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的一半,以较大者为准).对于RAM超过10 GB的系统,新的默认设置大于3.0设置.

限制wiredTriggered Cache将以下行添加到.config文件:

wiredTigerCacheSizeGB = 1

  • 这是文档:https://docs.mongodb.com/v3.2/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB - 在Mongo 3.2中,配置值名称似乎是:`storage.wiredTiger.engineConfig .cacheSizeGB`,但`--wiredTigerCacheSizeGB`是一个_command line_ param? (2认同)

Jus*_*ins 24

这个问题已被问过几次......

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


MongoDB将(至少看起来)耗尽大量可用内存,但它实际上是由操作系统的VMM来告诉它释放内存(请参阅MongoDB文档中的缓存.)

您应该能够通过重新启动MongoDB来释放任何和所有内存.

但是,在某种程度上,MongoDB并没有真正"使用"内存.

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

根据平台的不同,您可能会在过程中将映射的文件视为内存,但这并不严格正确.Unix top可能会显示出比mongod更多的内存.操作系统(特别是虚拟内存管理器,取决于操作系统)管理"内存映射文件"所在的内存.这个数字通常显示在像"free -lmt"这样的程序中.

它被称为"缓存"内存.

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


rmc*_*rmc 18

您可以使用Linux上的cgroup限制mongod进程使用.

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

  1. 创建控制组:

    cgcreate -g memory:DBLimitedGroup 
    
    Run Code Online (Sandbox Code Playgroud)

    (确保系统上安装了cgroups二进制文件,请参阅您最喜欢的Linux发行版手册,了解如何执行此操作)

  2. 指定该组可用的内存量:

    echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
    
    Run Code Online (Sandbox Code Playgroud)

    此命令将内存限制为16G(这对于malloc分配和OS缓存都限制了内存)

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

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

    cgclassify -g memory:DBLimitedGroup \`pidof mongod\`
    
    Run Code Online (Sandbox Code Playgroud)

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

source:使用Cgroups限制MySQL和MongoDB内存使用

  • 不幸的是,这些设置不会持续重启.你需要编写一些初始化脚本来修复这个http://frank2.net/cgroups-ubuntu-14-04/对于Ubuntu 14.04 shell脚本可用于创建配置和初始化文件,[详情请参阅](http:// brainsuckerna .blogspot.com/2016/05/limiting-mongodb-memory-usage-with.html)`sudo bash -c'curl -o- http://brains.by/misc/mongodb_memory_limit_ubuntu1404.sh | bash'` (4认同)
  • 下载脚本,不要像这样运行它 - 任意运行 shell 脚本是非常危险的。 (3认同)

小智 8

添加到投票最高的答案中,如果您使用的是低内存计算机并且想要配置wiredTigerCache以 MB 为单位而不是整数 GB,请使用此 -

storage:
 wiredTiger:
  engineConfig:
    configString : cache_size=345M
Run Code Online (Sandbox Code Playgroud)

来源 - https://jira.mongodb.org/browse/SERVER-22274


Sea*_*ere 6

我认为你不能配置MongoDB使用多少内存,但这没关系(见下文).

引用官方消息来源:

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

换句话说,Mongo会让其他程序在需要时使用内存.

  • 有什么证据吗?我多次收到OOM(OutOfMemory)消息,因为mongo不会分享它的内存. (5认同)
  • @joeytwiddle 我的交换是 24G,我的 ram 是 8G,这仍然发生。 (2认同)

小智 6

mongod --wiredTigerCacheSizeGB 2 xx
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出!感谢您提供的代码片段,它可能会提供一些有限的即时帮助。正确的解释将通过描述为什么这是问题的解决方案来极大地提高其[长期价值](https://meta.stackexchange.com/q/114762/206345),并使其对未来的读者更有用与其他类似的问题。请编辑您的答案以添加一些解释、参考资料,包括您所做的假设。 (3认同)

Kde*_*per 5

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

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