最近有朋友和我们交流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,而这个PAGE在Shared Buffers中被多次使用,期间不再需要再次从文件中读取,因此OS CACHE中的缓冲的效率其实并不高,甚至可能会产生负面的作用。对于PAGE的写入也是如此,你不知道PAGE是写入文件
PostgreSQL的DoubleBuffering:理解、挑战与个性化优化,

本文探讨了PostgreSQL中的DoubleBuffering机制,解释了其工作原理、优点与缺点,强调了个性化优化和根据系统负载调整缓冲区配置的重要性。作者指出,虽然Oracle近年来解决了DoubleBuffering问题,但在PostgreSQL中它仍然是关键考虑因素,特别是对于大型数据库系统。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



