Управление параллелизмом и очередями: предотвращение OOM и зависания системы при высокой параллельной нагрузке
Управление параллелизмом и очередями относится к основным механизмам управления рабочей нагрузкой в Doris. Когда число одновременно выполняемых запросов превышает системный лимит, Doris помещает избыточные запросы в очередь ожидания, вместо того чтобы сразу отклонять их или допускать перегрузку системы. Это позволяет избежать таких проблем, как OOM и зависания системы.
Этот механизм реализован с помощью групп рабочей нагрузки. Для каждой группы рабочей нагрузки можно независимо задать максимальное число одновременно выполняемых запросов, длину очереди и время ожидания в очереди.
Настройка управления параллелизмом и очередями
Назначение: создать или изменить группу рабочей нагрузки, чтобы ограничить число одновременно выполняемых запросов и включить очередь.
Команда:
CREATE WORKLOAD GROUP IF NOT EXISTS queue_group
PROPERTIES (
"max_concurrency" = "10",
"max_queue_size" = "20",
"queue_timeout" = "3000"
);
Описание параметров:
| Параметр | Тип | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
max_concurrency | integer | 2147483647 | [0, 2147483647] | Максимальное число одновременно выполняемых запросов. По умолчанию используется максимальное целое число, то есть параллелизм не ограничен. Когда число выполняемых запросов достигает этого лимита, новые запросы обрабатываются по правилам очереди. |
max_queue_size | integer | 0 | [0, 2147483647] | Длина очереди ожидания. Когда очередь заполнена, новые запросы сразу отклоняются. Значение по умолчанию равно 0, то есть очередь отключена. |
queue_timeout | integer | 0 | [0, 2147483647] | Максимальное время ожидания запроса в очереди, в миллисекундах. По истечении этого времени клиенту сразу возвращается ошибка. Значение по умолчанию равно 0, то есть ошибка возвращается сразу после попадания запроса в очередь. |
Пояснение к примеру:
В кластере с одним FE приведённая выше конфигурация означает следующее:
- В кластере одновременно выполняется не более 10 запросов.
- При достижении лимита параллелизма новые запросы попадают в очередь, максимальная длина которой равна 20.
- Запрос ожидает в очереди не более 3 секунд (3000 миллисекунд), после чего возвращается ошибка по тайм-ауту.
Параметры очереди действуют на уровне отдельного 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.