论文链接:Morsel-Driven Parallelism: A NUMA-Aware Query Evaluation Framework for the Many-Core Age
Note
以下内容由chatgpt总结生成
🎯 背景与问题
现代数据库系统面临三大挑战:
-
多核处理器的兴起:需支持数十到上百线程的高并发查询处理。
-
传统并行模型失效:Volcano 模型等静态线程分配方式难以扩展,易导致负载不均。
-
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 系统中,取得显著性能优势。