PostgreSQL 16中的实验性directio:真正的directio何时到来?

发表时间: 2023-11-14 15:47

背景

PostgreSQL之前一直被人诟病的地方就是需要使用文件系统缓存,有double buffering的问题,即数据块缓存可能同时存在文件系统缓存中和自己的共享缓存中,形成内存的浪费。

用directio方式可以避免double buffering问题,但由于现有的PostgreSQL数据库代码是在有文件系统缓存的基础上做的开发,如果贸然直接把IO切换成directio,会导致一些场景的性能大大下降,引入一些新的问题,所以社区一直没有实现directio。

最近这几年社区终于行动起来了。社区的思路是在PostgreSQL 16中实现了directio,但是把此特性放在了实验性质里并提醒用户该特性可能导致性能下降,请斟酌使用,在后续的版本(可能是17或之后)会推出高性能的directio功能。

使用方法

PostgreSQL 16增加了数据库参数debug_io_direct,可以取下面三个值的组合:

  • wal_init: 表示建新的wal文件时使用directio
  • wal: 表示读写wal文件时使用directio
  • data: 表示读写数据文件时使用directio

这三个值对应代码中的三个标志位:

#define IO_DIRECT_DATA			0x01#define IO_DIRECT_WAL			0x02#define IO_DIRECT_WAL_INIT		0x04

在postgresql.conf配置此参数开启directio:

请前往中启乘数科技官网查看全文:
https://www.csudata.com/csu_article/10255