Доброго дня. Уже недельку ищу решение проблемы медленного курсора, и

чего то не возьму в толк. Есть у меня коллекция на 500к элементов, хочу из нее вытащить 25-40к записей, и отдать их на клиента.

Стенд - репликасет (1 master 2 replica) 4.4.2 в докере на одном хосте.

Запрос банален
testmodel.find({
"resourceType": "virtualMachine"
})
Пробовал монгусом, и стандартным mongodb в nodejs разница на уровне погрешности. Результат запроса удручающий, 3-5 секунд.
Понимаю, что все тупит, именно из за сетевых задержек, т.к разворачивая в docker-compose на локальной машине точно такой же конфиг время работы = 250ms стабильно.

Попробовал tcpdump пить трафик с хостов на себя и смотреть ответы, вижу что ответы летят пачками по 10-12 записей (движения курсора?)

Вопрос.
Разве это не нормально, хотеть вытащить из базы 25к элементов? Я много хочу? Монга так не работает?

У меня явное ощущение, что я чего то в розетку не включил, и оно просто не работает.

Пробовал строить индексы по этому полю, реиндексить, и тд. эффекта 0.
Пытался крутить batchSize до 100 в нативном клиенте эффекта не заметил (tcpdump показывает все те же 10-12 записей)
Крутил коннекшен пул, тоже без результата.

Документы мелкие, 5 полей, тестом рандомом наполнил, выглядят вот так.
{
"_id" : ObjectId("5fe256cff6accd21a13e9155"),
"team" : "7LWNfcrf",
"resourceName" : "mk5CU5BdmfHtuUA8KRU22CfrMzIkRSJ09yPl",
"resourceType" : "virtualMachine",
"storeSize" : 3599942,
"reportId" : "c510f214-79de-4e12-b725-2af120a50003",
"__v" : 0
}

Находил пару вопросов по перформансу cursor в интернете, но также без ответов и рекомендаций.

https://dba.stackexchange.com/questions/193708/aggregation-vs-cursor-for-reshaping-mongodb-documents

https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/10

https://stackoverflow.com/questions/31357025/mongodb-cursor-iteration-performance-issue


Офицальные гайды по оптимизации запросов молчат на эту тему.
Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?

8 ответов

21 просмотр

А какой итоговый размер джсона, который вы получаете через 3-5 секунд?

Vladimir-Lila Автор вопроса

Покажите пожалуйста explain({executionStats:1}) для вашего запроса

Vladimir-Lila Автор вопроса
yopp 💉💉
Покажите пожалуйста explain({executionStats:1}) дл...

Вот executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 37, totalKeysExamined: 0, totalDocsExamined: 75003, executionStages: { stage: 'COLLSCAN', filter: [Object], nReturned: 25001, executionTimeMillisEstimate: 3, works: 75005, advanced: 25001, needTime: 50003, needYield: 0, saveState: 75, restoreState: 75, isEOF: 1, direction: 'forward', docsExamined: 75003 }, allPlansExecution: [] },

Vladimir Lila
Вот executionStats: { executionSuccess: true...

Если я не ошибаюсь то тут nReturned = totalDocsExamined должен быть. если не равно, то означает что индекс построин не правильно или же его вообще нету.

Vladimir-Lila Автор вопроса
Дара
Если я не ошибаюсь то тут nReturned = totalDocsExa...

Все так, индекса не было, но как я говорил, не многое меняется, если его добавить

Vladimir-Lila Автор вопроса
Дара
Если я не ошибаюсь то тут nReturned = totalDocsExa...

Вот теперь explain executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 30, totalKeysExamined: 25001, totalDocsExamined: 25001, executionStages: { stage: 'FETCH', nReturned: 25001, executionTimeMillisEstimate: 5, works: 25002, advanced: 25001, needTime: 0, needYield: 0, saveState: 25, restoreState: 25, isEOF: 1, docsExamined: 25001, alreadyHasObj: 0, inputStage: [Object] }, allPlansExecution: [] },

Vladimir Lila
Вот executionStats: { executionSuccess: true...

Вы говорите что у вас коллекция на 500 тысяч документов, но в статистике планировщика: docsExamined: 75003

Похожие вопросы

Обсуждают сегодня

Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
8
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
Добрый день. Мне посоветовали обратиться к вам в чат за помощью. Ситуация описана на скрине. Как мне сказали, мне на бота навесили флудвейт. Есть ли возможность снять его ра...
OVERLINK
7
всем привет помогите пожалуйста используя CDN (GCP) у игроков из вьетнама загружается конфиг (размер 999 bytes) загружается 5 и более минут н а других CDN сервисах такой пробл...
Andrew Krw.
1
Просто по очереди выпиливаешь на ручной маппинг? По методу за раз
Andrii Kurdiumov
7
Приветствую. А не подскажете какие ограничения есть на использования api метода setMyName ? Несколько раз сменил имя бота и получил бан на 2 месяца на смену имени.
Slick Slack
8
Привет, коллеги! Возникла задача ограничить максимальный размер вложений для определённых расширений, например, чтобы для изображений лимит был 10 МБ, а для видео — 100 МБ. Ог...
Andro
1
Всем привет! Взялся портировать модули на 18 версию, лезет _logger.log(log_level, 'no translation language detected, skipping translation %s', frame, stack_info=True) А чт...
Max Lit
3
Доброе утро, а кто то делал Google аналитику через php ? curl_setopt($ch, CURLOPT_NOSIGNAL, true); Это должно быть async без ожидания ответа. Вообще php нормально с таким с...
Max Dubovsky
9
Карта сайта