论文链接:Morsel-Driven Parallelism: A NUMA-Aware Query Evaluation Framework for the Many-Core Age

Note

以下内容由chatgpt总结生成

🎯 背景与问题

现代数据库系统面临三大挑战:

  1. 多核处理器的兴起:需支持数十到上百线程的高并发查询处理。

  2. 传统并行模型失效:Volcano 模型等静态线程分配方式难以扩展,易导致负载不均。

  3. NUMA 架构的普及:内存访问开销与位置相关,必须优化数据与线程的局部性。


💡 解决方案:Morsel-Driven 并行模型

什么是 Morsel?

  • 数据执行的最小单元,例如每个 morsel 包含 10 万条记录。

  • 每个线程一次处理一个 morsel,执行完整的操作流水线直到下一个“断点”。

执行特点

  • 运行时动态调度:并非静态绑定线程,调度器根据线程执行进度动态分配 morsel。

  • NUMA 感知:优先分配位于线程所在 NUMA 节点的数据,减少远程内存访问。

  • 弹性并发度:可根据系统负载、查询优先级动态调整每个查询的线程数。


⚙️ 设计组件

Dispatcher(调度器)

  • 每个核心固定绑定一个 worker 线程。

  • 调度器为每个线程分配 morsel + pipeline job,支持:

  - 线程本地 morsel 分发(NUMA 本地性)

  - 工作窃取(work stealing)

  - 优先级调度与查询取消

QEPObject(查询执行计划管理器)

  • 负责观察 pipeline 之间的依赖关系。

  • 生成 pipeline 并交给调度器安排 morsel 执行。


🔁 Pipeline 调度示意图

 
Query: R ⨝A S ⨝B T
 
  
 
Step 1: Pipeline 构建哈希表
 
  ┌──────────────┐
 
  │  Scan & HT(T)│◄── 线程1处理Morsel-1 (NUMA-0)
 
  └──────────────┘
 
  ┌──────────────┐
 
  │  Scan & HT(S)│◄── 线程2处理Morsel-2 (NUMA-1)
 
  └──────────────┘
 
  
 
Step 2: Pipeline 探测
 
  ┌────────────────────────────────────────┐
 
  │ Scan R ➝ Probe HT(S) ➝ Probe HT(T)     │◄── 多线程并行处理各自 NUMA morsel
 
  └────────────────────────────────────────┘
 
  
 
所有阶段数据处理与存储都尽可能保持在本地 NUMA 节点。
 

🔄 支持的并行操作

  • Hash Join:双阶段构建,锁无哈希表,支持 Probe 加速(Hash Tagging)

  • Aggregation:局部聚合 + 分区汇总

  • Sort:线程本地排序 + 并行合并


📊 性能评估(TPC-H & SSB)

  • 在 32 核系统上平均加速比超 30×

  • 高效 NUMA 利用率

  • 支持查询优先级调度、快速查询取消


✅ 优势总结

特性               传统模型(如 Volcano)Morsel-Driven 模型      

| 并行度调整          | 静态                     | 动态、弹性                | | NUMA 局部性支持     | 无/有限                  | 强、全面                  |

| 负载均衡            | 较差                     | 高效、工作窃取机制        |

| 操作符并行支持      | 有限(依赖 exchange)    | 全面支持每个阶段的并行    |

| 查询取消与切换      | 笨重                     | 粒度细,低开销            |


📘 结论

Morsel-Driven 是一种更适应未来多核 NUMA 架构的数据库查询执行模型,具备如下关键能力:

  • 动态调度、弹性并发

  • NUMA 感知的任务分配

  • 操作符级并行支持

  • 更高的可扩展性与系统吞吐

该方法已成功集成在 HyPer 系统中,取得显著性能优势。