谈了PG的Double Buffering,这一点是很多诟病PG的人经常提到的问题。不过昨天老白也说了,Double Buffering其实也不是什么太大的问题,对于绝大多数PG数据库系统来说,这个问题的负面影响绝对没有网上的那些文章说的那么玄乎,甚至对于绝大多数数据库来说,这个问题我们可以忽略。不过对于一些超大型的PG数据库,比如从Oracle迁移到PG的大型或者超大型数据库来说,我们还是需要做一定的优化工作的。虽然采用buffered io的数据库在DB CACHE的优化上比绕过缓冲区直接读写文件要复杂一些,但是这个问题并不是不可解决的。通过对操作系统与数据库参数的一系列优化,我们也可以让PG数据库充分享受BUFFERED IO的好处,规避Double Buffering的缺点。
第一点是确保有足够的内存,对于采用Buffered IO的数据库系统来说,越大的内存拥有越大的FILE CACHE和DB CACHE,肯定对数据库的性能有所帮助。在X86时代,内存已经不少昂贵的硬件了,因此在配置PG服务器的时候,不要为了省几个内存的钱而让自己今后的运维陷入左右为难的境地是比较明智的选择。除了配置较大内存的数据库服务器硬件之外,关闭NUMA是我们要做的第一件事情。关闭NUMA,不用管远程内存本地内存的成本开销问题,因为远程内存再慢也比硬盘快得多。在服务器与操作系统层面均关闭NUMA,可以让物理内存被均匀的使用,不会因为一个NODE上分配内存过大而导致在物理内存尚有很多空闲的时候,出现不必要的换页。对于这个问题,以前老白发过的一篇文章《Postgresql和NUMA》可以参考。
第二是大页的设置,一定要让shared buffers使用大页,对于大型PG数据库来说,这一点十分关键,如果不使用大页,