Время ожидания запроса оболочки Mongo составляет 90 секунд
Я использую mongodb через оболочку mongo для запроса большой коллекции. Почему-то через 90 секунд оболочка mongo, кажется, останавливает мой запрос, и ничего не возвращается.
Я пробовал следующие две команды, но ни одна из них не вернет ничего. Через 90 секунд он просто дает мне новую строку, которую я могу набрать другой командой.
db.cards.find ("Поле":"Что-то").maxTimeMS(9999999) db.cards.find("Поле":"Что-то"). addOption (DBQuery.Option.tailable)
db.cards.find () возвращает результаты, но что-либо с параметрами истекает ровно через 90 секунд, и ничего не возвращается.
Любая помощь будет принята с благодарностью.
1 ответ
Учитывая уровень детализации вашего вопроса, я собираюсь сосредоточиться на "запросе большой коллекции" и предположить, что вы используете механизм хранения MMAPv1 без покрытия индекса по вашему запросу.
Вы привязаны к диску?
Учитывая вышеизложенные предположения, вы можете циклически пересылать данные между оперативной памятью и диском. Mongo имеет ограничение по умолчанию в 100 МБ ОЗУ, поэтому, если ваш запрос должен проверять большое количество документов (без индекса покрытия), виновником может быть подкачка данных с диска на ОЗУ. Я слышал, что оболочка монго действует, как вы описываете, или блокирует / завершает работу при превышении ограничений памяти.
32-битные системы также могут накладывать жесткие ограничения памяти для больших коллекций.
Вы могли бы взглянуть на монитор активности диска вашей ОС, чтобы понять, является ли это вашей проблемой.
Насколько велика ваша коллекция?
Далее, насколько велика ваша коллекция? Вы можете show collections
и увидеть физический размер коллекции, а также db.cards.count()
чтобы увидеть ваш счет записи. Это помогает количественно определить "большую коллекцию".
ПРИМЕЧАНИЕ: вам может потребоваться расширение mongo-hacker, чтобы увидеть использование диска коллекции в шоу коллекциях.
Монго снаряд расследование
В оболочке Монго у вас есть еще пара мест, чтобы посмотреть. По умолчанию 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()));
}
В зависимости от первопричины, это может работать для вас.