MongoDB - Различные сроки выполнения запросов после перезапуска сервера

Скажем, что я запускаю сервер mongo db:

mongo --dbpath=/some/path --port=12345 --storageEngine wiredTiger

Затем я запускаю один и тот же запрос 10 раз (без учета первого, так что все они находятся в теплом кеше) следующим образом:

mongo query1.js

Время, которое я получаю (проверено через time, а также логгер mongodb):

8137ms 8145ms 8193ms 8091ms 8152ms 8110ms 8182ms 8142ms 8133ms 8098ms

Великий - довольно последовательный. Все находятся в пределах ~ 100 мс друг от друга, что имеет смысл.

Затем я завершаю сервер в любой следующих моделях:

pkill mongod mongod --dbpath=/some/path --shutdown mongo shutdown.js

Где shutdown.js содержит:

db.getSiblingDB('admin').shutdownServer();

Затем перезапустите его, используя ту же самую команду, и я получаю следующие моменты:

8531ms 8492ms 8613ms 8555ms 8538ms 8512ms 8551ms 8511ms 8608ms 8522ms

Опять же, они постоянно находятся в пределах ~ 100 мс, но все они находятся на другом уровне.

Если я сделаю это снова, это может быть около 8.3, 8.6, 8.9 или где-нибудь между реальными. Никакие другие пользовательские процессы не открыты (кроме тех, которые необходимы для ssh в машине).

Я провел эксперимент следующим образом:

while True: run the query 25 times and record the minimum such runtime shutdown the server and restart it, wait for it to listen

Это продолжалось два дня в выходные, в то время как я не взаимодействовал с машиной, собирая 223 точки данных, а минимальные промежутки времени варьировались от 7.9s до 8.9s. Если я не остановил сервер между ними, это не произойдет, но опять же, я могу получить базовый уровень 7.9s, или я могу получить один из 8.9s.

Стандартное отклонение одной точки данных (время выполнения 25 запросов) всегда было очень низким (около 0,06), но между всеми запросами было действительно высоким.

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

Ответы

Ответ 1

MongoDB хранит текущие данные обработки в ОЗУ, поэтому ваш запрос может занять разное время в одном запросе. Эта ссылка поможет вам.

Ответ 2

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

Планы запросов сохраняются в кеше, который очищается при перезапуске mongo. Поэтому при первом запуске запроса требуется время. См. Объяснение ( "executeStats" ).

С помощью WiredTiger, MongoDB использует как кеш файловой системы, так и кеш WiredTiger. По умолчанию, начиная с MongoDB 3.2, кеш WiredTiger будет использовать 60% ОЗУ минус 1 ГБ или он будет использовать 1 ГБ, в зависимости от того, что больше. Для систем с объемом памяти до 10 ГБ это меньше или равно настройке 3.0. Для систем с объемом памяти более 10 ГБ конфигурация больше, чем настройка 3.0.

В MongoDB 3.0 кеш WiredTiger по умолчанию использует 1 ГБ или половину установленной физической памяти, в зависимости от того, что больше.

MongoDB также автоматически использует всю свободную память на компьютере через кэш файловой системы (данные в кеше файловой системы сжаты).

Смотрите Основы MongoDB