concurrent_threads_lazy_allocation
true (默认值) 时,查询启动时先占用一个 CPU 插槽,只有当其管道确实产生了更多可并行执行的工作时,才会向调度器申请额外插槽。这样可以避免某个查询预留了多达 max_threads 个插槽,却始终只用到其中一部分,从而挤占其他并发查询的资源。此设置同时适用于并发控制以及工作负载的抢占式 CPU 调度器。
当 false 时,查询会在启动时一次性申请全部 max_threads 插槽。
concurrent_threads_scheduler
concurrent_threads_soft_limit_num 和 concurrent_threads_soft_limit_ratio_to_cores 定义的 CPU 插槽调度策略。该算法用于控制有限数量的 CPU 插槽如何在并发查询之间分配。调度器可在运行时更改,无需重启服务器。
可能的值:
round_robin— 每个设置了use_concurrency_control= 1 的查询最多可分配max_threads个 CPU 插槽。每个线程对应一个插槽。发生争用时,CPU 插槽会按轮询方式分配给各查询。请注意,第一个插槽会无条件分配,这可能导致不公平;当存在大量max_threads= 1 的查询时,还会增加max_threads较高的查询的延迟。fair_round_robin— 每个设置了use_concurrency_control= 1 的查询最多可分配max_threads - 1个 CPU 插槽。这是round_robin的一种变体,不要求为每个查询的第一个线程分配 CPU 插槽。这样,max_threads= 1 的查询不需要任何插槽,因此不会不公平地占用所有插槽。不存在无条件分配的插槽。max_min_fair— 每个设置了use_concurrency_control= 1 的查询最多可分配max_threads - 1个 CPU 插槽。它与fair_round_robin类似,但释放出的插槽始终会分配给当前已获分配插槽数最少的查询。在高超额订阅场景下,也就是大量查询竞争有限 CPU 插槽时,这种方式能提供更好的公平性。运行时间较短的查询不会因为长期运行、并随着时间推移累积了更多插槽的查询而受到不利影响。
concurrent_threads_soft_limit_num
值为
0 (默认值) 表示不受限制。concurrent_threads_soft_limit_ratio_to_cores
concurrent_threads_soft_limit_num 相同,但这里是按核心数的比率来设置。