#java #elasticsearch #cpu #cpu-usage
#java #elasticsearch #процессор #загрузка процессора
Вопрос:
У нас большая проблема с нашим ES-кластером. Один из наших узлов всегда использует процессор на 99%. По какой-то причине для elasticsearch
процесса выполняется примерно в 3 раза больше потоков по сравнению с обычным узлом. Я приложил 2 htop
скриншота для 2 узлов, один перегруженный, а другой обычный. Пожалуйста, посоветуйте!
Спасибо!
Перегруженный узел
Обычный узел
Обновить
-
Кластерная архитектура:
11 узлов, 2 выделенных мастера, 9 узлов данных.
-
Аппаратные свойства узлов
Мастера:
- Процессор: 8-кратный процессор Intel (R) Xeon (R) E5-1620 v2 с частотой 3,70 ГГц
- Объем памяти: 32 ГБ
- Диск: 120 ГБ
Подчиненные:
- Процессор: 12-кратный процессор Intel (R) Xeon (R) E5-1650 v2 с частотой 3,50 ГГц
- Объем памяти: 64 ГБ
- Диск: 2.7T
-
Документы в кластере:
~ 200 миллионов
-
Index conf:
Каждый индекс разделен на 10 сегментов (5 основных, 5 реплик)
-
Запросы:
Поиск RT:
~ 250/s
, Индексирование RT:~ 6K/s
-
ОС
Ubuntu 12.04.4 LTS
-
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 некоторую гибкость.