内容提要
PostgreSQL 18 取得重大进步,未来可能引入直接 I/O 以绕过操作系统页缓存。测试显示,在双 SSD 上,直接 I/O 使顺序扫描吞吐从约 3.7 GB/s 提升至 6 GB/s,且 CPU 占用更低,内核开销消失。目前仅为调试功能,不建议生产使用。
延伸解读
直接 I/O 的潜在收益与代价
文章测试显示,在双 SSD 上启用直接 I/O 后,顺序扫描吞吐从约 3.7 GB/s 提升至 6 GB/s,且 CPU 占用更低,内核开销几乎消失。但直接 I/O 绕过了操作系统页缓存,失去了动态缓存、预读和写缓冲等保护。目前 PostgreSQL 18 仅提供调试功能,不建议生产使用。
当前实现的局限性
直接 I/O 在 PostgreSQL 中尚无完整实现,且多年内不会推出。现有调试功能仅支持读操作,异步 I/O 还不支持写。此外,ReadStream 的预读仅用于顺序扫描、位图扫描和 VACUUM,普通索引扫描无法受益,若索引顺序与表顺序接近,性能差异会很明显。
测试环境与瓶颈分析
测试使用两张各 250 GB 的表,分别放在两块 SSD 上,配置了最大并行度(16 个 worker)和 io_uring。标准 I/O 下吞吐约 3.7 GB/s,CPU 占用 50-60%,perf 显示内核存在大量争用。改用直接 I/O 后,瓶颈转移到 PostgreSQL 内部,内核不再出现。
Q&A
PostgreSQL 18 在 I/O 方面有什么重大进步?
PostgreSQL 18 引入了异步 I/O(AIO)和 ReadStream,用于顺序扫描、位图扫描和 VACUUM 的预读,提升了 I/O 性能。
什么是直接 I/O(Direct I/O)?它如何工作?
直接 I/O 是一种绕过操作系统页缓存层的 I/O 方式。它跳过了页缓存提供的缓存、预读和写缓冲等服务,从而减少内核开销,但也会失去这些服务带来的好处。
直接 I/O 在 PostgreSQL 中的测试结果如何?
在双 SSD 测试中,使用直接 I/O 后,顺序扫描吞吐量从约 3.7 GB/s 提升到 6 GB/s,同时 CPU 占用更低,内核开销几乎消失。
目前可以在生产环境中使用 PostgreSQL 的直接 I/O 吗?
不可以。目前直接 I/O 只是一个调试功能(通过 debug_io_direct 参数启用),不建议在生产环境中使用。完整的实现可能还需要很多年。
直接 I/O 有哪些潜在缺点?
直接 I/O 绕过了操作系统页缓存,因此失去了页缓存提供的额外缓存、操作系统预读和写缓冲等功能。这可能导致某些场景(如索引范围扫描)性能下降,因为直接 I/O 只按需提交读取,没有预取。
PostgreSQL 未来会引入直接 I/O 吗?
有可能。文章提到直接 I/O 是未来可能引入的功能,但完整的实现还需要很多年。目前只是一个调试特性,用于展示未来可能性和潜力。