У меня есть следующая конфигурация:
- хост-машина, которая запускает три док-контейнера:
- MongoDB
- Redis
- Программа, использующая предыдущие два контейнера для хранения данных
Redis и MongoDB используются для хранения огромных объемов данных. Я знаю, что Redis должен хранить все свои данные в оперативной памяти, и я в порядке с этим. К сожалению, происходит то, что Монго начинает занимать много ОЗУ, и как только ОЗУ хоста заполнится (здесь мы говорим о 32 ГБ), происходит сбой либо Монго, либо Redis.
Я прочитал следующие предыдущие вопросы об этом:
- Ограничение использования оперативной памяти MongoDB : по-видимому, большая часть оперативной памяти используется кэшем WiredTiger
- MongoDB ограничить память : здесь, видимо, проблема заключалась в данных журнала
- Ограничьте использование памяти RAM в MongoDB : здесь они предлагают ограничить память mongo, чтобы она использовала меньший объем памяти для своего кэша / logs / data
- MongoDB использует слишком много памяти : здесь говорят, что это система кэширования WiredTiger, которая стремится использовать как можно больше оперативной памяти для обеспечения более быстрого доступа. Они также заявляют
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Есть ли возможность ограничить использование памяти mongodb? : опять кешируя, они тоже добавляют
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- MongoDB индекс / RAM отношение : цитата:
MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
- как освободить кеширование, которое использует MongoDB? : тот же ответ, что и в 5.
Теперь, по-видимому, из всех этих ответов я понимаю, что:
- Для более быстрого доступа для монго было бы лучше разместить все индексы в оперативной памяти. Однако, в моем случае, я в порядке с индексами, частично находящимися на диске, поскольку у меня довольно быстрый SSD.
- RAM в основном используется для кеширования монго.
Учитывая это, я ожидал, что Монго попытается использовать как можно больше места в ОЗУ, но при этом сможет функционировать также с небольшим объемом ОЗУ и извлекать большинство данных с диска. Тем не менее, я ограничил объем памяти Docker-контейнера mongo (например, до 8 ГБ), используя --memory
и --memory-swap
, но вместо того, чтобы извлекать данные с диска, mongo просто зависал, как только ему не хватало памяти.
Как заставить монго использовать только доступную память и извлекать с диска все, что не помещается в память?
dmesg
связаны с неожиданным завершением работы? Наиболее вероятная возможность использования Docker заключается в том, что процессы в контейнере обнаруживают общую доступную оперативную память, а не ограничение контейнера.
mongod
в контейнере ( lxc
, cgroups
Docker и т. Д.), Который не имеет доступа ко всей оперативной памяти, доступной в системе, вы должны установить storage.wiredTiger.engineConfig.cacheSizeGB
значение, меньшее объема оперативной памяти, доступной в контейнер. Точное количество зависит от других процессов, запущенных в контейнере, но обычно не должно превышать значение по умолчанию 50% ОЗУ минус 1 ГБ.