1. 为什么需要directio
我们知道PostgreSQL默认可以让WAL日志走到directio,但数据文件走不到directio。所以在PostgreSQL中存在double buffering问题,很早社区就讨论过:
但是社区一直没有实现directio,原因是PostgreSQL与文件系统的缓存绑定的比较深,不太好实现。
而double buffering会导致什么问题呢?导致的问题就是内存利用率不高。同一个数据快在文件系统缓存中有一份,在数据库的shared_buffer中还有一份。所以对于我们DBA来说,为了提供缓存利用率,要不把数据库的shared_buffer设置的比较小,如4G~8G,更多是使用文件系统缓存。另一种方法是把shared_buffer设置的比较大,但是这个方法在Linux存在问题,因为Linux下不能限制文件缓存占用总内存的百分比,有一些麻烦。
这个问题对于有一些云厂商会更麻烦,有一些云厂商,不用租户的数据库是直接放在物理机上的,而物理机共享文件系统的缓存,导致RDS的内存控制不是严格的。
所以虽然直接让PostgreSQL数据库走到directio上,会有一些缺点,但是还是使用directio后会让系统更问题,所以还是有一些意义的。
2. directio的实现
directio要求内存地址按4k对齐,但是PostgreSQL数据库的内存分配并不是按4k对齐的。所以只在打开文件时加上directio的标志是不行的,还需要改一些内存对齐的地方。
具体的代码请见:
https://gitee.com/csudata/diopg13.1
在数据库的配置文件postgresql.conf中增加一行:
zq_directio = on
PostgreSQL数据库就走到了directio上。
3. 目前的结果
目前测试的结果发现copy数据走directio会慢一些,用pgbench测试是造数据会慢一些,但测试时结果与不用directio 差不多。
但用directio之后,感觉系统会更平稳一些。欢迎大家测试一下,有问题反馈给我。我的微信号为osdba0。