跳到主要内容
版本: 最新版本-3.5

查询队列

本文介绍了如何在 StarRocks 中管理查询队列。

自 v2.5 起,StarRocks 支持查询队列。 启用查询队列后,当达到并发阈值或资源限制时,StarRocks 会自动将传入的查询排队,从而避免过载恶化。挂起的查询在队列中等待,直到有足够的计算资源可用于开始执行。 从 v3.1.4 开始,StarRocks 支持在资源组级别设置查询队列。

您可以设置 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;

启用资源组级别查询队列

从 v3.1.4 开始,StarRocks 支持在资源组级别设置查询队列。

要启用资源组级别查询队列,除了上面提到的全局会话变量之外,还需要设置 enable_group_level_query_queue

SET GLOBAL enable_group_level_query_queue = true;

指定资源阈值

指定全局查询队列的资源阈值

您可以通过以下全局会话变量设置触发查询队列的阈值

变量默认描述
query_queue_concurrency_limit0BE 上并发查询的上限。 仅在设置为大于 0 后才生效。 设置为 0 表示不施加限制。
query_queue_mem_used_pct_limit0BE 上内存使用率的上限。 仅在设置为大于 0 后才生效。 设置为 0 表示不施加限制。 范围:[0, 1]
query_queue_cpu_used_permille_limit0BE 上 CPU 使用率 permille (CPU 使用率 * 1000) 的上限。 仅在设置为大于 0 后才生效。 设置为 0 表示不施加限制。 范围:[0, 1000]

注意

默认情况下,BE 以一秒的间隔向 FE 报告资源使用情况。 您可以通过设置 BE 配置项 report_resource_usage_interval_ms 来更改此间隔。

指定资源组级别查询队列的资源阈值

从 v3.1.4 开始,您可以在创建资源组时设置单独的并发限制 (concurrency_limit) 和 CPU 核心限制 (max_cpu_cores)。 当查询启动时,如果任何资源消耗超过全局或资源组级别的资源阈值,查询将被放入队列,直到所有资源消耗都在阈值范围内。

变量默认描述
concurrency_limit0单个 BE 节点上资源组的并发限制。 仅当设置为大于 0 时才生效。
max_cpu_cores0单个 BE 节点上此资源组的 CPU 核心限制。 仅当设置为大于 0 时才生效。 范围:[0, avg_be_cpu_cores],其中 avg_be_cpu_cores 表示所有 BE 节点上的平均 CPU 核心数。

您可以使用 SHOW USAGE RESOURCE GROUPS 查看每个 BE 节点上每个资源组的资源使用信息,如查看资源组使用信息中所述。

管理查询并发

当正在运行的查询数 (num_running_queries) 超过全局或资源组的 concurrency_limit 时,传入的查询将被放入队列。 版本 < v3.1.4 和 ≥ v3.1.4 之间获取 num_running_queries 的方式不同。

  • 在版本 < v3.1.4 中,num_running_queries 由 BE 以 report_resource_usage_interval_ms 中指定的间隔报告。 因此,识别 num_running_queries 中的变化可能会有一些延迟。 例如,如果 BE 当前报告的 num_running_queries 未超过全局或资源组的 concurrency_limit,但在下一次报告之前,传入的查询到达并超过了 concurrency_limit,这些传入的查询将直接执行而无需在队列中等待。

  • 在版本 ≥ v3.1.4 中,所有正在运行的查询都由 Leader FE 统一管理。 每个 Follower FE 在启动或完成查询时通知 Leader FE,从而允许 StarRocks 处理查询突然增加超过 concurrency_limit 的情况。

配置查询队列

您可以通过以下全局会话变量设置查询队列的容量和队列中查询的最大超时时间

变量默认描述
query_queue_max_queued_queries1024队列中查询的上限。 当达到此阈值时,将拒绝传入的查询。 仅在设置为大于 0 后才生效。
query_queue_pending_timeout_second300队列中挂起查询的最大超时时间。 当达到此阈值时,将拒绝相应的查询。 单位:秒。

配置查询并发的动态调整

从 v3.1.4 版本开始,对于由查询队列管理并由 Pipeline Engine 运行的查询,StarRocks 可以根据当前正在运行的查询数 num_running_queries、fragments 数 num_fragments 和查询并发 pipeline_dop 动态调整传入查询的查询并发 pipeline_dop。 这允许您动态控制查询并发,同时最大限度地减少调度开销,确保最佳的 BE 资源利用率。 有关 fragments 和查询并发 pipeline_dop 的更多信息,请参见查询管理 - 调整查询并发

对于查询队列下的每个查询,StarRocks 维护一个驱动程序的概念,它表示单个 BE 上查询的并发 fragments。 它的逻辑值 num_drivers,表示该查询在单个 BE 上的所有 fragments 的总并发数,等于 num_fragments * pipeline_dop。 当新查询到达时,StarRocks 会根据以下规则调整查询并发 pipeline_dop

  • 正在运行的驱动程序数 num_drivers 超过并发驱动程序的低水位限制 query_queue_driver_low_water 的越多,查询并发 pipeline_dop 调整得越低。
  • StarRocks 将正在运行的驱动程序数 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 表示所有 BE 节点上的平均 CPU 核心数。 当设置为大于 0 的值时,将直接使用该值。
query_queue_driver_low_water-1查询并发驱动程序的低水位限制。 仅当设置为非负值时才生效。 当设置为 0 时,它相当于 avg_be_cpu_cores * 8。 当设置为大于 0 的值时,将直接使用该值。

监控查询队列

您可以使用以下方法查看与查询队列相关的信息。

SHOW PROC

您可以使用SHOW PROC查看 BE 节点中正在运行的查询数以及内存和 CPU 使用情况

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

SHOW PROCESSLIST

您可以使用SHOW PROCESSLIST检查查询是否在队列中(当 IsPendingtrue 时)

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 指示查询在队列中等待的时间,单位为毫秒。

监控指标

您可以使用监控和告警功能获取 StarRocks 中查询队列的指标。 以下 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 标签指示资源组的名称。 此指标从 v3.1.4 开始支持。
starrocks_fe_resource_group_query_queue_pending计数瞬时此资源组中当前队列中的查询数。 name 标签指示资源组的名称。 此指标从 v3.1.4 开始支持。
starrocks_fe_resource_group_query_queue_timeout计数瞬时此资源组中在队列中超时的查询数。 name 标签指示资源组的名称。 此指标从 v3.1.4 开始支持。

SHOW RUNNING QUERIES

从 v3.1.4 开始,StarRocks 支持 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 |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+