РезюмеКак улучшить производительность перколятора в ElasticSearch?
Нам необходимо увеличить производительность перколятора (пропускную способность).
Скорее всего, подход масштабируется на несколько серверов.
Вопросы
Как сделать масштабирование верно?
1) Увеличилось бы количество осколков в базовом индексе, позволяя параллельно запускать запросы на перколяцию?
2) Сколько памяти требуется ElasticSearch серверу, если он выполняет перколяцию?
Лучше иметь 2 сервера с 4 ГБ оперативной памяти или один сервер с 16 ГБ оперативной памяти?
3) Имеет ли SSD значительную помощь в производительности перколятора, или лучше увеличить ОЗУ и/или количество узлов?
Наша текущая ситуация
У нас есть 200000 запросов (поиск работы предупреждений) в индексе работы. Мы можем запускать 4 параллельные очереди, которые вызывают перколятор. Каждый запрос может просачиваться партию 50 рабочих мест в течение примерно 35 секунд, так что мы можем просачиваются о:
4 очереди * 50 заданий в пакетном/35 секунд * 60 секунд в минуту = 343 рабочих мест в минуту
Нам нужно больше.
Наш индекс рабочих мест имеет 4 осколка, и мы используем .percolator, сидящий над этим индексом рабочих мест.
Оборудование: 2 сервера процессоров с 32 ядрами. 32 ГБ оперативной памяти. Мы выделили 8 ГБ оперативной памяти для ElasticSearch.
Когда перколятор работает, 4 очереди перколяции, о которых я упоминал выше, потребляют около 50% процессора.
Когда мы попытались увеличить количество параллельных перколяционных очередей с 4 до 6, загрузка процессора подскочила до 75% +. Что еще хуже, перколатор начал обваливаться с NoShardAvailableActionException:
[2015-03-04 09: 46: 22,221] [DEBUG] [action.percolate] [Клетус Kasady] [Новости] [3] осколок мульти отказ перколит org.elasticsearch.action.NoShardAvailableActionException: [работа] [3] нуля
Этой ошибка, кажется, предполагает, что мы должны увеличить количество черепков и в конечном счете добавить выделенный сервер ElasticSearch (+ позже увеличить число узлы).
Похожие: How to Optimize elasticsearch percolator index Memory Performance
Ваш совет соответствует нашим наблюдениям за последние пару месяцев экспериментов с кластером ElasticSearch. На самом деле мы можем запускать запросы на 200 Кбайт на узлах памяти 2 ГБ. Как запросы 200K-перколяторов преобразуются в 50MB-индекс и как 50MB-индекс преобразуется в 500-мегабайтную кучную память? –
@DennisGorelik Пожалуйста, см. Мое редактирование ... – richardpj
Спасибо за обновление. Увеличение в 10 раз в памяти неожиданно, учитывая: «http://stackoverflow.com/questions/7146559/serialized-object-size-vs-in-memory-object-size-in-java Размер в памяти будет обычно между половиной и вдвое сериализуемым размером ». –