Есть ли возможность ограничить использование памяти mongodb? - PullRequest
57 голосов
/ 28 июля 2011

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

Ответы [ 12 ]

28 голосов
/ 08 августа 2017

Если вы используете MongoDB 3.2 или более позднюю версию, вы можете ограничить wiredTiger кеш , как указано выше.

В /etc/mongod.conf добавить wiredTiger part

...
# 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
24 голосов
/ 13 февраля 2017

Начиная с версии 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.

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

wiredTigerCacheSizeGB = 1

23 голосов
/ 31 июля 2011

Этот вопрос задавался пару раз ...

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


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

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

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

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

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

Оно называется «кэшированной» памятью.

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

17 голосов
/ 15 января 2016

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

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

  1. Создать группу управления:

    cgcreate -g memory:DBLimitedGroup 
    

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

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

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

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

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

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

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

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

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

6 голосов
/ 28 июля 2011

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

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

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

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

4 голосов
/ 16 декабря 2011

Для Windows представляется возможным контролировать объем памяти, используемой MongoDB, см. Это руководство в Captain Codeman:

Ограничение использования памяти MongoDB в Windows без виртуализации

3 голосов
/ 04 мая 2016

Это можно сделать с помощью 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/

Здесь вы можете найти небольшой сценарий оболочки, который создаст файлы конфигурации и инициализации для Ubuntu14.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'
3 голосов
/ 29 июля 2011

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

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

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

0 голосов
/ 23 июня 2019

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

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
0 голосов
/ 18 февраля 2019

Нет причин ограничивать кэш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...