Назад | Перейти на главную страницу

Свежий MongoDB использует 100 МБ виртуальной памяти?

У меня проблема с использованием виртуальной памяти при использовании MongoDB на сервере. ПРИМЕЧАНИЕ: у меня есть только локальная учетная запись пользователя. без корневые привилегии.

Ограничение виртуальной машины сервера (из ulimit -v) составляет 120 МБ.

С пустой база данных, MongoDB сообщает об использовании 100 МБ виртуальной памяти.

> db.serverStatus().mem 
{
    "bits" : 32,
    "resident" : 23,
    "virtual" : 100,
    "supported" : true,
    "mapped" : 0
}

Как только я пытаюсь создать свою первую запись данных (через db.addUser в базе данных администратора), происходит сбой с ошибкой нехватки памяти.

done allocating datafile DBPATH/admin.0, size: 16MB,  took 0.244 secs

ERROR:   mmap() failed for DBPATH/ admin.0 len:16777216 errno:12 Cannot allocate memory

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

Я не могу понять, почему он использует так много виртуальной памяти и почему не может создать единую таблицу базы данных размером 16 МБ.

Я прочитал принятый ответ на этот другой вопрос. Он прояснил, как mongodb использует виртуальную память, но не помог мне понять, что здесь не так.

Вам необходимо предоставить адекватные ресурсы для вашего сервера MongoDB - это означает ЛОТЫ оперативной памяти.
Вы ограничиваете его практически никто, поэтому не стоит ожидать, что он будет работать, если вы не установите более разумные ограничения на использование памяти.


Похоже, вы ошибаетесь, полагая, что 100 МБ - это большой объем памяти.
Это не.

Простая оболочка (возьмем старую ванильную Bourne sh в качестве примера) составляет почти 10 МБ виртуального размера.
Более сложная оболочка (скажем, оболочка Bourne-Again Shell bash) чуть меньше 25 МБ.
Рабочий веб-сервера Apache может иметь размер виртуальной машины 150 МБ или более.

Ядро базы данных, даже NoSQL, которое имеет виртуальный размер всего 100 МБ и обменивается данными по сети, это откровенно чудо программирования. Если вы ожидаете, что сможете что-то сделать с этим чудом, вам придется выделить ему достаточно оперативной памяти, чтобы на самом деле хранить и работать с данными.

Использование виртуальной памяти будет представлять весь размер файлов данных (включая пустое пространство), а не только данные в базе данных. Когда вы вызываете mmap () для файла, он просто отображает все это в виртуальную память - ему все равно, что находится в файле.

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

Рабочий набор и резидентная память - это совершенно разные вещи по сравнению с требованиями к виртуальной памяти для MongoDB. Для виртуальной памяти вам потребуется, по крайней мере, общий размер ваших файлов данных, и если вы работаете с журналированием (вы должны, но обычно это невозможно с 32-разрядной версией), это требование удваивается. Как правило, у вас должен быть хост с неограниченной виртуальной памятью для запуска MongoDB, если есть наложенные ограничения, это, вероятно, вызовет у вас много проблем.

Это не часть того, о чем вы спрашиваете, но я бы также обычно не рекомендовал использовать 32-разрядную версию MongoDB для чего-либо, кроме некоторого базового тестирования.