Перейти к содержимому
Последнее обновление

Управление параллелизмом и очередями: предотвращение OOM и зависания системы при высокой параллельной нагрузке

Управление параллелизмом и очередями относится к основным механизмам управления рабочей нагрузкой в Doris. Когда число одновременно выполняемых запросов превышает системный лимит, Doris помещает избыточные запросы в очередь ожидания, вместо того чтобы сразу отклонять их или допускать перегрузку системы. Это позволяет избежать таких проблем, как OOM и зависания системы.

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

Настройка управления параллелизмом и очередями​

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

Команда:

CREATE WORKLOAD GROUP IF NOT EXISTS queue_group
PROPERTIES (
"max_concurrency" = "10",
"max_queue_size" = "20",
"queue_timeout" = "3000"
);

Описание параметров:

ПараметрТипЗначение по умолчаниюДиапазонОписание
max_concurrencyinteger2147483647[0, 2147483647]Максимальное число одновременно выполняемых запросов. По умолчанию используется максимальное целое число, то есть параллелизм не ограничен. Когда число выполняемых запросов достигает этого лимита, новые запросы обрабатываются по правилам очереди.
max_queue_sizeinteger0[0, 2147483647]Длина очереди ожидания. Когда очередь заполнена, новые запросы сразу отклоняются. Значение по умолчанию равно 0, то есть очередь отключена.
queue_timeoutinteger0[0, 2147483647]Максимальное время ожидания запроса в очереди, в миллисекундах. По истечении этого времени клиенту сразу возвращается ошибка. Значение по умолчанию равно 0, то есть ошибка возвращается сразу после попадания запроса в очередь.

Пояснение к примеру:

В кластере с одним FE приведённая выше конфигурация означает следующее:

  • В кластере одновременно выполняется не более 10 запросов.
  • При достижении лимита параллелизма новые запросы попадают в очередь, максимальная длина которой равна 20.
  • Запрос ожидает в очереди не более 3 секунд (3000 миллисекунд), после чего возвращается ошибка по тайм-ауту.
Примечания для кластеров с несколькими FE

Параметры очереди действуют на уровне отдельного FE и не учитывают общее число FE в кластере. Например:

  • При max_concurrency = 1 и 1 FE в кластере одновременно выполняется не более 1 запроса SQL.
  • При max_concurrency = 1 и 3 FE в кластере одновременно выполняется не более 3 запросов SQL (по 1 на каждый FE).

В кластере с несколькими FE задайте для max_concurrency значение, равное желаемому числу одновременно выполняемых запросов во всём кластере, делённому на число FE.

Просмотр текущего состояния очередей​

Назначение: просмотреть текущее число выполняемых запросов и запросов в очереди для каждой группы рабочей нагрузки.

Команда:

SHOW WORKLOAD GROUPS;

Пример вывода:

mysql [(none)]> SHOW WORKLOAD GROUPS\G;
*************************** 1. row ***************************
Id: 1
Name: normal
cpu_share: 20
memory_limit: 50%
enable_memory_overcommit: true
max_concurrency: 2147483647
max_queue_size: 0
queue_timeout: 0
cpu_hard_limit: 1%
scan_thread_num: 16
max_remote_scan_thread_num: -1
min_remote_scan_thread_num: -1
memory_low_watermark: 50%
memory_high_watermark: 80%
tag:
read_bytes_per_second: -1
remote_read_bytes_per_second: -1
running_query_num: 0
waiting_query_num: 0

Основные поля:

  • running_query_num: число запросов, выполняемых в данный момент.
  • waiting_query_num: число запросов, ожидающих в очереди в данный момент.

Обход ограничений очереди (действие администратора)​

Назначение: при обслуживании системы учётной записи администратора необходимо обходить механизм очередей и выполнять административные команды SQL напрямую.

Команда:

SET bypass_workload_group = true;

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

Часто задаваемые вопросы​

Вопрос: новый запрос сразу завершается с ошибкой и не попадает в очередь​

queue_timeout = 0 или max_queue_size = 0 не позволяет помещать запросы в очередь. Установите max_queue_size > 0 и queue_timeout > 0.

Вопрос: после заполнения очереди запросы отклоняются​

Для max_queue_size задано слишком маленькое значение. Увеличьте max_queue_size или повысьте max_concurrency.

Вопрос: ограничение параллелизма в кластере с несколькими FE не соответствует ожиданиям​

Параметры очереди действуют на уровне отдельного FE. Задайте для max_concurrency целевое значение, делённое на число FE.

Вопрос: административные операции тоже блокируются очередью​

Переменная обхода очереди не включена. Выполните SET bypass_workload_group = true.