云数据库 SelectDB 版支持基于Push模式驱动的Pipeline执行引擎。其减少了线程切换和线程阻塞所导致的执行开销,提高了CPU的利用效率,并减少了大查询对小查询的资源挤占问题。从而提高CPU在混合负载SQL上执行时的效率,提升了SQL查询的性能。
功能简介
Pipeline执行引擎是SelectDB在新版本新增的核心功能。旨在替换原有的SelectDB执行引擎,充分发挥多核CPU的计算能力,并对SelectDB的查询线程数量进行限制,以解决SelectDB执行线程膨胀的问题。其具体设计、实现和效果请参见Support Pipeline Exec Engine。
原理
SelectDB原有的SQL执行引擎基于传统的火山模型设计,在单机多核的场景下存在以下问题:
无法充分利用多核计算能力提升查询性能。在大多数情况下,进行性能调优时需要手动设置并行度,而在生产环境中几乎很难进行这样的设定。
单机查询的每个实例(Instance)对应线程池的一个线程,这会带来以下的两个问题。
一旦线程池达到最大容量,SelectDB的查询引擎将陷入假死锁状态,无法响应后续的查询。同时,存在一定概率发生逻辑死锁的情况,例如所有线程都在执行某个实例的探测(Probe)任务。
阻塞的算子占用了线程资源,导致线程资源无法让渡给可调度的实例,从而整体资源利用率不高。
阻塞算子依赖操作系统的线程调度机制,线程切换开销较大(尤其在系统混布的场景中)。
这一系列的问题,促使SelectDB需要适应现代多核CPU体系结构的执行引擎。
如下图所示,基于多核CPU的特点,Pipeline执行引擎经过重新设计,成为由数据驱动的执行引擎,从而提高CPU在混合负载SQL上执行时的效率,提升了SQL查询的性能。
将传统基于Pull拉取模式驱动的执行引擎,改造为基于Push模式驱动的执行引擎。
将阻塞操作异步化,减少了线程切换、线程阻塞导致的执行开销,CPU利用更高效。
控制了执行线程的数目,通过时间片切换的控制,在混合负载的场景中,减少大查询对于小查询的资源挤占问题。
使用方式
设置Session变量
enable_pipeline_engine
将会话变量
enable_pipeline_engine
设置为true
,则BE(集群)在进行查询执行时开启基于Pipeline的执行方式,默认开启。set enable_pipeline_engine = true;
parallel_pipeline_task_num
parallel_pipeline_task_num
代表了SQL查询进行并发执行的Pipeline Task数目。SelectDB默认的配置为0
,会自动设置为CPU核数的一半。您也可以根据自己的实际情况进行调整。set parallel_pipeline_task_num = 0;
您可以通过设置
max_instance_num
来限制自动设置的并发数上限(默认为64)。