Почему IndexOrDocValuesQuery занимает так много времени? - PullRequest
0 голосов
/ 13 января 2019

Я использую 5-узловый кластер эластичного поиска с индексом ~ 120 ГБ.

У нас проблемы с медленными запросами, которые имеют несколько фильтров. После профилирования наших запросов я вижу, что IndexOrDocValuesQuery занимает около 3,2 секунды каждый. Каждый запрос имеет около 4 или 5 из этих шагов, которые занимают 20 секунд. Что странно, так это то, что TermQuery, который, как мне кажется, намного дороже, занимает 64 мс.

Куда нам обращаться, чтобы получить больше информации о том, что может замедлить эти запросы?

Elasticsearch V5.5, я думаю, что есть около 280 миллионов документов, но 40 миллионов первичных документов (без вложенных)

Характеристики узла: 4 процессора 26 ГБ ОЗУ Куча 12 ГБ

5 узлов данных, 2 мастера, 2 клиента. Мастера и клиенты имеют гораздо меньшую скорость, чем узлы.

Вот запрос: https://gist.github.com/wakawaka54/d4cad864d858efc41a0b2806ea0041b4 1

Вот результат профиля запроса: https://gist.github.com/wakawaka54/6b52fd0eef2b8ead1589241e65c239fe

Вот отображение индекса: https://gist.github.com/wakawaka54/417602c8f73a613830904b20398b7bac

1 Ответ

0 голосов
/ 13 января 2019

Сначала о термин запроса против любых других запросов. Срочные запросы являются самыми быстрыми, потому что они требуют только поиска по срокам и получения всех совпадающих идентификаторов документов. Это тривиальная операция, и она использует словарь терминов, где эта информация берется так же быстро, как и поиск ключа.

Конечно, фильтр дальнего радиуса будет намного медленнее, даже если вы включите DocValues ​​(по умолчанию), он все равно будет медленнее.

Я не вижу, чтобы ваш numberSort был вложенного типа. Не уверен, что это ускорит поиск, но стоит попробовать, так как вы хотите, чтобы он был вложенным, я думаю.

Что можно сделать для ускорения запросов:

  • Вы уже выбрали эти диапазоны запросов в качестве фильтров, которые должны кэшировать их, чтобы впоследствии их можно было эффективно использовать повторно (поэтому, я надеюсь, вы измеряете числа после потепления до)

  • Из размера вашего индекса ясно, что если вы поделите 120 Гб индекса на 5 узлов, вы получите около 24 Гб на узел данных. Однако объем вашей оперативной памяти составляет всего 26 ГБ , что недостаточно для mmap всех файлов индексов, которые должны быть расположены в памяти (у вас есть только 26 - 12 = 14 ГБ оперативной памяти для mmap). Эта ситуация потребует загрузки / выгрузки файлов с диска в память, что создаст много операций ввода-вывода (думаю, вы могли бы доказать это, измерив это). Я бы предложил увеличить объем оперативной памяти, чтобы ее было достаточно для получения всех файлов индексов на этом узле. Это обычно сильно ускоряется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...