是否有限制mongodb内存使用的选项?
我正在使用Mongo-DBv1.8.1。我的服务器内存是4GB,但Mongo DB使用的内存超过了3GB。MongoDB中是否有内存限制选项?我认为您无法配置MongoDB使用的内存量,但这没关系(请参阅下文) 引自: 对于mongod进程,虚拟内存大小和驻留大小似乎非常大。这是良性的:虚拟内存空间将刚好大于打开和映射的数据文件的大小;驻留大小将根据计算机上其他进程未使用的内存量而变化是否有限制mongodb内存使用的选项?,mongodb,Mongodb,我正在使用Mongo-DBv1.8.1。我的服务器内存是4GB,但Mongo DB使用的内存超过了3GB。MongoDB中是否有内存限制选项?我认为您无法配置MongoDB使用的内存量,但这没关系(请参阅下文) 引自: 对于mongod进程,虚拟内存大小和驻留大小似乎非常大。这是良性的:虚拟内存空间将刚好大于打开和映射的数据文件的大小;驻留大小将根据计算机上其他进程未使用的内存量而变化 换句话说,如果其他程序要求,Mongo会让它们使用内存。不是真的,有一些技巧可以限制内存,比如在Windows
换句话说,如果其他程序要求,Mongo会让它们使用内存。不是真的,有一些技巧可以限制内存,比如在Windows上可以使用,但通常Mongo在专用服务器上工作得最好,因为它可以自由使用内存,而不会与其他系统发生太多争用 尽管操作系统会在其他进程需要时尝试将内存分配给它们,但实际上,如果其他系统也有很高的内存需求,这可能会导致性能问题
如果你真的需要限制内存,并且只有一台服务器,那么你最好的选择就是虚拟化。这个问题已经被问了好几次了 见以下相关问题/答案
MongoDB将(至少看起来)占用大量可用内存,但实际上它让操作系统的VMM来告诉它释放内存(请参阅MongoDB文档中的内容) 您应该能够通过重新启动MongoDB释放所有内存。 然而,在某种程度上,MongoDB并没有真正“使用”内存 例如,从MongoDB文档中 取决于您可能看到的平台 将映射的文件作为内存存储在 过程,但这不是严格意义上的 对的Unix top可能会显示更多 对mongod的记忆比实际情况要好 适当的操作系统(即 虚拟内存管理器, 根据操作系统(OS)管理内存 其中“内存映射文件” 居住在通常会显示此数字 在像“free-lmt”这样的程序中 它被称为“缓存”内存 MongoDB使用LRU()缓存算法来确定要释放哪些“页面”,您将在这两个问题中找到更多信息
- (你不能)
- 创建控制组:
(确保系统上安装了cgroups二进制文件,请参阅您喜爱的Linux发行版手册以了解如何执行此操作)cgcreate -g memory:DBLimitedGroup
- 指定此组的可用内存量:
此命令将内存限制为16G(好消息是,它限制了malloc分配和操作系统缓存的内存)echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
- 现在,最好删除缓存中已经保留的页面:
sync; echo 3 > /proc/sys/vm/drop_caches
- 最后,将服务器分配给创建的控制组:
这将把一个正在运行的mongod进程分配给一个只有16GB内存限制的组cgclassify -g memory:DBLimitedGroup \`pidof mongod\`
- 对于Windows,似乎可以控制MongoDB使用的内存量,请参阅Captain Codeman上的本教程:
您可以在Linux上使用cgroup限制mongod进程的使用 使用cgroup,我们的任务可以通过几个简单的步骤完成
这可以通过结合这两篇文章中的知识,通过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...