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设备上分配简单而大量的数值计算。