我不认为PG的Double Buffering是更优秀的解决方案

关于PG在Shared buffers上的DOUBLE BUFFERING设计,一直是争议极多的。有一些搞PG的朋友认为这是PG充分利用OS CACHE的一种特殊设计,是PG数据库设计中比较优秀的地方。还有一些朋友则认为这是一种过时的设计,与当前数据库技术的发展潮流所相违背的。前些天有几个朋友谈到这个问题,希望我写篇位置表达下我的观点。

以我这些年做数据库优化的经验来看,DOUBLE BUFFERING的设计如果算是一种技术上的进步,在这一点上我一直是不太认同的。众所周知,现在几乎所有的现代数据库产品都是用AIO/DIO等方式来访问底层存储系统,只有PG目前还通过BUFFER/CACHE来读取物理文件。随着现代硬件的发展,BUFFERED IO的劣势越来越显现出来了。如果我们采用直接IO,绕过文件缓冲,那么就可以绕过BUFFER CACHE这一层,让数据从文件到内存更为直接,这会大幅提升OS到数据库缓冲的数据交换的吞吐能力,同时,因为DMA等技术的使用,可以让文件IO消耗的CPU资源更少,让系统更为高效。这对于大型数据库系统来说绝对是十分必要的。PG数据库越来越被用于大型OLTP系统,直接IO替代BUFFERED IO肯定可以有效增加大型系统的并发IO能力。

另外一个方面,操作系统是无法充分理解数据库的PAGE访问逻辑的,因此操作系统缓冲的效率比较shared buffers而言,要低的多。两个分别由RDBMS和OS管理的分离的缓冲的效率肯定没有一个独立的数据库缓冲高,这个应该也是广大研发人员的共识。不过这句话成立的前提是数据库缓冲区被设计的十分高效,其LRU算法也被设计的十分合理。通过分析Oracle DB CACHE的算法的改进,我们也了解到为什么Oracle的DB CACHE能够保持那么高的DB CACHE命中率了。

既然使用统一缓冲,消除DOUBLE BUFFERING那么重要,那么为什么PG还在坚持使用DOUBLE BUFFERING呢?这个原因十分复杂,实际上最近这些年里,PG社区也在这方面做着不断的努力。通过利用OS的AIO来替代当前bufmgr.c中的BUFFERD IO操作,不过PG的IO堆栈太长了,在大量的代码中都存在和buffered io相关的内容,再加上PG的文件结构导致的预读、连续块访问的IO合并等问题,要解决这个问题并不容易。在IO路径上,不仅仅需要修改bufmgr.c,在smgr.c,xlog.c,到底层的md.c,fd.c,甚至backend等模块中都有大量IO相关的代码需要修改。这些修改不仅仅是在调用文件IO时的函数调用的修改,还涉及到异步IO模式的修改,以及IO优化、预读等一系列的问题。因此这部分的修改中左虽然已经进行了数年,但是要出现在正是发布的版本中,依然还需要一定的时间。这也成为PG代码中的XID64之外的又一个老大难的问题。

除此之外,在shared buffers的管理上,也需要做相应的优化,否则哪怕底层IO改为了AIO,buffer contention冲突也会让一个大型的统一的数据库缓冲的性能出现问题。比如在Oracle上遇到的buffer busy waits等待,可能会在PG上放大,从而在高并发访问时引发严重的性能问题。

举个最简单的场景,那就是当多个backend需要访问相同的一组PAGE的时候,PG目前的管理算法上海经常会出现lwlock等待方面的超时等问题。而Oracle从9i开始已经优化了这方面的算法,当多个并发的会话访问相同的block的时候,首先为这个BLOCK申请db cache的会话会PIN住这个BUFFER HEADER,然后开始加载这个block(当然也包含IO合并以及预读,多块读方面的算法优化),其他并发访问相同数据的会话就会等待“read by another session”,这个等待事件是Oracle 10g才开始引入的,在9i中等待的依然是buffer busy waits,不过reason code(P3)参数是特殊的,从reason code可以缺别处这种特殊的热块冲突类型。当PG在这方面算法没有做优化之前,就无法区分这种情况,也就无法与AIO配合,达到最低成本的开销。

PG消除DOUBLE BUFFERING,在技术发展上来说,是必须要做的事情,只不过因为历史欠债还是较多,这方面的改造工作量很大,需要一些时间来完成。一旦PG完成这个改造,将可以充分利用AIO的能力,大幅提升PG数据库读写的能力,从而让PG数据库真正向大型关系型数据库迈出一大步。目前我们有很多数据库企业都是基于PG生态在做研发,我也希望我们的数据库厂商能够在这方面多投入一些研发,为PG社区解决这个难题提供一些中国方案。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/271736.html<

(0)
运维的头像运维
上一篇2025-05-08 10:21
下一篇 2025-05-08 10:22

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注