Elasticsearch слишком много запущенных потоков

#java #elasticsearch #cpu #cpu-usage

#java #elasticsearch #процессор #загрузка процессора

Вопрос:

У нас большая проблема с нашим ES-кластером. Один из наших узлов всегда использует процессор на 99%. По какой-то причине для elasticsearch процесса выполняется примерно в 3 раза больше потоков по сравнению с обычным узлом. Я приложил 2 htop скриншота для 2 узлов, один перегруженный, а другой обычный. Пожалуйста, посоветуйте!

Спасибо!

Перегруженный узел перегруженный узел

Обычный узел обычный узел

Обновить

  1. Кластерная архитектура:

    11 узлов, 2 выделенных мастера, 9 узлов данных.

  2. Аппаратные свойства узлов

    Мастера:

    • Процессор: 8-кратный процессор Intel (R) Xeon (R) E5-1620 v2 с частотой 3,70 ГГц
    • Объем памяти: 32 ГБ
    • Диск: 120 ГБ

    Подчиненные:

    1. Процессор: 12-кратный процессор Intel (R) Xeon (R) E5-1650 v2 с частотой 3,50 ГГц
    2. Объем памяти: 64 ГБ
    3. Диск: 2.7T
  3. Документы в кластере:

    ~ 200 миллионов

  4. Index conf:

    Каждый индекс разделен на 10 сегментов (5 основных, 5 реплик)

  5. Запросы:

    Поиск RT: ~ 250/s , Индексирование RT: ~ 6K/s

  6. ОС

    Ubuntu 12.04.4 LTS

  7. JAVA

 java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
  

Комментарии:

1. Боюсь, ваши снимки экрана сами по себе не очень полезны. Я бы добавил следующее: количество узлов в кластере, память, процессор и диск для каждого узла, количество документов в кластере, общие конфигурации кластера и индекса, сопоставления, объем запросов, объем вставки, выходные данные диагностики ES, такие как статистика узла, операционная система, версия jvm.

2. @JohnPetrone Я опубликовал обновление с необходимой информацией. Спасибо!

Ответ №1:

Разобрался.

[2014-07-07 13:38:42,521][DEBUG][index.search.slowlog.query] [n013.my_cluster] [my_index][3] took[2s], took_millis[2066], types[my_type], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"size":20,"from":0,"sort":{"_score":"desc"},"query":{"filtered":{"query":{"query_string":{"query":"my eight words space separated query","fields":["description","tags"],"default_operator":"OR"}},"filter":{"and":[{"range":{"ats":{"lte":1404730800}}},{"terms":{"aid":[1,2,4]}}]},"_cache":false}}}], extra_source[]

Проблема заключалась внутри "filter": {"and": ...} , похоже, что такого рода запросы тяжелее для ES по сравнению с bool запросами типа. Поэтому всякий раз, когда вы хотите применить некоторые filters , пожалуйста, используйте bool фильтры ( must , must_not и should )

Ссылка:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html

Приветствия!

Ответ №2:

Основываясь на имеющейся скудной информации, у меня есть пара предположений, которые потенциально могут быть проблемой:

  • Сегменты не очень хорошо сбалансированы, и у вас возникают горячие точки. Убедитесь, что ваши наиболее часто используемые индексы распределены таким образом, чтобы каждая машина могла выполнять свою долю работы. Кроме того, загляните на уровень индекса «index.routing.allocation.total_shards_per_node», чтобы попытаться установить равный баланс.

  • Возможно, на стороне поиска вы указываете, что поиск всегда должен идти к «основному» сегменту. Первичное обозначение — это не то, что уравновешивает, поэтому, по сути, первый узел имеет первичный сегмент, а все остальные, которые появляются после, являются вторичными.

Комментарии:

1. Спасибо за ответ. У нас действительно была горячая точка, связанная с тем, что у нас было 9 узлов данных с 10 shards для каждого индекса, поэтому всегда был узел, который занимал бы 2 фрагмента. В целях тестирования мы также изменили наш вторичный мастер на узел данных и перенесли перераспределенные сегменты — к сожалению, без изменений. Что касается поисковых запросов, у нас есть конфигурация по умолчанию, поэтому запрашиваются реплики.

2. Попробуйте установить: «index.routing.allocation.total_shards_per_node» равным 1 для каждого индекса, что должно привести к равному балансу, предполагающему 10 datanodes и 10 сегментов (включая реплики) для каждого индекса. Примечание: ЭТО ДОЛЖНО БЫТЬ СДЕЛАНО ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ. В долгосрочной перспективе вам, вероятно, лучше использовать больше сегментов для каждого индекса, что придаст вашему total_shards_per_node некоторую гибкость.