OpenSearch CircuitBreakerException: Как работать с автоматическими выключателями

50% памяти на узле OpenSearch обычно используется для кучи JVM (Java Virtual Machine), а другая половина памяти используется для других нужд, например, для кэша.

Для предотвращения ошибок типа "Out of Memory" (OOM) в OpenSearch реализованы автоматические выключатели. Если определенный запрос может привести к ошибкам в узле из-за проблем с памятью, OpenSearch выбросит исключение "CircuitBreakerException" и отклонит запрос вместо того, чтобы рисковать отказом всего узла.

OpenSearch logo

Исключение автоматического выключателя - это обычно исключение, которое выбрасывается для того, чтобы предупредить нас о чем-то еще, что необходимо исправить для уменьшения использования памяти. Как правило, автоматические выключатели имеют разумные значения по умолчанию. Простое увеличение предела разрыва цепи, скорее всего, увеличит риск того, что ваш узел разрушится из-за OutOfMemoryError.

Если вы получили исключение, связанное с разрывом цепи, необходимо проверить, какого типа этот выключатель, а затем просмотреть данные мониторинга и журналы OpenSearch, чтобы определить причину ошибки. Помните, что событие или запрос, появившийся в журнале, может быть просто "соломинкой, переломившей спину верблюда". Могут существовать и другие причины высокого потребления памяти, а событие в журнале - лишь последняя, которая вывела OpenSearch за пределы допустимого. Возможные причины обсуждаются в каждом разделе ниже.

Выяснение текущего состояния автоматического выключателя

Получение текущих настроек

Узнать текущее использование памяти и состояние выключателей

В результате будет получена полезная информация следующего вида

Прерыватель Fielddata

  • indices.breaker.fielddata.limit (по умолчанию=40% кучи JVM)
  • indices.breaker.fielddata.overhead (по умолчанию=1.03)

Лимит задается как доля от кучи JVM, заданной в jvm.options, а параметр "накладные расходы" - это фиксированный коэффициент, который OpenSearch использует для умножения теоретических вычислений для оценки потребности в памяти автоматического выключателя.

Fielddata circuit breaker - это ограничение на общий объем памяти, используемый fielddata в ваших индексах. По умолчанию для текстовых полей Fielddata имеет значение false, но может использоваться, если вы определили его в одном из своих маппингов:

В общем случае рекомендуется избегать этой настройки из-за большого объема памяти, необходимого для размещения в памяти отдельных текстовых значений. По возможности следует изменить маппинг на false, а для агрегации и сортировки использовать не текстовые, а ключевые типы.

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

Прерыватель запросов

  • indices.breaker.request.limit(default=60% кучи JVM)
  • indices.breaker.request.overhead(default=1)

Лимит задается как доля от кучи JVM, установленная в jvm.options, а параметр "overhead" - это фиксированный коэффициент, который OpenSearch использует для умножения теоретических вычислений для оценки требуемой памяти автоматического выключателя.

Автоматический выключатель запроса учитывает объем памяти, необходимый для работы со структурами запроса, в частности, с агрегатами. Наиболее частой причиной превышения этого показателя является использование агрегатов с большим значением размера. Попробуйте уменьшить значение "size" в своих агрегатах.

Прерыватель цепи запросов

  • network.breaker.inflight_requests.limit (по умолчанию=100% кучи JVM)
  • network.breaker.inflight_requests.overhead (по умолчанию=2)

Лимит задается как доля от кучи JVM, заданной в jvm.options, а параметр "overhead" - это фиксированный коэффициент, который OpenSearch использует для умножения теоретических расчетов для оценки потребности в памяти автоматического выключателя.

Автоматический выключатель запросов в полете учитывает размер активных транспортных и http-запросов к узлу, основываясь на размере байтов этих запросов. Как правило, этот автоматический выключатель срабатывает при слишком больших размерах пакетов массовых запросов. Попробуйте уменьшить размер массовых запросов, особенно если они содержат большие документы.

Автоматический выключатель компиляции скриптов

Автоматический выключатель компиляции скриптов несколько отличается от остальных. Вместо ограничения по памяти он ограничивает количество раз, которое может быть скомпилировано скриптом за определенный период времени. Если вы получаете это предупреждение, то вам следует использовать хранимые скрипты с параметрами, а не встроенные, так как первые компилируются только один раз, а вторые - при каждом выполнении.

Родительские автоматические выключатели

  • indices.breaker.total.use_real_memory default=true
  • indices.breaker.total.limit default=95% кучи JVM

Исключения родительских выключателей вызываются суммой всей памяти, используемой различными типами выключателей. Если оставить значение use_real_memory по умолчанию, то родительский выключатель будет учитывать использование реальной памяти и основываться на 95% от размера кучи JVM.

В общем случае лучше основывать эту схему на реальном использовании памяти, так как это дает более точное представление о том, что происходит в экземпляре. С другой стороны, если установить значение "use_real_memory" в false, то ограничение будет основано на сумме оценок других автоматических выключателей, и тогда ограничение по умолчанию будет уменьшено до 70% от размера кучи JVM, чтобы учесть погрешность при использовании суммы оценок.

Автоматические выключатели учета

indices.breaker.accounting.limit default= 100% кучи JVM

indices.breaker.accounting.overhead default=1

Этот автоматический выключатель предназначен для защиты узла от перерасхода памяти из-за вещей, которые остаются в памяти после завершения запроса, например, сегменты lucene до их стирания на диск. Однако по умолчанию ограничение установлено на уровне 100% кучи JVM, поэтому родительский автоматический выключатель сработает раньше, чем это ограничение вступит в силу. Настройка накладных расходов представляет собой коэффициент, на который умножаются все оценки перед применением ограничения.

Настройка автоматических выключателей

В целом, как уже было сказано выше, обычно не рекомендуется изменять автоматические выключатели по сравнению с их значениями по умолчанию, поскольку гораздо хуже потерять узел из-за ошибки OutOfMemoryError, чем пропустить несколько запросов. Вместо этого следует попытаться понять, почему происходит превышение, и предотвратить это.

Также следует помнить, что расчеты по умолчанию основаны на размере кучи JVM, который обычно принимается равным 50% от общего доступного размера. Если это не так, то, возможно, стоит пересмотреть настройки JVM в jvm.options, прежде чем перестраивать все остальное. Однако если вы все же считаете, что вам необходимо изменить параметры выключателей (или восстановить значения по умолчанию), вы можете настроить параметры выключателей так же, как и любые другие параметры кластера

Или восстановить настройки по умолчанию

Понравилась статья? Поделиться с друзьями:
Добавить комментарий