我正在使用Mongo-DBv1.8.1。我的服务器内存为4GB,但Mongo-DB的使用量超过3GB。 Mongo-DB中是否有内存限制选项?
答案 0 :(得分:26)
如果您运行的是 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
答案 1 :(得分:24)
从3.2开始,MongoDB使用WiredTiger作为默认存储引擎。以前的版本使用MMAPv1作为默认存储引擎。
限制wiredTriggered Cache将以下行添加到.config文件:
wiredTigerCacheSizeGB = 1
答案 2 :(得分:22)
这个问题已被问过几次......
请参阅此相关问题/答案(引用如下)...... how to release the caching which is used by Mongodb?
MongoDB会(至少看起来)耗尽大量可用内存,但实际上它会让操作系统的VMM告诉它释放内存(请参阅MongoDB文档中的Caching。)< / p>
您应该可以通过重新启动MongoDB来释放所有内存。
然而,在某种程度上,MongoDB并没有真正“使用”内存。
例如来自MongoDB文档Checking Server Memory Usage ...
根据您可能看到的平台而定 映射文件作为内存中的 过程,但这不严格 正确。 Unix top可能会显示更多 mongod的记忆比真的好 适当。操作系统( 特别是虚拟内存管理器 取决于操作系统)管理内存 “内存映射文件”的位置 居住。通常会显示此编号 在像“free -lmt”这样的程序中。
它被称为“缓存”内存。
MongoDB使用LRU(Least Recently Used)缓存算法来确定要发布的“页面”,您将在这两个问题中找到更多信息......
答案 3 :(得分:15)
您可以使用Linux上的cgroup限制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内存限制的组。
source: Using Cgroups to Limit MySQL and MongoDB memory usage
答案 4 :(得分:5)
我认为你不能配置MongoDB使用多少内存,但这没关系(见下文)。
对于mongod进程,虚拟内存大小和驻留大小似乎非常大。这是良性的:虚拟内存空间将大于打开和映射的数据文件的大小;驻留大小将根据计算机上其他进程未使用的内存量而有所不同。
换句话说,Mongo会让其他程序在需要时使用内存。
答案 5 :(得分:4)
对于Windows,似乎可以控制MongoDB使用的内存量,请参阅Captain Codeman的本教程:
答案 6 :(得分:2)
不是真的,有一些限制内存的技巧,比如在Windows上你可以使用Windows System Resource Manager (WSRM),但一般来说Mongo在专用服务器上效果最好,因为它可以自由使用内存,而不会与其他系统争用很多
虽然操作系统会尝试在需要时为其他进程分配内存,但实际上如果其他系统也有高内存要求,这可能会导致性能问题。
如果你真的需要限制内存,并且只有一台服务器,那么你最好的选择是虚拟化。
答案 7 :(得分:2)
这可以通过结合以下两篇文章的知识来完成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创建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'
答案 8 :(得分:0)
你可以限制的一件事是mongodb在构建索引时使用的内存量。这是使用maxIndexBuildMemoryUsageMegabytes
设置设置的。下面是如何设置的一个例子:
mongo --eval "db.adminCommand( { setParameter: 1, maxIndexBuildMemoryUsageMegabytes: 70000 } )"
答案 9 :(得分:0)
mongod --wiredTigerCacheSizeGB 2 xx
答案 10 :(得分:0)
没有理由限制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
答案 11 :(得分: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
答案 12 :(得分:0)
如果您使用的是内存不足的计算机,并且想以MB而不是整数GB来配置wiredTigerCache
,请添加到投票最高的答案中,请使用此-
storage:
wiredTiger:
engineConfig:
configString : cache_size=345M
答案 13 :(得分:0)
如果您使用 Docker,阅读 Docker image documentation(在设置 WiredTiger 缓存大小限制 部分)我发现他们将默认设置设置为消耗所有可用内存不管您可能对容器施加了多少内存限制,因此您必须直接从数据库配置中限制 RAM 使用量。
mongod.conf
文件:# Limits cache storage
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 1 # Set the size you want
docker run --name mongo-container -v /path/to/mongod.conf:/etc/mongo/mongod.conf -d mongo --config /etc/mongo/mongod.conf
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...