利用非易失性内存打造高性能PG数据库系统

前阵子有朋友和我讨论把PG数据库改造成内存数据库的可行性。在讨论中发现,实际上内存数据库并不是简单的把一个传统的RDBMS放入内存中,并通过WAL日志和CHECKPOINT来持久化数据那么简单。实际上最初的内存数据库的目的是提供超低延时的应用支持,因此与传统的RDBMS相比,内存数据库需要在各个环节都尽可能简化,从而达到其最初的设计目标。在这种情况下,尽可能地减少各个环节的延时,甚至节约几条指令都是十分必要的。我们可以考虑一下,现在最为流行的内存数据库-Redis(一种KV的内存数据库),一般一条指令的执行时间是几十个微妙,而如果访问REDIS服务器的延时是1毫秒左右,那么其访问的总体性能不在于命令的执行,而是网络,因此高并发高性能的Redis应用的优化往往重点在网络上。

从PG数据库来看,这是一种典型的通用交易型RDBMS,从其特征上看,直接改造成纯粹的内存数据库,从数据库架构上来看,是十分困难的。不过随着非易失性内存内存技术的发展,另外一条将传统数据库改造成内存数据库的路子又显现出来了。在几年前和INTEL技术团队的交流中,非易失性内存内存、傲腾、AEP技术给我们带来了新的启示。如果利用AEP技术搭建一台能够提供数个TB或者数十个TB非易失性内存内存的服务器,就基本上能够满足大多数传统数据库应用的需求了。这样的话,把整个数据库放入非易失性内存内存,就可以让PG数据库成为访问性能与物理内存同一数量级的IO延时的准内存数据库了。

实际上把PG数据库改造成一个准内存数据库并不是那么简单,还涉及到如何将内存映射为一个文件的问题。如果采用LINUX上的传统技术,ramfs等技术,将高速的内存访问接口转换为相对缓慢的文件系统接口,那么内存的性能要牺牲很多,恐怕就无法把非易失性内存的性能完全发挥出来了。在2018年的PGCON上,来自日本NTT的Takashi Menjo发表了一个演讲,介绍了一种基于PMDK(详情参见Persistent Memory Development Kit (PMDK))对PG数据库进行改造的技术方案。

他们提出了一种使用PMDK将PG改造成支持非易失性内存的数据库系统。这种改造接近于把PG数据库改造成为一种准内存数据库系统。从而大大提升PG数据库的性能。他们已经将代码提交在PG的Maillist上(https://www.postgresql.org/message-id/CAOwnP3O3O1GbHpddUAzT=CP3aMpX99=1WtBAfsRZYe2Ui53MFQ@mail.gmail.com),有兴趣的朋友可以在这里下载相关的path,有非易失性内存的朋友甚至可以自己去搭个环境测试一下。

可能有朋友会觉得如果有傲腾内存(OPTANE),那么我们直接把整个PG数据库创建在傲腾内存上不就行了,何必去HACK PG源代码呢?当然最为简单的方法是在傲腾内存上直接创建一个内存文件系统,然后把PG数据库全部装在这个文件系统上,利用傲腾内存远低于SSD盘的延时来提升PG数据库的性能,这种做法是最为简单的。不过由于文件IO和内存访问接口之间的性能差异是十分巨大的,因此这种做法无法充分发挥出傲腾内存的性能来。

根据商用解决方案提供商的宣传资料,他们的商用解决方案里,OLTP TPS比传统的PG数据库快15倍。当然这里肯定存在一些场景的问题,不过从理论上说,基于PG+PMEM的方案肯定可以有效的提高数据库的性能。Memhive是商用方案,我们暂时还无法了解更为详细的信息。不过通过Takashi Menjo的演讲材料我们还是可以了解一下具体的实现方式。

使用PMEM优化PG数据库的两条技术路线可以参考上图,使用支持PMEM的文件系统存储PG数据库是最为简单的方案,利用PMDK提供的DAX技术,可以创建一个支持DAX高速访问的全新的内存文件系统,不需要修改PG数据库的代码,取消OS的文件缓冲就可以了。因为PMEM的访问延时已经和物理内存一个数量级了,因此增加PAGECACHE只会增加总体延时,并不会给数据库性能带来很大的好处。

而第二种方法是使用PMDK来改造PG代码,从而用内存操作替代文件IO操作,提升PG的性能。

上面是使用PMDK来改造PG的文件IO函数的方法,我们需要在PG原生的代码中逐条用这些代码去替换相关的操作。当然我们不需要替代所有的PG数据库的文件IO操作,主要针对WAL/CKPT、bgwriter,以及backend读取数据文件的访问进行替换就可以了。

从替换效果上,Takashi Menjo的演讲中也提到了,仅仅改造WAL文件的情况下,其测试结果如下:

使用傲腾存储的情况下,测试用例的TPS为3.26万,使用DAX文件系统提升到3.69万,而使用libpmem修改了PG代码后提升到3.81万。似乎这点提升并不高,不过这和测试用例有关,当所有的负载都是写入数据的时候,libpmem改造后的PG性能是DAX的1.8倍。

随后Takashi Menjo的团队又继续使用libpmem改造PG代码,修改针对relation segments的写入代码进行改造。改造后的结果如下:

在相同的测试场景下,checkpoint的完成延时有了明显的提升,使用傲腾盘的情况下是7.75秒,而DAX文件系统提升了一倍多,降低到3.75秒。而使用libpmem改造PG代码后,再次提升30%,缩短到了2.65秒。CHECKPOINT时间的减少,对于高并发写入数据库性能的提升是显而易见的。

虽然NTT团队的演讲中仅仅发布了他们工作成果的一部分,不过从Takashi Menjo的工作成果来看,使用PMDK+INTEL AEP+PG打造一个高性能PG数据库一体机的整体技术路线是完全可行的。自己动手打造一款自己的MEMHIVE数据库系统的基础条件已经完全具备了。有兴趣去尝试一下的朋友,可以去参考一下我在本文中发的一些资料,动手去试一试吧。

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值