Ответ 1
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), но между всеми запросами было действительно высоким.
Есть ли у кого-нибудь интуиция о том, почему это происходит и как я могу это предотвратить? Я пытаюсь выяснить, является ли один запрос быстрее, чем другой, но я не могу получить хороший базовый уровень для тестирования. Перезапуск сервера не является абсолютно необходимым, но это облегчит мне жизнь, так как у меня не всегда работает сервер.
MongoDB хранит текущие данные обработки в ОЗУ, поэтому ваш запрос может занять разное время в одном запросе. Эта ссылка поможет вам.
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