Учитывая уровень детализации вашего вопроса, я сосредоточусь на «запросе большой коллекции» и предполагаю, что вы используете механизм хранения 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
db.cards.find().addOption(DBQuery.Option.noTimeout);
. Сколько документов у вас в коллекции карточек? - person Rudra   schedule 25.08.2015