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

是否有限制mongodb内存使用的选项?,mongodb,Mongodb,我正在使用Mongo-DBv1.8.1。我的服务器内存是4GB,但Mongo DB使用的内存超过了3GB。MongoDB中是否有内存限制选项?我认为您无法配置MongoDB使用的内存量,但这没关系(请参阅下文) 引自: 对于mongod进程,虚拟内存大小和驻留大小似乎非常大。这是良性的:虚拟内存空间将刚好大于打开和映射的数据文件的大小;驻留大小将根据计算机上其他进程未使用的内存量而变化 换句话说,如果其他程序要求,Mongo会让它们使用内存。不是真的,有一些技巧可以限制内存,比如在Windows

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

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

引自:

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


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

不是真的,有一些技巧可以限制内存,比如在Windows上可以使用,但通常Mongo在专用服务器上工作得最好,因为它可以自由使用内存,而不会与其他系统发生太多争用

尽管操作系统会在其他进程需要时尝试将内存分配给它们,但实际上,如果其他系统也有很高的内存需求,这可能会导致性能问题


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

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

见以下相关问题/答案


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

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

然而,在某种程度上,MongoDB并没有真正“使用”内存

例如,从MongoDB文档中

取决于您可能看到的平台 将映射的文件作为内存存储在 过程,但这不是严格意义上的 对的Unix top可能会显示更多 对mongod的记忆比实际情况要好 适当的操作系统(即 虚拟内存管理器, 根据操作系统(OS)管理内存 其中“内存映射文件” 居住在通常会显示此数字 在像“free-lmt”这样的程序中

它被称为“缓存”内存

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

  • (你不能)

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


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

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

    • 创建控制组:

      cgcreate -g memory:DBLimitedGroup 
      
      (确保系统上安装了cgroups二进制文件,请参阅您喜爱的Linux发行版手册以了解如何执行此操作)

    • 指定此组的可用内存量:

      echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
      
      此命令将内存限制为16G(好消息是,它限制了malloc分配和操作系统缓存的内存)

    • 现在,最好删除缓存中已经保留的页面:

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

      cgclassify -g memory:DBLimitedGroup \`pidof mongod\`
      
      这将把一个正在运行的mongod进程分配给一个只有16GB内存限制的组


    • 这可以通过结合这两篇文章中的知识,通过cGroup实现:

      您可以在这里找到一个小的shell脚本,它将为Ubuntu 14.04创建配置和初始化文件:

      就这样,

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

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

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

      要限制wiredTriggered缓存,请在.config文件中添加以下行:


      wiredTigerCacheSizeGB=1

      如果运行的是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,更多信息请参阅

      这为我解决了这个问题,运行了
      ubuntu16.04
      mongodb3.2

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

      $ sudo service mongod restart
      
      # check the status
      $ sudo service mongod status
      

      您可以限制mongodb在构建索引时使用的内存量。这是使用
      maxIndexBuildMemoryUsageMegabytes
      设置设置的。其集合的示例如下所示:


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

      没有理由限制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
      
      这对f有效
      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
      
      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
      
      storage:
       wiredTiger:
        engineConfig:
          configString : cache_size=345M
      
      # Limits cache storage
      storage:
         wiredTiger:
            engineConfig:
               cacheSizeGB: 1 # Set the size you want
      
      version: '3'
      
      services:
          mongo:
              image: mongo:4.2
              # Sets the config file
              command: --config /etc/mongo/mongod.conf
              volumes:
                  - ./config/mongo/mongod.conf:/etc/mongo/mongod.conf
              # Others settings...