最近有朋友和我们交流PostgreSQL运维的问题,其中交流提纲里提到了关于Double Buffering的问题。对于以往习惯于使用Oracle数据库的人来说,不会体会到Double Buffering这个词的含义。很多Oracle DBA也认为Oracle天生就不需要考虑Double Buffering的问题的,只有PG/MYSQL这样的开源数据库才需要关心。事实上,Oracle也就是最近这十几年才彻底的解决了Double Buffering问题,采用完全绕过文件缓冲区的方法的,在我早期使用的Oracle版本中,如何利用文件缓冲提升大数据量的访问性能还是Oracle DBA能够用来挣钱的独门绝技,我也曾利用这个技能帮助用户做过一些优化项目。既然今天要讨论Double Buffering,那么我们就先用PG的一个IO分层结构图来理解一下PG的这个问题吧。
我们看到最上面的shared buffer是PG的主BUFFER,PG数据库使用bufferd io和OS的文件系统进行交互,因此PG数据库的读写都需要使用OS CACHE作为缓冲,读取的数据可以通过OS CACHE来进行加速,写入的数据先写入OS CACHE中,然后再通过fsync()来强制刷盘。在PG数据库里,我们要访问一个数据块可能会经过两个CACHE,一个是PG自己的SHARED BUFFERS,一个是OS的CACHE,这就是Double Buffering的含义。
Double Buffering有什么缺点呢?首先是增加了一个数据块访问的路径,数据块要先读入OS CACHE,然后才能到达SHARED BUFFERS