Изоляцию больших запросов можно настроить для управления запросами, которые используют много памяти или занимают слишком много времени для выполнения. Это помогает повысить стабильность кластеров Elasticsearch и предотвратить исключения out-of-memory (OOM).
По мере роста бизнеса ваши кластеры Elasticsearch могут столкнуться с растущей нагрузкой запросов. Некоторые сложные запросы могут занимать чрезмерную память узла, вызывая частую сборку мусора или даже исключения OOM, что может ухудшить производительность и стабильность кластера. Изоляция больших запросов обеспечивает эффективное управление запросами, требующими много памяти и длительного времени выполнения, обеспечивая стабильность кластера. Изоляция больших запросов включает следующее:
Только Elasticsearch 7.6.2 и 7.10.2 поддерживают large query isolation, которая включена по умолчанию. Глобальный тайм‑аут отключён по умолчанию для large query isolation. При необходимости вы можете включить и настроить её через API. Любое изменение вступает в силу немедленно.
Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этой теме в качестве примера используется Kibana для описания процедур выполнения.
Левая часть консоли представляет собой поле ввода команд, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.
large query isolation помещает крупные запросы в изолированный пул, где они могут быть отменены на основе предустановленных порогов памяти или длительности. large query isolation включена по умолчанию. При необходимости вы можете изменить эту настройку. Любое изменение вступает в силу немедленно.
PUT _cluster/settings{"persistent": {"search.isolator.enabled": true}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
search.isolator.enabled | Boolean | true | Определяет, включить ли изоляцию больших запросов. При включении большие запросы управляются отдельно от остальных обычных запросов. Значение может быть:
|
PUT _cluster/settings{"persistent": {"search.isolator.memory.task.limit": "50MB","search.isolator.time.management": "10s"}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
search.isolator.memory.task.limit | String | 50MB | Порог памяти для больших запросов: когда запрос запрашивает больше памяти, чем указано в этом пороге, он помещается в изолирующий пул. Формат значения: число + единица измерения
Минимальное значение: 0 (все запросы помещаются в изолирующий пул) Максимальное значение: максимальная память кучи узла Снижение этого значения приведёт к тому, что больше запросов будет помещаться в изолирующий пул, что увеличит его использование памяти. Если вы всё же снижаете это значение, также следует увеличить значения search.isolator.memory.pool.limit и search.isolator.count.limit, чтобы изолирующий пул мог удерживать больше запросов. Это помогает избежать срабатывания механизма автоматического отключения из‑за исчерпания ресурсов (например, частой отмены запросов). |
search.isolator.time.management | String | 10s | Порог длительности выполнения больших запросов: когда запрос длится дольше, чем указано в этом пороге, он помещается в изолирующий пул. Формат значения: число + единица измерения
Минимальное значение: 0 (все запросы помещаются в изолирующий пул) Снижение этого значения приведёт к тому, что больше запросов будет помещаться в изолирующий пул, что увеличит использование памяти. Если вы всё же снижаете это значение, вам также следует увеличить значения search.isolator.memory.pool.limit и search.isolator.count.limit, чтобы изолирующий пул мог удерживать больше запросов. Это помогает избежать срабатывания механизма предохранителя из‑за исчерпания ресурсов (например, частая отмена запросов). |
PUT _cluster/settings{"persistent": {"search.isolator.memory.pool.limit": "50%","search.isolator.count.limit": 1000,"search.isolator.memory.heap.limit": "90%"}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
search.isolator.memory.pool.limit | String | 50% | Максимальное использование памяти изолирующего пула в процентах от максимальной кучи памяти узла. Когда суммарное использование памяти крупными запросами в изолирующем пуле превышает этот предел, система отменяет один из крупных запросов в изолирующем пуле на основе предопределённой политики, чтобы освободить ресурсы и предотвратить переполнение памяти. Диапазон значений: 0.0–100.0% Если ваш кластер в основном обрабатывает крупные запросы (высокое использование памяти или длительное время выполнения), увеличьте это значение. При этом настройте search.isolator.memory.task.limit и search.isolator.time.management соответственно, чтобы контролировать количество запросов, помещаемых в изолирующий пул. |
search.isolator.count.limit | Integer | 1000 | Максимальное количество больших запросов, разрешённых в изоляционном пуле. Когда достигается этот предел, в изоляционный пул больше нельзя добавить запросы, что предотвращает истощение ресурсов. Диапазон значений: 10–50000 Если ваш кластер в основном обрабатывает большие запросы (высокое потребление памяти или длительное время выполнения), увеличьте это значение. При этом установите search.isolator.memory.task.limit и search.isolator.time.management соответственно, чтобы контролировать количество запросов, помещаемых в изоляционный пул. |
search.isolator.memory.heap.limit | String | 90% | Использование кучи памяти узла, которое инициирует отмену больших запросов в изоляционном пуле. Когда достигается этот порог, система отменяет один из больших запросов в изоляционном пуле в соответствии с предопределённой политикой, чтобы освободить ресурсы и предотвратить переполнение памяти. Диапазон значений: 0.0–100.0% Когда indices.breaker.total.use_real_memory включён, это значение должно быть меньше, чем indices.breaker.total.limit. В противном случае нативный circuit breaker Elasticsearch будет срабатывать первым. Подробности см. в Circuit breaker settings. Если вы ожидаете пиковый трафик или всплески нагрузки, вы можете уменьшить это значение, чтобы circuit breaker изоляционного пула срабатывал раньше, тем самым предотвращая перегрузку кучи памяти. |
PUT _cluster/settings{"persistent": {"search.isolator.strategy": "fair","search.isolator.strategy.ratio": "0.5%"}}
Параметр | Тип | Default Value | Description |
|---|---|---|---|
search.isolator.strategy | String | fair | Политика определения, какой запрос отменять, когда инициируется отмена запроса.
Пул изоляции крупных запросов проверяется каждую секунду, пока использование кучи памяти не окажется в безопасном диапазоне. |
search.isolator.strategy.ratio | String | 1% | Порог справедливой политики. Это отношение разницы в использовании памяти между двумя кандидатами запросов в пуле изоляции к максимальному объёму кучи узла.
Этот параметр действителен только когда search.isolator.strategy установлен в fair. Диапазон значений: 0.0–100.0% Рекомендуется использовать значение по умолчанию. Изменяйте только при необходимости и с осторожностью. |
PUT _cluster/settings{"persistent": {"search.isolator.log.count": "100"}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
search.isolator.log.count | Целое число | 100 | Максимальное количество отменённых записей запросов, сохраняемых в журнале изоляции больших запросов. Журнал изоляции больших запросов фиксирует отменённые крупные запросы для анализа и оптимизации производительности запросов. После превышения этого предела система автоматически удаляет самые старые записи, чтобы контролировать объём памяти журнала. Диапазон значений: 0–5000 Установка этого значения в 0 отключает журнал изоляции больших запросов. |
Вы можете использовать следующие API для запроса информации журнала о отменённых запросах:
GET /_isolator_metrics
GET /_isolator_metrics/{nodeId}
GET /_isolator_metrics?detailed
GET /_isolator_metrics/{nodeId}?detailed
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
node_id | String | N/A | Указывает один или несколько узлов кластера.
Вы можете выполнить следующую команду для получения идентификаторов узлов: |
Пример ответа:
{"_nodes": {"total": 1,"successful": 1,"failed": 0},"cluster_name": "test","nodes": {"CTqrZFXWTzmLonSZyNMKkQ": {"name": "test-ess-esn-1-1","host": "172.16.101.116","total_cancel": 0, //Total number of cancelled queries"isolator_cancel": 0, //Number of queries cancelled because isolation pool thresholds were exceeded"out_of_time_cancel": 0 //Number of queries cancelled due to timeout}}}
Когда глобальный тайм‑аут запросов настроен, запросы, превышающие указанную продолжительность, автоматически отменяются, и возвращается сообщение "cancel cause by global time limit". Это предотвращает потребление избыточных ресурсов длительными запросами. Глобальный тайм‑аут запросов отключен по умолчанию. При необходимости вы можете изменить эту настройку. Любое изменение вступает в силу немедленно.
Выполните следующую команду, чтобы включить и настроить глобальный тайм‑аут запросов:
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
search.isolator.time.enabled | Boolean | false | Определяет, включён ли глобальный тайм‑аут запросов. При включении запросы автоматически отменяются, если их продолжительность превышает предопределённый тайм‑аут. Значение может быть:
|
search.isolator.time.limit | String | 120s | Значение глобального тайм‑аута запроса. Формат значения: number + unit
Минимальное значение: 0 (чтобы отменить все запросы) |