帆软 执行存储过程 sql cpu沾满_PostgreSQL数据库的智能存储

作者简介 KaiGai Kohei,HeteroDB数据库首席架构师、共同创始人,PG-Storm作者。

译者简介

朱君鹏华东师范大学博士研究生,个人兴趣主要集中在:新型硬件(GPU、RDMA、FPGA等)在数据库中的应用,架构设计与并行计算。

校对者简介

崔鹏,任职于海能达通信股份有限公司哈尔滨平台中心,数据库开发高级工程师,致力于PostgreSQL数据库在专网通信领域、公共安全领域的应用与推广,个人兴趣主要集中在:分布式数据库系统设计、高并发高可用数据库架构设计与开源数据库的源码研究。

摘要

GPUDirect RDMA允许直接从PCIe设备到GPU RAM的对等数据加载。 对于Linux内核和PostgreSQL的扩展模块,我们通过将NVMe-SSD上的数据库块加载到GPU RAM以及在GPU设备上执行SQL来协同利用此基础架构进行非常快速的表扫描。 一旦数据块加载到GPU RAM上,内核函数就会根据提供的SQL(WHERE clause,JOIN和GROUP BY)减少数据大小。 在结果中,CPU / RAM将获得比实际表大小小得多的数据大小,并且看起来存储在理解SQL的情况下智能地执行。 根据基于SQL星型模式的基准测试,我们的功能可以在80秒内扫描351GB平台;这是大约4.5GB / s的查询处理吞吐量,比通常的文件系统基本I / O实现快2.5倍。 此结果表明GPU对I / O密集型工作负载也很有价值,而不仅仅是计算密集型工作负载。

简要架构

a57ae684c662c2ac24b4a82111356200.png

OLAP(联机分析处理)是数据库领域的一个主要工作。它的特点是查询想要从大量数据中生成(相对)小的摘要;通常大于物理RAM大小。传统上,存储设备(如SSD)上的数据库的数据块被加载到主机系统的RAM一次,然后CPU或GPU处理它们。但是,由于数据块中的大多数行都被过滤,所以效率不高,因为在GROUP BY操作的缩减过程中,数据块中的大多数行都被过滤掉或仅被引用一次。在SQL工作负载的情况下,我们可以准确地知道如何在加载之后处理数据块。因此,可以设计GPU内核以并行地在多个块/行上运行SQL工作负载。我们实现了WHERE子句评估的GPU版本,Hash-Join和GROUP BY,作为PG-Strom [* 1]的功能。此外,我们开发了一个Linux内核模块,用于将SSD从SSD块传输到GPU RAM。PG-Strom是PostgreSQL [* 2]数据库的扩展。它控制Linux内核模块和GPU设备以卸载SQL工作负载。该架构允许一些SSD和GPU协同工作,并根据提供的SQL将预处理的数据流发送回主机系统。从应用程序的角度来看,存储似乎可以智能化的在设备上运行一些SQL工作负载。使用GPU RAM(=相对罕见)处理大数据的关键是循环缓冲和异步执行。我们将映射的GPU内存分成多个块,并逐个分配作业。在特定时刻,CPU在块上发出SSD到GPU DMA请求,在另一个块上的请求正在进行中,GPU内核正在运行以处理另一个块,并且通常的GPU到RAM写回DMA在 - 另一个块上的进展。它可以非常有效地提取GPU和NVMe-SSD的硬件功能。  

a775dd863402e39d56b678ee34747430.png

 

基准测试

 

a002ba14d5ef669c37e71dac769f50bd.png

我们在原始NVMe-SSD [* 3]上构建了一个具有上述数据结构的数据库,以及由2或3个SSD设备组成的md-raid0卷。 此工作负载是众所周知的星型模式基准,它反映了典型的DWH工作负载,也类似于一些IoT类数据结构。 我们运行一些报告查询,如上面的Query-3。 最大的表大小为351GB,但RAM大小为128GB。 因此,此工作负载是典型的I / O密集型工作负载而非计算密集型。 蓝色条是每个RAID配置的vanilla PostgreSQL的结果,橙色条是PG-Strom的结果,具有SSD到GPU的P2P DMA支持。 查询处理时间的倒数(例如,如果查询在80秒内完成,则其数据处理为351GB / 80.0s = 4492MB / s)。 它显示了更多的SSD设备使数据处理吞吐量更高。 另一方面,PG-Strom的结果显示,SSD-to-GPU P2P DMA比基于文件系统+ CPU的数据处理能够提供更高的NVMe-SSD功能。 特别是,“PG-Strom SSDx1”是原始NVMe-SSD设备的结果。 其数据处理吞吐量约为2.1-2.2GB / s;这几乎相当于SSD设备的目录规范(SeqRead中为2.2GB / s)。 这些结果向我们介绍了最近的半导体创新(GPU,SSD,......)使我们能够以比以前更便宜的成本赶上高端DWH级性能。

结论和展望

我们的挑战表明,从应用的角度来看,一对GPU和NVMe-SSD可以像智能存储一样运行。 GPU可以根据应用程序端的知识处理数据流,但在数据到达CPU / RAM之前有GPUDirect RDMA支持。 它将数据处理吞吐量提高到了硬件的理论极限值附近,但成本比现有的高端数据库解决方案相对较小。 目前,我们的实现仍然在md-raid0配置上具有不可忽视的开销。 它需要修改。 然后,我们将尝试每个计算节点10GB / s的数据处理吞吐量。  

参考文献

[1] PG-Strom – Extension of PostgreSQL for GPU acceleration, http://strom.kaigai.gr.jp/ [2] PostgreSQL – Well used open source RDBMS,  https://www.postgresql.org/   [3] Intel SSD 750 (400GB) –  http://www.intel.com/content/www/us/en/solid-state-drives/solid-state-drives-750-series.html   出自: http://heterodb.com/blobs/P7130_KAIGAI_SSD2GPU_FIXTYPO.pdf

a1f96a83f3e9c2b3254368a36dc6fcf6.png

PostgreSQL中文社区欢迎广大技术人员投稿

投稿邮箱:press@postgres.cn

d8e09458413b4d8dba66e312ec20e5fb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一个开源的关系型数据库管理系统,支持存储过程和函数的定义和调用存储过程是一组预定义的SQL语句和逻辑,可以在数据库服务器上执行以完成特定的任务。覆盖率是评估软件测试的一个指标,用于衡量测试用例是否完整地覆盖了被测试软件的功能。 在PostgreSQL中,存储过程的覆盖率可以通过测试来评估。为了测试存储过程的覆盖率,我们可以编写测试用例,针对不同的输入数据和参数,对存储过程进行测试。测试用例应该覆盖存储过程中的所有路径、条件和分支,并验证其返回结果是否符合预期。 可以使用各种测试框架和工具来自动化测试PostgreSQL存储过程的覆盖率。例如,可以使用pgTAP框架来编写针对存储过程的单元测试。pgTAP提供了丰富的断言函数,可以用来验证存储过程的输出是否正确。另外,还可以使用覆盖率工具,例如pgTAP-Coverage来评估测试用例覆盖到的代码行数和分支情况。 评估存储过程的覆盖率可以帮助我们发现可能存在的逻辑问题、边界情况和错误处理。通过增加测试用例,我们可以提高存储过程的覆盖率,确保其在各种情况下都能正确执行。 总的来说,PostgreSQL数据库存储过程的覆盖率是评估测试用例是否完整地覆盖了存储过程的功能的一个重要指标。通过编写全面的测试用例,并使用适当的工具进行测试和覆盖率评估,可以提高存储过程的质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值