查询队列
本文档介绍如何在 StarRocks 中管理查询队列。
自 v2.5 版本起,StarRocks 支持查询队列功能。启用查询队列后,StarRocks 会在并发查询数量或资源使用率达到一定阈值时自动对查询进行排队,从而避免过载加剧。待执行查询将在队列中等待直至有足够的计算资源时开始执行。自 v3.1.4 版本起,StarRocks 支持设置资源组粒度的查询队列功能。
您可以为 CPU 使用率、内存使用率和查询并发度设置阈值以触发查询队列。
Roadmap:
版本 | 全局查询队列 | 资源组粒度查询队列 | 并发数量集中管理 | 并发度动态调整 |
---|---|---|---|---|
v2.5 | ✅ | ❌ | ❌ | ❌ |
v3.1.4 | ✅ | ✅ | ✅ | ✅ |
启用查询队列
StarRocks 默认关闭查询队列。您可以通过设置相应的全局会话变量(Global session variable)来为 INSERT 导入、SELECT 查询和统计信息查询启用全局或资源组粒度的查询队列。
启用全局查询队列
设置以下全局会话变量来为导入任务、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_limit | 0 | 单个 BE 节点中并发查询上限。仅在设置为大于 0 后生效。设置为 0 表示没有限制。 |
query_queue_mem_used_pct_limit | 0 | 单个 BE 节点中内存使用百分比上限。仅在设置为大于 0 后生效。设置为 0 表示没有限制。取值范围:[0, 1] |
query_queue_cpu_used_permille_limit | 0 | 单个 BE 节点中 CPU 使用千分比上限(即 CPU 使用率 * 1000)。仅在设置为大于 0 后生效。设置为 0 表示没有限制。取值范围:[0, 1000] |
说明
默认设置下,BE 每隔一秒向 FE 报告资源使用情况。您可以通过设置 BE 配置项
report_resource_usage_interval_ms
来更改此间隔时间。
资源组粒度的资源阈值
从 v3.1.4 开始,您可以在创建资源组时为其设置各自的并发查询上限 concurrency_limit
和 CPU 核数上限 max_cpu_cores
。当发起一个查询时,如果任意一项资源占用超过了全局粒度或资源组粒度的资源阈值,那么查询会进行排队,直到所有资源都没有超过阈值,再执行该查询。
属性 | 默认值 | 描述 |
---|---|---|
concurrency_limit | 0 | 该资源组在单个 BE 节点中并发查询上限。仅在设置为大于 0 后生效。 |
max_cpu_cores | 0 | 该资源组在单个 BE 节点中使用的 CPU 核数上限。仅在设置为大于 0 后生效。取值范围:[0, avg_be_cpu_cores ],其中 avg_be_cpu_cores 表示所有 BE 的 CPU 核数的平均值。 |
您可以通过 SHOW USAGE RESOURECE 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 版本,所有 FE 正在运行的查询数量
num_running_queries
由 Leader FE 集中管理。每个 Follower FE 在发起和结束一个查询时,会通知 Leader FE,从而可以应对短时间内查询激增超过了concurrency_limit
的场景。
配置查询队列
您可以通过以下全局会话变量设置查询队列的容量和队列中查询的最大超时时间:
变量 | 默认值 | 描述 |
---|---|---|
query_queue_max_queued_queries | 1024 | 队列中查询数量的上限。当达到此阈值时,新增查询将被拒绝执行。仅在设置为大于 0 后生效。 |
query_queue_pending_timeout_second | 300 | 队列中单个查询的最大超时时间。当达到此阈值时,该查询将被拒绝执行。单位:秒。 |