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

MongoDB не использует всю мою системную память для рабочего набора?

Моя машина имеет 42 ГБ ОЗУ, а общий размер индекса составляет 40 ГБ (рабочий набор должен быть заполнен на 100%, поскольку все индексы находятся в столбцах UUID). Я подозреваю, что мой рабочий набор слишком велик, так как количество ошибок страницы стало значительно увеличиваться, например со средней 20 подскочили до 120.

Я обнаружил, что mongod не использует всю мою память, например

ps ax | grep mongod
23051 mongod    20   0  338g 7.7g 7.5g S 87.8 16.4   1533:17 /usr/bin/mongod -f /etc/mongod.conf                                                                                                                                           

В настоящее время используется только 7,7 ГБ.

А с помощью оценщика workingSet 2.4 я обнаружил, что рабочий набор более 50 составляет всего около 650 МБ, что кажется неожиданным с учетом моего размера данных.

"workingSet" : {
    "note" : "thisIsAnEstimate",
    "pagesInMemory" : 166069,
    "computationTimeMicros" : 49281,
    "overSeconds" : 50
},

Есть ли у вас какие-либо идеи?

Во-первых, я бы посоветовал взглянуть сюда:

https://jira.mongodb.org/browse/SERVER-9415

В этом выпуске обсуждается почти та же тема. Подведем итог: из-за того, как ведение журнала работает в MongoDB и как он перераспределяет память, это может вызвать резидентную память для mongod процесс казаться искусственно заниженным. Если вы посмотрите на вывод free команда и кеш вашей файловой системы относительно заполнен, тогда вы с большей вероятностью столкнетесь с этой аномалией, сообщающей резидентную память (при условии, что mongod это, конечно, единственный действительно интенсивный потребитель памяти в системе).

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

Чтобы убедиться, что все, что вы хотите, находится в памяти, вы можете использовать сенсорная команда для загрузки нужного индекса и данных в кеш файловой системы (не резидентный). Следует отметить, что это несколько грубый инструмент, поскольку он просто загружает весь набор данных и / или весь индекс в кеш, и это может вызвать загрузку / блокировку системы - используйте с осторожностью. В зависимости от вашего набора данных может быть более эффективным загружать последние или известные горячие данные с помощью поискового запроса и объяснения. Что-то вроде этого:

db.collection.find({criteria for loading data}).explain()

Или, чтобы убедиться, что загружен определенный индекс, добавьте явную подсказку:

db.collection.find({criteria for loading data}).hint({index name})explain()

Еще стоит обратить внимание на эффективность загрузки данных в память при обращении к диску. В общем, это компромисс между вводом-выводом и использованием памяти, но если ваш приоритет номер один - эффективность памяти, и у вас есть запасной ввод-вывод, чтобы решить эту проблему, то в MongoDB вы, как правило, захотите настроить свой читать вперед настройки вниз с помощью blockdev команда. Для получения дополнительной информации см. Другие вопросы / ответы по Serverfault. Вот и Вот.