Запрос поиска по диапазону вызывает сборку мусора в эластичном поиске

У меня есть кластер Elastic Search 5.2 с 16 узлами (13 узлов данных / 3 мастера / 24 ГБ ОЗУ / 12 ГБ кучи). Я тестирую запрос на производительность и делаю 50 вызовов поискового запроса в секунду в эластичном кластере. Мой запрос выглядит следующим образом -

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "cust_id": "AC-90-464690064500"
                    }
                },
                {
                    "range": {
                        "yy_mo_no": {
                            "gt": 201701,
                            "lte": 201710
                        }
                    }
                }
            ]
        }
    }
}

Мое отображение индекса выглядит следующим образом:

cust_id      Keyword
smry_amt     Long
yy_mo_no     Integer    // doc_values enabled
mkt_id       Keyword
. . .
. . .
currency_cd  Keyword   // Total 10 field with 8 Keyword type

Индекс содержит 200 миллионов записей, и для каждого cust_id может быть 100 записей. Индекс имеет 2 реплики. Размер записи менее 100 байт.

Когда я запускаю тест производительности в течение 10 минут, ответ на запрос и производительность кажутся очень медленными. После более подробного изучения вкладки мониторинга Kibana, оказалось, что происходит много действий по сбору мусора (пожалуйста, см. Изображение ниже) -

Сборка мусора во время операции поиска по диапазону

У меня в голове затуманивается несколько вопросов. Я провел некоторое исследование по запросам диапазона, но не нашел подробностей о том, что может вызвать активность сборщика мусора в сценариях, подобных моему. Я также исследую использование памяти и активность сборщика мусора, но в большей части документации по Elastic говорится, что сборщик мусора молодого поколения является нормальным при индексировании, тогда как поисковая активность в основном использует кеш файловой системы, поддерживаемый ОС. Вот почему на приведенной выше диаграмме куча мало используется, так как поиск использовал кеш файловой системы.

So -

  1. Что могло вызвать здесь сборку мусора?
  2. Диаграмма показывает, что куча по-прежнему доступна для эластичного поиска, а используемая куча по-прежнему очень меньше по сравнению с доступной. Тогда что запускает сборщик мусора?
  3. Является ли тип запроса причиной создания какой-либо внутренней структуры данных, которая удаляется, вызывая сборку мусора?
  4. Пик загрузки ЦП может быть вызван активностью GC.
  5. Есть ли другой эффективный способ выполнения запроса Range в Elastic Search до версий 5.5?
  6. Профилирование запроса показывает, что Elastic выполняет TermQuery и BooleanQuery, причем последний из них стоит больше всего.

Есть идеи, что здесь происходит?

Заранее спасибо,

  • SGSI.

person sgsi    schedule 23.10.2017    source источник
comment
Я не думаю, что проблема связана с GC, согласно вашим диаграммам у вас было 4 коллекции за 1 минуту с общей продолжительностью около 100 мс. Не могли бы вы предоставить свою статистику ввода-вывода (чтение и запись диска)?   -  person Ivan Mamontov    schedule 24.10.2017


Ответы (1)


Правильный ответ зависит от настроек индекса, но я предполагаю, что вы используете целочисленный тип с включенными docValues. Эта структура данных должна поддерживать агрегирование и сортировку, но не запросы диапазона. Правильный тип данных - диапазон.

В случае, если DocValues ​​elastic / lucene выполняет итерацию по ВСЕМ документам (т.е. полное сканирование), чтобы соответствовать запросу диапазона - это требует чтения и декодирования каждого значения из столбца DV - эта операция довольно дорогостоящая, особенно когда индекс не может быть кэширован с помощью операционная система.

person Ivan Mamontov    schedule 23.10.2017
comment
Спасибо за ответ Иван. Была пара других проблем, и я должен сосредоточиться на другой высокоприоритетной, поэтому я задержался с ответом вам. Извинения. Данные в индексе представляют собой сводную информацию о ежемесячных счетах. Здесь пара вопросов: (1) Как я могу использовать тип данных диапазона для хранения данных за месяц? (2) Теперь, когда производительность поиска увеличилась вдвое после удвоения количества шардов (и переиндексации), следует ли мне отключить DocValues? Ожидается ли дальнейшее повышение скорости поиска? - person sgsi; 02.11.2017
comment
После удвоения количества шардов активность сборки мусора снизилась, загрузка ЦП уменьшилась вдвое, а скорость поиска почти удвоилась. Я не знаю, какова связь между количеством осколков (13 осколков на 13 узлах данных ранее против 26 осколков на 13 узлах данных) и активностью сборщика мусора, но именно так улучшилась скорость поиска. - person sgsi; 02.11.2017