PG-Storm:让 PostgreSQL 在 GPU 上跑得更快

  • 张天雷

2015 年 9 月 20 日

话题:语言 & 开发架构

PostgreSQL 的扩展PG-Storm允许用户自定义扫描方式,将 CPU 的密集型工作负载转移到 GPU 处理,从而利用 GPU 强大的并行执行能力完成数据任务。在处理器内核数量和 RAM 带宽上,GPU 有得天独厚的优势。GPU 通常有成百上千的处理器内核,RAM 带宽也比 CPU 大几倍,可以并行处理大量数值计算,因此其运算十分高效。

PG-Storm 基本基于两点思想:

  • 运行中本地 GPU 代码生成
  • 异步流水线执行模式

在查询优化阶段,PG-Storm 检测给定查询是否完全或部分可以在 GPU 上执行,而后确定该查询是否可转移。如果该查询可以转移,那么 PG-Storm 则在运行中创建 GPU 本地二进制文件的源代码,在执行阶段前启动即时编译进程。接下来,PG-Storm 将提取行集装载入 DMA 缓存(一个缓存区的大小默认为 15MB),并异步启动 DMA 传输和 GPU 内核执行。CUDA 平台允许这些任务在后台执行,因此 PostgreSQL 可以提前运行当前进程。通过 GPU 加速,这些异步相关切分也隐藏了一般延迟。

装载 PG-Strom 后,在 GPU 上运行 SQL 并不需要专门的指示。它允许允许用户自定义 PostgreSQL 的扫描方式,而且提供了可以在 GPU 上运行的扫描 / 联接逻辑的其他可行方案。如果预计费用合理可行,任务管理器则放入自定义扫描节点,而非内置查询执行逻辑。

下图是 PG-Strom 和 PostgreSQL 的基准测试结果,横坐标为表数量,纵坐标为查询执行时间。在此次测试中,所有相关的内部关系都可以一次性地加载到 GPU RAM 上,预聚集大大减小了 CPU 需要处理行数。测试代码详情可以查看这里

从上图中可以看出,PG-Strom 比单纯 PostgreSQL 快很多。

以下是几种可以提高 PostgreSQL 性能的方法:

  • 同类纵向扩展
  • 异类纵向扩展
  • 横向扩展

PG-Strom 使用的是异类纵向扩展方法,针对工作负载特性,最大限度地利用了硬件优势。换句话来说,PG-Strom 在 CPU 内核上运行之前,在 GPU 设备上分配简单而大量的数值计算。

对于 PG-Storm 更多细节感兴趣的读者,可以参考 NEC 的专家 KaiGai 最近在 PGCON 2015 给出的Talk,文中详细解释了大数据所面临的挑战,为何引入 GPU 以及 PG-Storm 的原理和效率等内容。


感谢徐川对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

语言 & 开发架构