首页
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云PolarDB一体化解决方案
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品
文档
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源

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中增加一行:

  1. zq_directio = on

PostgreSQL数据库就走到了directio上。

3. 目前的结果

目前测试的结果发现copy数据走directio会慢一些,用pgbench测试是造数据会慢一些,但测试时结果与不用directio 差不多。

但用directio之后,感觉系统会更平稳一些。欢迎大家测试一下,有问题反馈给我。我的微信号为osdba0。