Настройки разрыва цепи
Elasticsearch содержит несколько разрывов цепи, используемых для предотвращения операций, использующих чрезмерное количество памяти. Каждый разрыв отслеживает используемую память определенными операциями и определяет предел того, сколько памяти он может отслеживать. Кроме того, существует разрыв на уровне родительского элемента, определяющий общее количество памяти, которое может отслеживаться во всех разрывах.
Когда разрыв цепи достигает своего предела, Elasticsearch отклонит дальнейшие операции. См. Ошибки разрыва цепи для получения информации об ошибках, возникающих из-за разрывов цепи.
Разрывы цепи не отслеживают все использование памяти в Elasticsearch и поэтому обеспечивают только неполную защиту от чрезмерного использования памяти. Если Elasticsearch использует слишком много памяти, это может привести к проблемам производительности, и узлы могут даже выйти из строя с ошибкой OutOfMemoryError. См. Высокое давление памяти JVM для устранения неполадок с высоким использованием кучи.
За исключением случаев, когда указано иное, эти настройки могут быть динамически обновлены в работающем кластере с помощью API cluster-update-settings.
Для получения информации об ошибках разрыва цепи см. Ошибки разрыва цепи.
Родительский разрыв цепи
Разрыв цепи на уровне родительского элемента можно настроить с помощью следующих настроек:
-
indices.breaker.total.use_real_memory - (Статический) Определяет, должен ли родительский разрыв учитывать фактическое использование памяти (
true) или только количество, резервируемое дочерними разрывами цепи (false). По умолчанию значениеtrue.
-
indices.breaker.total.limit - (Динамический) Начальный предел для общего родительского разрыва. По умолчанию составляет 70% кучи JVM, если
indices.breaker.total.use_real_memoryимеет значениеfalse. Еслиindices.breaker.total.use_real_memoryимеет значениеtrue, по умолчанию составляет 95% кучи JVM.
Разрыв цепи данных полей
Разрыв цепи данных полей оценивает объем памяти кучи, необходимый для загрузки поля в кэш данных полей. Если загрузка поля приведет к превышению предварительно заданного лимита памяти, разрыв цепи остановит операцию и вернет ошибку.
-
indices.breaker.fielddata.limit - (Динамический) Предел для разрыва цепи fielddata. По умолчанию составляет 40% кучи JVM.
-
indices.breaker.fielddata.overhead - (Динамический) Константа, на которую умножаются все оценки field data для определения окончательной оценки. По умолчанию
1.03.
Разрыв цепи запросов
Разрыв цепи запросов позволяет Elasticsearch предотвращать превышение определенного объема памяти структурами данных на запрос (например, памятью, используемой для расчета агрегаций во время запроса).
-
indices.breaker.request.limit - (Динамический) Предел для разрыва цепи запросов, по умолчанию 60% кучи JVM.
-
indices.breaker.request.overhead - (Динамический) Константа, на которую умножаются все оценки запросов для определения окончательной оценки. По умолчанию
1.
Разрыв цепи активных запросов
Разрыв цепи активных запросов позволяет Elasticsearch ограничивать использование памяти всеми активными входящими запросами на уровне транспорта или HTTP, предотвращая превышение определенного объема памяти на узле. Использование памяти основано на длине содержимого самого запроса. Этот разрыв цепи также учитывает, что память необходима не только для представления исходного запроса, но и в качестве структурированного объекта, что отражается в базовых накладных расходах.
-
network.breaker.inflight_requests.limit - (Динамический) Предел для разрыва цепи активных запросов, по умолчанию 100% кучи JVM. Это означает, что он ограничен пределом, настроенным для родительского разрыва цепи.
-
network.breaker.inflight_requests.overhead - (Динамический) Константа, на которую умножаются все оценки активных запросов для определения окончательной оценки. По умолчанию 2.
Разрыв цепи компиляции сценариев
Несколько отличаясь от предыдущих разрывов цепи, основанных на использовании памяти, разрыв цепи компиляции сценариев ограничивает количество компиляций сценариев inline в течение определенного периода времени.
См. раздел «предпочтение параметров» в документации по сценариям для получения дополнительной информации.
-
script.max_compilations_rate - (Динамический) Предел для количества уникальных динамических сценариев в определенном интервале, которые разрешено компилировать. По умолчанию
150/5m, что означает 150 каждые 5 минут.
Если кластер регулярно достигает указанного max_compilation_rate, возможно, кэш сценариев недостаточно велик. Используйте Статистику узлов, чтобы проверить количество недавних удалений из кэша, script.cache_evictions_history и компиляций script.compilations_history. Если наблюдается большое количество недавних удалений из кэша или компиляций, кэш сценариев может быть недостаточно большим. Удвойте размер кэша сценариев с помощью настройки script.cache.max_size.
Разрыв цепи регулярных выражений
Неправильно написанные регулярные выражения могут ухудшить стабильность и производительность кластера. Разрыв цепи регулярных выражений ограничивает использование и сложность регулярных выражений в сценариях Painless.
-
script.painless.regex.enabled -
(Статический) Включает регулярные выражения в сценариях Painless. Принимает:
-
limited(По умолчанию) - Включает регулярные выражения, но ограничивает сложность с помощью настройки кластера
script.painless.regex.limit-factor. -
true - Включает регулярные выражения без ограничений сложности. Отключает разрыв цепи регулярных выражений.
-
false - Отключает регулярные выражения. Любой сценарий Painless, содержащий регулярное выражение, вернет ошибку.
-
-
script.painless.regex.limit-factor -
(Статический) Ограничивает количество символов, которые может рассматривать регулярное выражение в сценарии Painless. Elasticsearch вычисляет этот предел, умножая значение настройки на длину входных данных сценария.
Например, вход
foobarbazимеет длину9. Еслиscript.painless.regex.limit-factorравно6, регулярное выражение вfoobarbazможет рассматривать до 54 (9 * 6) символов. Если выражение превышает этот предел, это вызывает разрыв цепи регулярных выражений и возвращает ошибку.Elasticsearch применяет это ограничение только в том случае, если
script.painless.regex.enabledимеет значениеlimited.
Разрыв цепи EQL
При выполнении запроса последовательности узел, обрабатывающий запрос, должен хранить некоторые структуры в памяти, необходимые алгоритму сопоставления последовательностей. Когда для обработки требуется большой объем данных и/или пользователь запрашивает большое количество совпавших последовательностей (устанавливая параметр запроса size), память, занимаемая этими структурами, может потенциально превысить доступную память JVM. Это приведет к исключению OutOfMemory, которое выведет узел из строя.
Для предотвращения этого используется специальный разрыв цепи, который ограничивает выделение памяти при выполнении запроса последовательности. При срабатывании разрыва цепи выбрасывается исключение org.elasticsearch.common.breaker.CircuitBreakingException, и пользователю возвращается описательное сообщение об ошибке, включающее circuit_breaking_exception.
Этот разрыв цепи можно настроить с помощью следующих параметров:
-
breaker.eql_sequence.limit - (Динамически) Предел для автоматического выключателя, используемого для ограничения использования памяти во время выполнения запроса последовательности EQL. Это значение определяется как процент кучи JVM. По умолчанию
50%. Если родительский автоматический выключатель установлен на значение меньше50%, это значение используется в качестве значения по умолчанию. -
breaker.eql_sequence.overhead - (Динамически) Постоянная величина, на которую умножаются оценки памяти запросов последовательности для определения окончательной оценки. По умолчанию
1. -
breaker.eql_sequence.type -
(Статически) Тип автоматического выключателя. Допустимые значения:
-
memory(По умолчанию) - Выключатель ограничивает использование памяти для запросов последовательности EQL.
-
noop - Отключает выключатель.
-
Автоматический выключатель машинного обучения
-
breaker.model_inference.limit - (Динамически) Предел для автоматического выключателя обученной модели. Это значение определяется как процент кучи JVM. По умолчанию
50%. Если родительский автоматический выключатель установлен на значение меньше50%, это значение используется в качестве значения по умолчанию. -
breaker.model_inference.overhead - (Динамически) Постоянная величина, на которую умножаются все оценки обученных моделей для определения окончательной оценки. См. Настройки автоматического выключателя. По умолчанию
1. -
breaker.model_inference.type - (Статически) Базовый тип автоматического выключателя. Существует две допустимые опции:
noopиmemory.noopозначает, что автоматический выключатель ничего не делает для предотвращения чрезмерного использования памяти.memoryозначает, что автоматический выключатель отслеживает память, используемую обученными моделями, и может потенциально прервать и предотвратитьOutOfMemoryошибки. Значение по умолчаниюmemory.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/circuit-breaker.html