PostgreSQL 为什么不使用 direct IO,而要依赖 os page cahce?

2021-02-11 14:42:08 +08:00
 zzkde

大多数主流数据库都会使用 direct IO,但 PostgreSQL 为啥不使用?是出于什么考虑呢?我的理解是不使用 direct IO,在 buffer pool 和 os page cahce 都存一份,双重开销,内存利用率差。性能依赖各个操作系统实现的 os page cahce,不能保证跨 OS 间的一致性。而且不好做隔离啥的,比如多个 postgreSQL 实例在同一台计算机上 os page cache 冲突的问题,不知道 docker 能否在这个层面上做隔离?

2448 次点击
所在节点    数据库
6 条回复
Aoang
2021-02-11 15:13:42 +08:00
设计问题,真想知道最初的原因…可能只能问那群人了,不过还是可以猜一猜的。

PostgreSQL 诞生于实验室中,目的是为了研究数据库内核原理。使用 buffer io 能够减少 IO 栈的开发量,从而更加专注于数据库内核原理,所以 PostgreSQL 才会有相当丰富的 SQL 语法、执行算法和优秀的执行优化器等功能,当然还可以提一下优秀的扩展性。

另外,PostgreSQL 采用多进程的并发机制,多进程和多线程对内存的使用方式上存在区别也是一个原因,page cache 可以看做多进程之间的一种数据共享方式,在流复制中,通过 buffer io 从 page cache 读取 wal 可以减少物理读的频率
stabc
2021-02-11 16:18:42 +08:00
什么是"buffer pool "?"不能保证跨 OS 间的一致性"是什么意思?
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 也有优点用它当然也是合适的。
wevsty
2021-02-11 19:09:15 +08:00
依赖 OS 提供的 Cahce 才能保证跨 OS 的一致性,不然各种平台 API 可能都不一样,就完全得自己去封装出一套 IO 框架。
自己对底层 IO 封装的话,要跨 OS 多少都是要做出牺牲的,而且开发维护会更加麻烦。
laminux29
2021-02-11 23:11:27 +08:00
没记错的话,这数据库连内存表都没支持到位,作者在解释这个问题时还找了借口。

目前传统数据库,功能最齐全的,应该就是 Oracle,可惜贵了点。
zhangysh1995
2021-02-17 15:34:38 +08:00
@stabc 好问题。楼主没解释清楚感觉讨论没什么必要。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752942

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX