Время ожидания запроса оболочки Mongo истекло через 90 секунд

Я использую mongodb через оболочку mongo для запроса большой коллекции. По какой-то причине через 90 секунд оболочка монго, кажется, останавливает мой запрос, и ничего не возвращается.

Я пробовал следующие две команды, но ни одна из них ничего не возвращает. Через 90 секунд он просто дает мне новую строку, которую я могу ввести в другую команду.

db.cards.find("Поле":"Что-то").maxTimeMS(9999999) db.cards.find("Поле":"Что-то").addOption(DBQuery.Option.tailable)

db.cards.find() возвращает результаты, но все с параметрами истекает ровно через 90 секунд, и ничего не возвращается.

Любая помощь будет принята с благодарностью.


person user2263572    schedule 24.08.2015    source источник
comment
Попробуйте использовать db.cards.find().addOption(DBQuery.Option.noTimeout);. Сколько документов у вас в коллекции карточек?   -  person Rudra    schedule 25.08.2015


Ответы (1)


Учитывая уровень детализации вашего вопроса, я сосредоточусь на «запросе большой коллекции» и предполагаю, что вы используете механизм хранения MMAPv1 без покрытия индексом вашего запроса.

Вы привязаны к диску?

Учитывая приведенные выше предположения, вы можете циклически перемещать данные между ОЗУ и диском. В Mongo по умолчанию установлено ограничение на 100 МБ ОЗУ, поэтому, если ваш запрос должен проверять множество документов (без охвата индекса), виновником может быть подкачка данных с диска в ОЗУ. Я слышал о том, что оболочка mongo действует так, как вы описываете, или блокируется/завершается при превышении ограничений памяти.

32-битные системы также могут налагать жесткие ограничения на объем памяти для больших коллекций.

Вы можете посмотреть на монитор активности диска вашей ОС, чтобы понять, является ли это вашей проблемой.

Насколько велика ваша коллекция?

Далее, насколько велика ваша коллекция? Вы можете show collections просмотреть физический размер коллекции, а также db.cards.count() просмотреть количество записей. Это помогает количественно определить «большую коллекцию».

ПРИМЕЧАНИЕ: вам могут понадобиться расширения mongo-hacker, чтобы увидеть использование диска коллекции в коллекциях шоу.

Расследование оболочки Mongo

В оболочке mongo у вас есть еще пара мест для поиска. По умолчанию mongo регистрирует медленные запросы (> 100 мс). После 90-секундного тайм-аута:

db.adminCommand({getLog: "global" })

и ищите записи журнала медленных запросов.

Затем посмотрите на ваш выигрышный план запроса.

var e = db.cards.explain()
e.find("Field":"Something")

Я предполагаю, что вы увидите

"stage": "COLLSCAN",

Это означает, что вы выполняете полное сканирование коллекции, и вам нужно покрытие индекса для вашего запроса (хорошая идея для запросов и сортировок).

Предложения

У вас должно быть хотя бы частичное покрытие индекса для любого производственного запроса. Правильный индекс должен решить вашу проблему (при условии, что у вас нет документов> 16 МБ).

Другой подход (который я не рекомендую — индексация лучше) — вместо этого использовать курсор.

var cursor = db.cards.find("Field":"Something")
while (cursor.hasNext()) {
  print(tojson(cursor.next()));
}

В зависимости от основной причины это может сработать для вас.

person Steve Tarver    schedule 13.09.2015