Pipeline执行引擎

云数据库 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查询的性能。

pipeline-execution-engine-2067b3a862de84a561eabefd41d48a56.png

  1. 将传统基于Pull拉取模式驱动的执行引擎,改造为基于Push模式驱动的执行引擎。

  2. 将阻塞操作异步化,减少了线程切换、线程阻塞导致的执行开销,CPU利用更高效。

  3. 控制了执行线程的数目,通过时间片切换的控制,在混合负载的场景中,减少大查询对于小查询的资源挤占问题。

使用方式

设置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)。