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

Очереди запросов

В этой теме описывается, как управлять очередями запросов в Selena.

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

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

Дорожная карта:

ВерсияГлобальная очередь запросовОчередь запросов на уровне группы ресурсовКоллективное управление параллелизмомДинамическая настройка параллелизма
v2.5
v3.1.4

Включение очередей запросов

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

Включение глобальных очередей запросов

  • Включить очереди запросов для задач загрузки:
SET GLOBAL enable_query_queue_load = true;
  • Включить очереди запросов для запросов SELECT:
SET GLOBAL enable_query_queue_select = true;
  • Включить очереди запросов для статистических запросов:
SET GLOBAL enable_query_queue_statistic = true;

Включение очередей запросов на уровне группы ресурсов

Начиная с версии 1.5.0, Selena поддерживает настройку очередей запросов на уровне группы ресурсов.

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

SET GLOBAL enable_group_level_query_queue = true;

Указание пороговых значений ресурсов

Указание пороговых значений ресурсов для глобальных очередей запросов

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

ПеременнаяПо умолчаниюОписание
query_queue_concurrency_limit0Верхний лимит параллельных запросов на BE. Вступает в силу только после установки значения больше 0. Установка в 0 означает отсутствие ограничений.
query_queue_mem_used_pct_limit0Верхний лимит процента использования памяти на BE. Вступает в силу только после установки значения больше 0. Диапазон: [0, 1]. Установка в 0 означает отсутствие ограничений.
query_queue_cpu_used_permille_limit0Верхний лимит промилле использования CPU (использование CPU * 1000) на BE. Вступает в силу только после установки значения больше 0. Диапазон: [0, 1000]. Установка в 0 означает отсутствие ограничений.

ПРИМЕЧАНИЕ

По умолчанию BE сообщает об использовании ресурсов FE с интервалом в одну секунду. Вы можете изменить этот интервал, установив параметр конфигурации BE report_resource_usage_interval_ms.

Указание пороговых значений ресурсов для очередей запросов на уровне группы ресурсов

Начиная с версии 1.5.0, вы можете установить индивидуальные лимиты параллелизма (concurrency_limit) и лимиты ядер CPU (max_cpu_cores) при создании группы ресурсов. Когда инициируется запрос, если любое из потреблений ресурсов превышает пороговое значение ресурсов на глобальном уровне или уровне группы ресурсов, запрос будет помещен в очередь до тех пор, пока все потребления ресурсов не окажутся в пределах порогового значения.

ПеременнаяПо умолчаниюОписание
concurrency_limit0Лимит параллелизма для группы ресурсов на одном узле BE. Вступает в силу только при установке значения больше 0.
max_cpu_cores0Лимит ядер CPU для этой группы ресурсов на одном узле BE. Вступает в силу только при установке значения больше 0. Диапазон: [0, avg_be_cpu_cores], где avg_be_cpu_cores представляет среднее количество ядер CPU по всем узлам BE.

Вы можете использовать SHOW USAGE RESOURCE GROUPS для просмотра информации об использовании ресурсов для каждой группы ресурсов на каждом узле BE, как описано в Просмотр информации об использовании группы ресурсов.

Управление параллелизмом запросов

Когда количество выполняющихся запросов (num_running_queries) превышает глобальный или групповой concurrency_limit, входящие запросы помещаются в очередь. Способ получения num_running_queries отличается между версиями < v3.1.4 и ≥ v3.1.4.

  • В версиях < v3.1.4, num_running_queries сообщается BE с интервалом, указанным в report_resource_usage_interval_ms. Поэтому может быть некоторая задержка в идентификации изменений в num_running_queries. Например, если num_running_queries, сообщенное BE в данный момент, не превышает глобальный или групповой concurrency_limit, но входящие запросы прибывают и превышают concurrency_limit до следующего отчета, эти входящие запросы будут выполнены без ожидания в очереди.

  • В версиях ≥ v3.1.4, все выполняющиеся запросы коллективно управляются Leader FE. Каждый Follower FE уведомляет Leader FE при инициации или завершении запроса, позволяя Selena обрабатывать сценарии, где происходит внезапное увеличение запросов, превышающих concurrency_limit.

Настройка очередей запросов

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

ПеременнаяПо умолчаниюОписание
query_queue_max_queued_queries1024Верхний лимит запросов в очереди. Когда этот порог достигнут, входящие запросы отклоняются. Вступает в силу только после установки значения больше 0.
query_queue_pending_timeout_second300Максимальный таймаут ожидающего запроса в очереди. Когда этот порог достигнут, соответствующий запрос отклоняется. Единица: секунда.

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

Начиная с версии 1.5.0, для запросов, управляемых очередью запросов и выполняемых Pipeline Engine, Selena может динамически корректировать параллелизм запросов pipeline_dop для входящих запросов на основе текущего количества выполняющихся запросов num_running_queries, количества фрагментов num_fragments и параллелизма запросов pipeline_dop. Это позволяет динамически контролировать параллелизм запросов, минимизируя накладные расходы на планирование и обеспечивая оптимальное использование ресурсов BE. Для получения дополнительной информации о фрагментах и параллелизме запросов pipeline_dop, см. Управление запросами - Настройка параллелизма запросов.

Для каждого запроса под очередью запросов Selena поддерживает концепцию драйверов, которые представляют параллельные фрагменты запроса на одном BE. Его логическое значение num_drivers, которое представляет общий параллелизм всех фрагментов этого запроса на одном BE, равно num_fragments * pipeline_dop. Когда прибывает новый запрос, Selena корректирует параллелизм запросов pipeline_dop на основе следующих правил:

  • Чем больше количество выполняющихся драйверов num_drivers превышает нижний водяной знак параллельных драйверов query_queue_driver_low_water, тем ниже корректируется параллелизм запросов pipeline_dop.
  • Selena ограничивает количество выполняющихся драйверов num_drivers ниже верхнего водяного знака параллельных драйверов для запросов query_queue_driver_high_water.

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

ПеременнаяПо умолчаниюОписание
query_queue_driver_high_water-1Верхний водяной знак параллельных драйверов для запроса. Вступает в силу только при установке неотрицательного значения. При установке в 0 эквивалентно avg_be_cpu_cores * 16, где avg_be_cpu_cores представляет среднее количество ядер CPU по всем узлам BE. При установке значения больше 0 используется это значение напрямую.
query_queue_driver_low_water-1Нижний лимит параллельных драйверов для запросов. Вступает в силу только при установке неотрицательного значения. При установке в 0 эквивалентно avg_be_cpu_cores * 8. При установке значения больше 0 используется это значение напрямую.

Мониторинг очередей запросов

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

SHOW PROC

Вы можете проверить количество выполняющихся запросов, а также использование памяти и CPU в узлах BE, используя SHOW PROC:

mysql> SHOW PROC '/backends'\G
*************************** 1. row ***************************
...
NumRunningQueries: 0
MemUsedPct: 0.79 %
CpuUsedPct: 0.0 %

SHOW PROCESSLIST

Вы можете проверить, находится ли запрос в очереди (когда IsPending равно true), используя SHOW PROCESSLIST:

mysql> SHOW PROCESSLIST;
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| Id | User | Host | Db | Command | ConnectionStartTime | Time | State | Info | IsPending |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| 2 | root | xxx.xx.xxx.xx:xxxxx | | Query | 2022-11-24 18:08:29 | 0 | OK | SHOW PROCESSLIST | false |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+

Журнал аудита FE

Вы можете проверить файл журнала аудита FE fe.audit.log. Поле PendingTimeMs указывает время, которое запрос провел в ожидании в очереди, и его единица измерения - миллисекунды.

Метрики мониторинга

Вы можете получить метрики очередей запросов в Selena, используя функцию Мониторинг и оповещения. Следующие метрики FE получены из статистических данных каждого узла FE.

МетрикаЕдиницаТипОписание
starrocks_fe_query_queue_pendingКоличествоМгновенноеТекущее количество запросов в очереди.
starrocks_fe_query_queue_totalКоличествоМгновенноеОбщее количество запросов, исторически поставленных в очередь (включая те, которые выполняются в данный момент).
starrocks_fe_query_queue_timeoutКоличествоМгновенноеОбщее количество запросов, которые превысили время ожидания в очереди.
starrocks_fe_resource_group_query_queue_totalКоличествоМгновенноеОбщее количество запросов, исторически поставленных в очередь в этой группе ресурсов (включая те, которые выполняются в данный момент). Метка name указывает имя группы ресурсов. Эта метрика поддерживается начиная с версии 1.5.0.
starrocks_fe_resource_group_query_queue_pendingКоличествоМгновенноеКоличество запросов, находящихся в данный момент в очереди для этой группы ресурсов. Метка name указывает имя группы ресурсов. Эта метрика поддерживается начиная с версии 1.5.0.
starrocks_fe_resource_group_query_queue_timeoutКоличествоМгновенноеКоличество запросов, которые превысили время ожидания в очереди для этой группы ресурсов. Метка name указывает имя группы ресурсов. Эта метрика поддерживается начиная с версии 1.5.0.

SHOW RUNNING QUERIES

Начиная с версии 1.5.0, Selena поддерживает SQL-оператор SHOW RUNNING QUERIES, который используется для отображения информации об очереди для каждого запроса. Значения каждого поля следующие:

  • QueryId: ID запроса.
  • ResourceGroupId: ID группы ресурсов, которую попал запрос. Когда нет попадания в пользовательскую группу ресурсов, будет отображаться "-".
  • StartTime: Время начала запроса.
  • PendingTimeout: Время, когда PENDING запрос превысит время ожидания в очереди.
  • QueryTimeout: Время, когда запрос превысит время ожидания.
  • State: Состояние очереди запроса, где "PENDING" указывает, что он находится в очереди, а "RUNNING" указывает, что он выполняется в данный момент.
  • Slots: Логическое количество ресурсов, запрашиваемое запросом, в настоящее время фиксировано на 1.
  • Frontend: Узел FE, который инициировал запрос.
  • FeStartTime: Время начала узла FE, который инициировал запрос.

Пример:

MySQL [(none)]> SHOW RUNNING QUERIES;
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| QueryId | ResourceGroupId | StartTime | PendingTimeout | QueryTimeout | State | Slots | Frontend | FeStartTime |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| a46f68c6-3b49-11ee-8b43-00163e10863a | - | 2023-08-15 16:56:37 | 2023-08-15 17:01:37 | 2023-08-15 17:01:37 | RUNNING | 1 | 127.00.00.01_9010_1692069711535 | 2023-08-15 16:37:03 |
| a6935989-3b49-11ee-935a-00163e13bca3 | 12003 | 2023-08-15 16:56:40 | 2023-08-15 17:01:40 | 2023-08-15 17:01:40 | RUNNING | 1 | 127.00.00.02_9010_1692069658426 | 2023-08-15 16:37:03 |
| a7b5e137-3b49-11ee-8b43-00163e10863a | 12003 | 2023-08-15 16:56:42 | 2023-08-15 17:01:42 | 2023-08-15 17:01:42 | PENDING | 1 | 127.00.00.03_9010_1692069711535 | 2023-08-15 16:37:03 |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+