Есть ли возможность ограничить использование памяти mongodb?

Я использую Mongo-DBv1.8.1. Моя память сервера составляет 4 ГБ, но Mongo-DB использует более 3 ГБ. Есть ли опция ограничения памяти в Mongo-DB?.

Ответ 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
...

Это ограничит размер кэша до 1 ГБ, больше информации в Документе

Это решило проблему для меня, запустив ubuntu 16.04 и mongoDB 3.2

PS: после изменения конфигурации перезапустите демон mongo.

$ sudo service mongod restart

# check the status
$ sudo service mongod status

Ответ 2

Начиная с 3.2, MongoDB использует WiredTiger в качестве механизма хранения по умолчанию. В предыдущих версиях MMAPv1 использовался как механизм хранения по умолчанию.

  • С помощью WiredTiger MongoDB использует как внутренний кеш WiredTiger, так и кеш файловой системы.
  • В MongoDB 3.2 внутренний кеш WiredTiger по умолчанию будет использовать больше: 60% оперативной памяти минус 1 ГБ или 1 ГБ.
  • Для систем с ОЗУ до 10 ГБ новый параметр по умолчанию меньше или равен настройке по умолчанию 3.0 (для MongoDB 3.0 внутренний кеш WiredTiger использует либо 1 ГБ, либо половину установленной физической ОЗУ, в зависимости от того, какая из них больше). Для систем с объемом памяти более 10 ГБ новая настройка по умолчанию больше, чем настройка 3.0.

чтобы ограничить проводной кэшированный кеш Добавьте следующую строку в файл .config:

wiredTigerCacheSizeGB = 1

Ответ 3

Этот вопрос был задан пару раз...

Смотрите этот связанный вопрос/ответ (цитируется ниже)... как освободить кеширование, которое использует Mongodb?


MongoDB будет (по крайней мере, кажется) использовать много доступной памяти, но на самом деле она оставляет за VMM ОС сказать ей освободить память (см. Кэширование в документации MongoDB.)

Вы должны иметь возможность освободить всю память, перезапустив MongoDB.

Однако в некоторой степени MongoDB на самом деле не "использует" память.

Например, из документов MongoDB Проверка использования памяти сервера...

В зависимости от платформы вы можете видеть отображенные файлы как память в процессе, но это не совсем правильно. Unix top может показывать больше памяти для mongod, чем на самом деле уместно. Операционная система (в частности, диспетчер виртуальной памяти, в зависимости от ОС) управляет памятью, в которой находятся файлы с отображением в памяти. Этот номер обычно отображается в программе типа "free -lmt".

Это называется "кэшированная" память.

MongoDB использует алгоритм кэширования LRU (Least недавно Used), чтобы определить, какие "страницы" выпустить, вы найдете больше информации в этих двух вопросах...

Ответ 4

Вы можете ограничить использование процесса mongod, используя cgroups в Linux.

Используя cgroups, наша задача может быть выполнена в несколько простых шагов.

  1. Создать контрольную группу:

    cgcreate -g memory:DBLimitedGroup 
    

    (убедитесь, что двоичные файлы cgroups установлены в вашей системе, обратитесь к вашему любимому руководству по дистрибутиву Linux, чтобы узнать, как это сделать)

  2. Укажите, сколько памяти будет доступно для этой группы:

    echo 16G > /sys/fs/cgroup/memory/DBLimitedGroup/memory.limit_in_bytes
    

    Эта команда ограничивает память до 16G (хорошо, что она ограничивает память как для выделения памяти, так и для кэша ОС)

  3. Теперь будет хорошей идеей удалить страницы, которые остались в кеше:

    sync; echo 3 > /proc/sys/vm/drop_caches
    
  4. И, наконец, назначьте сервер для созданной контрольной группы:

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

    Это назначит запущенный процесс mongod группе, ограниченной только 16 ГБ памяти.

Источник: Использование Cgroups для ограничения использования памяти MySQL и MongoDB

Ответ 5

Я не думаю, что вы можете настроить, сколько памяти используется MongoDB, но это ОК (читайте ниже).

Цитировать из официального источника :

Размер виртуальной памяти и резидентный размер будут очень большими для процесса mongod. Это доброкачественное: пространство виртуальной памяти будет просто больше, чем размер файлов данных, открытых и отображенных; размер резидента будет варьироваться в зависимости от объема памяти, не используемого другими процессами на машине.

Другими словами, Mongo позволит другим программам использовать память, если они попросят об этом.

Ответ 7

Не совсем, есть несколько приемов для ограничения памяти, например, в Windows вы можете использовать диспетчер системных ресурсов Windows (WSRM), но, как правило, Mongo лучше всего работает на выделенном сервере, когда он свободно использует память без особых конфликтов с другими системами.

Несмотря на то, что операционная система будет пытаться распределять память на другие процессы по мере необходимости, на практике это может привести к проблемам с производительностью, если другие системы также имеют слишком высокие требования к памяти.

Если вам действительно нужно ограничить память и иметь только один сервер, то лучшим выбором будет виртуализация.

Ответ 8

Это можно сделать с помощью групп, объединив знания из этих двух статей: https://www.percona.com/blog/2015/07/01/using-cgroups-to-limit-mysql-and-mongodb-memory-usage/
http://frank2.net/cgroups-ubuntu-14-04/

Здесь вы можете найти небольшую оболочку script, которая создаст файлы конфигурации и init для Ubuntu 14.04: 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'

Ответ 9

mongod --wiredTigerCacheSizeGB 2 xx

Ответ 10

Одна вещь, которую вы можете ограничить - это объем памяти, который использует mongodb при построении индексов. Это устанавливается с помощью параметра maxIndexBuildMemoryUsageMegabytes. Пример того, как его набор ниже:

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

Ответ 11

Нет никаких причин ограничивать кэш MongoDB, так как по умолчанию процесс mongod будет занимать половину памяти на машине и не более. Механизм хранения по умолчанию - 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

Ответ 12

это сработало для меня на экземпляре AWS, чтобы хотя бы очистить кэш-память, которую использовал монго. После этого вы можете увидеть, как ваши настройки оказали влияние.

[email protected]:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          3952       3667        284          0        617        514
-/+ buffers/cache:       2535       1416
Swap:            0          0          0
[email protected]:~$ sudo su
[email protected]:/home/ubuntu# sync; echo 3 > /proc/sys/vm/drop_caches
[email protected]:/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

Ответ 13

Добавив ответ с наибольшим количеством голосов, если вы работаете на компьютере с нехваткой памяти и хотите сконфигурировать wiredTigerCache в МБ, а не в целых ГБ, используйте это -

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

Источник - https://jira.mongodb.org/browse/SERVER-22274