MongoDB ограничить память - PullRequest
19 голосов
/ 06 декабря 2010

Я использую Монго для хранения лог файлов. И mongoDB, и mysql работают на одной машине, виртуализация mongo env не возможна. Я боюсь, что скоро столкнусь с проблемами перфорирования, так как таблица логов растет очень быстро. Есть ли способ ограничить резидентную память для mongo, чтобы она не использовала всю доступную память и чрезмерно замедляла работу сервера mysql?

Машина БД: Debian 'lenny' 5

Другие решения (пожалуйста, прокомментируйте):

  • Поскольку нам нужны все исторические данные, мы не можем использовать ограниченные коллекции, но я также рассматриваю возможность использования скрипта cron, который создает и удаляет старые данные

  • Должен ли я также рассмотреть возможность использования ключей меньшего размера, как это предлагается на других форумах?

Ответы [ 3 ]

13 голосов
/ 06 декабря 2010

Привет, Влад, у вас есть несколько простых стратегий в отношении логов.

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

Другими словами, вы можете разбить использование ОЗУ на две основные части: индекс и данные.

Если вы 'При обычном ведении журнала часть данных постоянно стирается, поэтому в ОЗУ действительно остается только индекс.

Второе, что нужно знать, это то, что вы можете уменьшить проблему с индексом, помещая журналы в меньшие сегменты.Думайте об этом так.Если вы соберете все журналы в коллекцию с меткой даты (назовите ее logs20101206), то вы также сможете контролировать размер индекса в ОЗУ.

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

, но я также рассматриваю возможность использования сценария cron, который создает и удаляет старые данные

Этот метод регистрации по дням также помогает удалить старые данные.Через три месяца, когда вы закончите с данными, вы просто сделаете db.logs20101206.drop(), и сбор мгновенно исчезнет.Обратите внимание, что вы не освобождаете место на диске (оно все предварительно выделено), но новые данные заполнят пустое место.

Следует ли мне также рассмотреть возможность использования ключей меньшего размера, как это предлагается на других форумах?

Да.

На самом деле, он встроен в мои объекты данных.Поэтому я обращаюсь к данным, используя logs.action или logs->action, но внизу данные фактически сохраняются в logs.a.Действительно легко тратить больше места на «поля», чем на «значения», поэтому стоит сжать «поля» и попытаться абстрагировать его в другом месте.

1 голос
/ 02 декабря 2016

Для версии 3.2+, которая использует движок wiredTiger, опция --wiredTigerCacheSizeGB относится к вопросу. Вы можете установить его, если знаете, что именно делаете. Я не знаю, является ли это лучшей практикой, просто прочитайте документ и поднимите его здесь

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

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

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

...