跳到主要内容

并发控制与排队:防止高并发导致 OOM 或系统卡死

并发控制与排队(Concurrency Control & Queuing)是 Doris 工作负载管理的核心机制。当同时运行的查询数量超过系统上限时,Doris 会将多余的查询放入等待队列,而非直接拒绝或压垮系统,从而避免 OOM、系统卡死等问题。

该机制通过 workload group 实现,每个 workload group 可独立设置最大并发数、队列长度和排队超时时间。

配置并发控制与排队

目的:创建或修改 workload group,限制并发查询数量并开启排队。

命令

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

参数说明

参数名类型默认值取值范围说明
max_concurrency整型2147483647[0, 2147483647]最大查询并发数。默认值为整型最大值,即不限并发。运行中的查询数量达到上限时,新查询进入排队逻辑。
max_queue_size整型0[0, 2147483647]排队队列长度。队列已满时,新查询直接被拒绝。默认值为 0,即不排队。
queue_timeout整型0[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(每台 FE 各 1 个)

在多 FE 集群中,应将 max_concurrency 设置为期望的集群级别并发数除以 FE 数量。

查看当前排队状态

目的:查看各 workload group 当前的运行查询数和排队查询数。

命令

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;

说明:该设置为 session 级别变量,仅对当前会话生效。建议仅在运维操作时临时开启,操作完成后关闭或重新建立连接。

常见问题

Q: 新查询立即报错,未进入排队

queue_timeout = 0max_queue_size = 0 导致查询无法排队。调整 max_queue_size > 0 且 queue_timeout > 0。

Q: 队列满后查询被拒绝

max_queue_size 配置过小。增大 max_queue_size,或提高 max_concurrency

Q: 多 FE 集群并发限制不符合预期

排队参数按单 FE 粒度生效。将 max_concurrency 设为目标值除以 FE 数量。

Q: 管理员操作也被排队阻塞

未开启 bypass 变量。执行 SET bypass_workload_group = true