Как я могу проверить производительность запросов mongodb без кеша - PullRequest
11 голосов
/ 20 февраля 2012

У меня есть запрос, который занимает слишком много времени, чтобы закончить.Мне нравится делать некоторые тесты производительности, но после того, как я проверил один раз (это занимает ~ 30 секунд), запрос начинает выполняться намного быстрее (<1 секунда).Я предполагаю, что это должно быть с кэшированием Mongodb.Есть ли способ отключить кэширование для mongodb или другой способ проверить производительность? </p>

Я использую mongodb, размещенный в mongohq.Программа с Ruby on Rails 3. Вот объяснение:

{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}}

Обратите внимание, что мне пришлось урезать некоторые объяснения, потому что они были слишком длинными.Там, где есть «много идентификаторов объектов», было много идентификаторов объектов (~ 400).

Спасибо всем

Ответы [ 3 ]

2 голосов
/ 28 августа 2018

Я думаю, вы не можете помешать Монго подготовить план запроса (так работает монго).Итак, перед статистикой запроса. 1. Очистите кэш плана всех коллекций на

>db.colllction_name.getPlanCache().clear()
Запишите медленные запросы с помощью Profiler (см. Документы mongo), работайте над запросом, чтобы оптимизировать его, снова очистите кеш и проверьте производительность запросаснова.
2 голосов
/ 20 февраля 2012

Когда вы впервые запускаете запрос, набор данных отображается в память, но не был выгружен в фактическую память, см. Кэширование на сайте MongoDB.Итак, ОС должна вывести этот набор данных в память, а затем вы получите запрос и результаты.

Поскольку вы перемещаетесь с диска (медленно) в ОЗУ (быстро), начальный запуск идет медленно,и затем, если у вас нет недостатка памяти, эти данные останутся в оперативной памяти, и все ваши последующие запросы к этому набору данных будут быстрыми.

Вот как функционирует MongoDB: процесс загрузки вашего набора данных в память часто называют «разогревом» базы данных, и только после этого разогрева (в вашем случае первый запрос)Вы получаете истинную производительность.

Стоит отметить, что ваш первоначальный запрос по-прежнему занимает очень много времени для возврата.Вы должны убедиться, что он использует индексы эффективно.Лучшее место для начала этого расследования - страница объяснение () .

0 голосов
/ 19 декабря 2017

Вы можете использовать db.collection.getPlanCache().clear(), чтобы удалить все кэшированные планы запросов для коллекции.

https://docs.mongodb.com/v3.2/reference/method/PlanCache.clear/

...