大多数主流数据库都会使用 direct IO,但 PostgreSQL 为啥不使用?是出于什么考虑呢?我的理解是不使用 direct IO,在 buffer pool 和 os page cahce 都存一份,双重开销,内存利用率差。性能依赖各个操作系统实现的 os page cahce,不能保证跨 OS 间的一致性。而且不好做隔离啥的,比如多个 postgreSQL 实例在同一台计算机上 os page cache 冲突的问题,不知道 docker 能否在这个层面上做隔离?
1
Aoang 2021-02-11 15:13:42 +08:00 via Android 1
设计问题,真想知道最初的原因…可能只能问那群人了,不过还是可以猜一猜的。
PostgreSQL 诞生于实验室中,目的是为了研究数据库内核原理。使用 buffer io 能够减少 IO 栈的开发量,从而更加专注于数据库内核原理,所以 PostgreSQL 才会有相当丰富的 SQL 语法、执行算法和优秀的执行优化器等功能,当然还可以提一下优秀的扩展性。 另外,PostgreSQL 采用多进程的并发机制,多进程和多线程对内存的使用方式上存在区别也是一个原因,page cache 可以看做多进程之间的一种数据共享方式,在流复制中,通过 buffer io 从 page cache 读取 wal 可以减少物理读的频率 |
2
stabc 2021-02-11 16:18:42 +08:00
什么是"buffer pool "?"不能保证跨 OS 间的一致性"是什么意思?
|
3
CRVV 2021-02-11 16:34:54 +08:00
随便搜了一下
https://www.postgresql.org/message-id/4C1A6339.9080300%402ndquadrant.com > every experiment I've ever seen that tries to add more direct I/O to the database has failed to improve anything 这个帖子比较老了,但 2020 年还有人对比测试了 Oracle 和 PostgreSQL https://fritshoogland.wordpress.com/2020/01/25/oracle-and-postgres-disk-io-performance/ 结论是 PostgreSQL 不用 Direct I/O 但某些情况下还比 Oracle 快。 如果再搜一下 Linux Direct I/O,会找到很多人说这玩意不好用,包括 Linus Torvalds 。 这么看一圈下来,不用 Direct I/O 是个很正常的决策了;当然如楼主所说,用 Direct I/O 也有优点用它当然也是合适的。 |
4
wevsty 2021-02-11 19:09:15 +08:00
依赖 OS 提供的 Cahce 才能保证跨 OS 的一致性,不然各种平台 API 可能都不一样,就完全得自己去封装出一套 IO 框架。
自己对底层 IO 封装的话,要跨 OS 多少都是要做出牺牲的,而且开发维护会更加麻烦。 |
5
laminux29 2021-02-11 23:11:27 +08:00
没记错的话,这数据库连内存表都没支持到位,作者在解释这个问题时还找了借口。
目前传统数据库,功能最齐全的,应该就是 Oracle,可惜贵了点。 |
6
zhangysh1995 2021-02-17 15:34:38 +08:00
@stabc 好问题。楼主没解释清楚感觉讨论没什么必要。
|