Is there any option to limit mongodb memory usage?

I am using Mongo-DBv1.8.1. My server memory is 4GB but Mongo-DB is utilizing more than 3GB. Is there memory limitation option in Mongo-DB?.

167197 次浏览

我不认为您可以配置 MongoDB 使用多少内存,但是这没有问题(请参阅下文)。

引用 官方消息来源的一句话:

虚拟内存大小和驻留大小将出现非常大的蒙古进程。这是良性的: 虚拟内存空间将仅大于打开和映射的数据文件的大小; 驻留大小将取决于机器上其他进程未使用的内存量。

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

实际上并非如此,有一些技巧可以限制内存,比如在 Windows 上你可以使用 Windows 系统资源管理器(WSRM),但是通常当你可以免费使用内存而不与其他系统发生冲突时,Mongo 在专有服务器上效果最好。

尽管操作系统会根据需要将内存分配给其他进程,但在实践中,如果其他系统也有较高的内存需求,这可能会导致性能问题。

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

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

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


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

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

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

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

取决于您可能看到的平台 中作为内存的映射文件 过程,但这并不严格 正确,Unix top 可能会显示更多 对蒙神的记忆 操作系统( 特别是虚拟内存管理器, 视乎操作系统而定)管理内存 “内存映射文件” 这个数字通常显示 像“ Free-lmt”这样的节目。

这就是所谓的“缓存”内存。

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

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

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

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

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

  1. 创建对照组:

    cgcreate -g memory:DBLimitedGroup
    

    (确保在您的系统上安装了 cgroup 二进制文件,请参考您最喜欢的 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. And finally assign a server to created control group:

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

    这将把一个正在运行的 monGod 进程分配给一个仅限于16GB 内存的组。

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

这可以通过使用 cgroup 来完成,方法是结合这两篇文章中的知识: 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创建 config 和 init 文件: 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.2开始,MongoDB 使用 WiredTiger 作为默认存储引擎。以前的版本使用 MMAPv1作为默认存储引擎。

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

限制 wiredTrigered Cache 添加以下行到.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,更多信息在 医生

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

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

$ sudo service mongod restart


# check the status
$ sudo service mongod status

您可以限制的一件事是构建索引时蒙戈德布所使用的内存量。这是使用 maxIndexBuildMemoryUsageMegabytes设置设置的。下面是它的集合的一个例子:

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

mongod --wiredTigerCacheSizeGB 2 xx

没有理由限制 MongoDB 缓存,因为在默认情况下 mongod 进程将占用机器上1/2的内存,而且不会再占用更多内存。默认的存储引擎是 WiredTiger。对于 WiredTiger,MongoDB 同时使用 WiredTiger 内部缓存和文件系统缓存

您可能正在查看 top,并假设 Mongo 正在使用计算机上的所有内存。那是虚拟内存。使用 free-m:

              total        used        free      shared  buff/cache   available
Mem:           7982        1487        5601           8         893        6204
Swap:             0           0           0

只有当可用度量值为零时,计算机才会将内存交换到磁盘。在这种情况下,您的数据库对于您的计算机来说太大了。向集群中添加另一个 mongodb 实例。

在 mongod 控制台中使用以下两个命令获取有关 Mongob 使用了多少虚拟内存和物理内存的信息:

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

这对我在 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

如果您使用的是内存不足的机器,并且希望将 wiredTigerCache配置为 MBs 而不是整数 GBs,那么可以使用以下命令添加最佳投票答案-

storage:
wiredTiger:
engineConfig:
configString : cache_size=345M

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

如果您正在使用 Docker,请阅读 Docker 映像文档(在 设置 WiredTiger 缓存大小限制部分) ,我发现了 它们将默认值设置为使用所有可用内存,而不考虑您可能对容器施加的内存限制,因此您必须直接从 DB 配置限制 RAM 的使用。

  1. 创建 mongod.conf文件:
# Limits cache storage
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1 # Set the size you want
  1. 现在可以将该配置文件分配给容器: docker run --name mongo-container -v /path/to/mongod.conf:/etc/mongo/mongod.conf -d mongo --config /etc/mongo/mongod.conf
  2. 或者 您可以使用 docker-compose.yml文件:
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...