Моя машина имеет 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. Вот и Вот.