Облачная платформаAdvanced

Настройка изоляции больших запросов

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Изоляцию больших запросов можно настроить для управления запросами, которые используют много памяти или занимают слишком много времени для выполнения. Это помогает повысить стабильность кластеров Elasticsearch и предотвратить исключения out-of-memory (OOM).

По мере роста бизнеса ваши кластеры Elasticsearch могут столкнуться с растущей нагрузкой запросов. Некоторые сложные запросы могут занимать чрезмерную память узла, вызывая частую сборку мусора или даже исключения OOM, что может ухудшить производительность и стабильность кластера. Изоляция больших запросов обеспечивает эффективное управление запросами, требующими много памяти и длительного времени выполнения, обеспечивая стабильность кластера. Изоляция больших запросов включает следующее:

  • Изоляция больших запросов: Управляет запросами, требующими много памяти/длительного времени выполнения, отдельно, чтобы не влиять на другие запросы.
  • Отмена запросов на основе порога использования heap memory: Отменяет большой запрос в пуле изоляции, когда использование heap memory узла достигает заданного порога.
  • Глобальный тайм‑аут запросов: Автоматически отменяет запросы, которые выполняются дольше заданного тайм‑аута. Этот тайм‑аут применяется глобально.

Как работает функция

  • Определение больших запросов:
    • Система проверяет использование памяти всеми текущими запросами и помечает запросы, превышающие заданный порог использования памяти, как большие запросы.
    • Система периодически проверяет длительность выполнения всех текущих запросов и помечает запросы, превышающие заданный порог длительности, как большие запросы.
  • Политики отмены запросов:
    • fair: Определяет, какой запрос отменить, учитывая как использование памяти, так и длительность выполнения.
    • mem-first: Отменяет запрос с наибольшим использованием памяти.
    • time-first: Отменяет запрос, который выполняется дольше всего.
  • Native cancel API: Можно использовать native cancel API Elasticsearch для отмены задач, обеспечивая совместимость.

Ограничения

Только Elasticsearch 7.6.2 и 7.10.2 поддерживают large query isolation, которая включена по умолчанию. Глобальный тайм‑аут отключён по умолчанию для large query isolation. При необходимости вы можете включить и настроить её через API. Любое изменение вступает в силу немедленно.

Вход в Kibana

Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этой теме в качестве примера используется Kibana для описания процедур выполнения.

  1. Войдите в консоль управления CSS.
  2. В панели навигации слева выберите Clusters > Elasticsearch.
  3. В списке кластеров найдите целевой кластер и нажмите Kibana в столбце Operation, чтобы войти в консоль Kibana.
  4. В левой панели навигации выберите Dev Tools.

    Левая часть консоли представляет собой поле ввода команд, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.

Настройка large query isolation

large query isolation помещает крупные запросы в изолированный пул, где они могут быть отменены на основе предустановленных порогов памяти или длительности. large query isolation включена по умолчанию. При необходимости вы можете изменить эту настройку. Любое изменение вступает в силу немедленно.

  1. Выполните следующую команду, чтобы включить или отключить large query isolation:
    PUT _cluster/settings
    {
    "persistent": {
    "search.isolator.enabled": true
    }
    }
    Table 1 Настройка large query isolation

    Параметр

    Тип

    Значение по умолчанию

    Описание

    search.isolator.enabled

    Boolean

    true

    Определяет, включить ли изоляцию больших запросов. При включении большие запросы управляются отдельно от остальных обычных запросов.

    Значение может быть:

    • true: Включить изоляцию больших запросов.
    • false: Отключить изоляцию больших запросов.
  2. Выполните следующие команды для настройки пороговых значений, определяющих большие запросы:
    PUT _cluster/settings
    {
    "persistent": {
    "search.isolator.memory.task.limit": "50MB",
    "search.isolator.time.management": "10s"
    }
    }
    Table 2 Параметры настройки пороговых значений изоляции больших запросов

    Параметр

    Тип

    Значение по умолчанию

    Описание

    search.isolator.memory.task.limit

    String

    50MB

    Порог памяти для больших запросов: когда запрос запрашивает больше памяти, чем указано в этом пороге, он помещается в изолирующий пул.

    Формат значения: число + единица измерения

    • Число: натуральное число
    • Единица: B, K, KB, M, MB, G, GB, T, TB, P или PB (без учёта регистра)

    Минимальное значение: 0 (все запросы помещаются в изолирующий пул)

    Максимальное значение: максимальная память кучи узла

    Снижение этого значения приведёт к тому, что больше запросов будет помещаться в изолирующий пул, что увеличит его использование памяти. Если вы всё же снижаете это значение, также следует увеличить значения search.isolator.memory.pool.limit и search.isolator.count.limit, чтобы изолирующий пул мог удерживать больше запросов. Это помогает избежать срабатывания механизма автоматического отключения из‑за исчерпания ресурсов (например, частой отмены запросов).

    search.isolator.time.management

    String

    10s

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

    Формат значения: число + единица измерения

    • Номер: натуральное число
    • Единица: nanos (nanosecond), micros (microsecond), ms (millisecond), s (second), m (minute), h (hour), or d (day)

    Минимальное значение: 0 (все запросы помещаются в изолирующий пул)

    Снижение этого значения приведёт к тому, что больше запросов будет помещаться в изолирующий пул, что увеличит использование памяти. Если вы всё же снижаете это значение, вам также следует увеличить значения search.isolator.memory.pool.limit и search.isolator.count.limit, чтобы изолирующий пул мог удерживать больше запросов. Это помогает избежать срабатывания механизма предохранителя из‑за исчерпания ресурсов (например, частая отмена запросов).

  3. Настройте пороги использования ресурсов изолирующего пула для инициирования отмены запросов.
    PUT _cluster/settings
    {
    "persistent": {
    "search.isolator.memory.pool.limit": "50%",
    "search.isolator.count.limit": 1000,
    "search.isolator.memory.heap.limit": "90%"
    }
    }
    Table 3 Параметры настройки порогов отмены запросов

    Параметр

    Тип

    Значение по умолчанию

    Описание

    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

    Максимальное количество больших запросов, разрешённых в изоляционном пуле. Когда достигается этот предел, в изоляционный пул больше нельзя добавить запросы, что предотвращает истощение ресурсов.

    Диапазон значений: 1050000

    Если ваш кластер в основном обрабатывает большие запросы (высокое потребление памяти или длительное время выполнения), увеличьте это значение. При этом установите 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 изоляционного пула срабатывал раньше, тем самым предотвращая перегрузку кучи памяти.

  4. Выполните следующую команду, чтобы задать политику отмены запросов:
    PUT _cluster/settings
    {
    "persistent": {
    "search.isolator.strategy": "fair",
    "search.isolator.strategy.ratio": "0.5%"
    }
    }
    Table 4 Параметры настройки политики отмены запросов

    Параметр

    Тип

    Default Value

    Description

    search.isolator.strategy

    String

    fair

    Политика определения, какой запрос отменять, когда инициируется отмена запроса.

    • fair (default): Определите, какой запрос отменять, учитывая как использование памяти, так и длительность выполнения. Если разница в использовании памяти между двумя кандидатами запросов ≤ maximum Elasticsearch heap memory x fair policy threshold, будет отменён запрос с более длительным временем выполнения; наоборот, если разница превышает это значение, будет отменён запрос, потребляющий больше памяти. Maximum Elasticsearch heap memory = min(31, total node memory/2) (GB).
    • mem-first: Отменяет запрос, использующий наибольшее количество памяти.
    • time-first: Отменяет запрос, который длится дольше всего.

    Пул изоляции крупных запросов проверяется каждую секунду, пока использование кучи памяти не окажется в безопасном диапазоне.

    search.isolator.strategy.ratio

    String

    1%

    Порог справедливой политики. Это отношение разницы в использовании памяти между двумя кандидатами запросов в пуле изоляции к максимальному объёму кучи узла.

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

    Этот параметр действителен только когда search.isolator.strategy установлен в fair.

    Диапазон значений: 0.0–100.0%

    Рекомендуется использовать значение по умолчанию. Изменяйте только при необходимости и с осторожностью.

  5. Выполните следующую команду, чтобы задать максимальное количество отменённых записей запросов, сохраняемых в журнале изоляции больших запросов:
    PUT _cluster/settings
    {
    "persistent": {
    "search.isolator.log.count": "100"
    }
    }
    Table 5 Описание параметра

    Параметр

    Тип

    Значение по умолчанию

    Описание

    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
    Table 6 Описание параметра

    Параметр

    Тип

    Значение по умолчанию

    Описание

    node_id

    String

    N/A

    Указывает один или несколько узлов кластера.

    • Один узел: введите ID узла.
    • Несколько узлов: введите несколько идентификаторов узлов и используйте запятую (,) для их разделения.

    Вы можете выполнить следующую команду для получения идентификаторов узлов:

    GET _cat/nodes?s=n&h=n,id&v=true&full_id=true

    Пример ответа:

    {
    "_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". Это предотвращает потребление избыточных ресурсов длительными запросами. Глобальный тайм‑аут запросов отключен по умолчанию. При необходимости вы можете изменить эту настройку. Любое изменение вступает в силу немедленно.

Выполните следующую команду, чтобы включить и настроить глобальный тайм‑аут запросов:

PUT _cluster/settings
{
"persistent": {
"search.isolator.time.enabled": true,
"search.isolator.time.limit": "110s"
}
}
Table 7 Параметры настройки глобального тайм‑аута запросов

Параметр

Тип

Значение по умолчанию

Описание

search.isolator.time.enabled

Boolean

false

Определяет, включён ли глобальный тайм‑аут запросов. При включении запросы автоматически отменяются, если их продолжительность превышает предопределённый тайм‑аут.

Значение может быть:

  • true: Включить глобальный тайм‑аут запроса.
  • false: Отключить глобальный тайм‑аут запроса.

search.isolator.time.limit

String

120s

Значение глобального тайм‑аута запроса.

Формат значения: number + unit

  • Число: натуральное число
  • Единица: nanos (наносекунда), micros (микросекунда), ms (миллисекунда), s (секунда), m (минута), h (час) или d (день)

Минимальное значение: 0 (чтобы отменить все запросы)