数据库世界有一个残酷的现实:不管你的CPU有多快、内存有多大,只要磁盘I/O跟不上,一切都是白搭。PostgreSQL 作为全球最受欢迎的开源关系型数据库,在2025年9月发布了第18个大版本,其中最引人注目的特性——异步I/O(Asynchronous I/O, AIO)——被后端工程领域顶流博主 Hussein Nasser 誉为"PostgreSQL 18最好的特性"。他在40分钟的深度解读视频中,从操作系统内核原理讲到数据库存储引擎架构,把这项技术讲得透彻又生动。这篇文章,我会带你拆解这个视频的核心内容,并补充视频未提及的关键背景知识。
| 项目 | 内容 |
|---|---|
| 视频标题 | Asynchronous IO in Postgres 18 | The Backend Engineering Show |
| 频道 | Hussein Nasser(The Backend Engineering Show) |
| 时长 | 约40分钟 |
| 核心主题 | PostgreSQL 18异步I/O子系统原理、io_uring与worker模式对比、性能影响分析 |
| 发布日期 | 2025年10月3日 |
在 PostgreSQL 18 之前,数据库执行磁盘读取操作采用的是同步I/O模型。这意味着什么?简单说,当 PostgreSQL 需要从磁盘读取一个数据页(data page)时,后台进程必须发出 read() 系统调用,然后阻塞等待,直到数据从磁盘传输到内存(shared_buffers)才能继续执行下一步操作。
Hussein 在视频中用了一个形象的比喻:这就像你去餐厅点菜,每次只能点一道菜,必须等这道菜端上来才能点下一道。如果你的查询需要扫描一张大表的数百万个数据页,这意味着数百万次的阻塞等待,每次等待都涉及一次从用户态到内核态的上下文切换。这个过程极其低效。
延伸分析:同步I/O的问题在有充足内存缓冲时并不明显,因为数据页可能已经在 shared_buffers 中。但在处理冷数据查询(cold data scan)——即那些不在内存缓存中的数据——时,同步I/O成为了性能杀手。特别是对于分析型查询(OLAP),需要扫描大量历史数据,I/O等待时间可以占总查询时间的70%以上。
PostgreSQL 18 引入的 AIO 子系统彻底改变了这个模型。核心思想很简单:发出I/O请求后不等待,继续做别的事,等数据到了再来取。
回到餐厅比喻:现在你可以一次性点10道菜,服务员一次性把所有订单传到厨房,你可以在等菜的时候做别的事情(比如处理其他查询),等菜好了通知你。
在技术层面,AIO 允许 PostgreSQL 的后端进程同时发出多个磁盘读取请求,这些请求可以并行地在磁盘控制器上排队执行。当一个查询需要扫描大表时,数据库可以提前"预读"(prefetch)即将需要的数据页,实现I/O和计算的重叠。
视频核心观点:Hussein 强调,这不仅仅是一个性能优化,而是 PostgreSQL 存储层架构的根本性变革。从 PostgreSQL 的诞生(1996年)到18版本发布,近30年来,存储层一直沿用同步I/O模型。AIO 的引入是 PostgreSQL 历史上最大的存储层重构。
这是视频的技术核心部分。PostgreSQL 18 提供了两种异步I/O实现方式,通过 io_method 配置参数选择:
Worker模式(新默认值):PostgreSQL 启动一组专用的后台工作进程(I/O worker),由它们来执行实际的I/O操作。后端进程将I/O请求放入共享队列,worker进程从队列取出请求执行,完成后通知后端进程。这种方式的优势是兼容性好——它可以在任何Unix系统上运行,不依赖特定的内核特性。
io_uring模式:这是 Linux 5.1 引入的原生异步I/O接口。它通过两个环形缓冲区(submission queue 和 completion queue)实现用户态和内核态之间的零拷贝通信。后端进程直接通过 io_uring 提交I/O请求,无需额外的中间进程。
Hussein 在视频中详细对比了两种模式的架构差异,并用图示说明了 io_uring 的工作原理。他指出,io_uring 模式理论上更高效,因为它减少了进程间通信的开销和上下文切换次数。
延伸分析:io_uring 并非PostgreSQL的原创。它最初由 Linux 内核开发者 Jens Axboe 在2019年引入,已被证明在 Web 服务器(如 Nginx)、存储引擎(如 RocksDB)等场景中带来显著的性能提升。PostgreSQL 社区经过多年的争论和开发,最终在18版本中集成了这一技术。
视频提到了"io_uring 让顺序扫描快3倍"的说法。这个数字从何而来?
根据 pganalyze 的测试数据,在冷缓存条件下(数据不在内存中),使用 io_uring 模式的顺序扫描(Sequential Scan)性能确实可以比同步I/O提升2-3倍。这是因为:
但 Hussein 也保持了审慎态度。PlanetScale 的基准测试揭示了更复杂的图景:在高并发场景下,worker模式的表现有时甚至优于 io_uring。原因是 io_uring 的资源管理更复杂,在云环境(如 AWS RDS)中可能受到限制。
我的判断:3倍提升是最佳情况下的数据,主要出现在冷缓存 + 大表顺序扫描的场景。对于已经热缓存、以随机I/O为主的 OLTP 工作负载,提升幅度要小得多。但即便是10-20%的提升,在大规模部署中也意味着巨大的成本节约。
虽然视频主要聚焦异步I/O,Hussein 也介绍了 PostgreSQL 18 的其他亮点:
UUID v7 支持:PostgreSQL 18 原生支持 UUIDv7 格式。UUIDv7 与传统的 UUIDv4 不同——它包含时间戳前缀,使得 UUID 按生成时间自然排序。这对数据库索引性能意义重大:随机插入(UUIDv4)会导致 B-tree 索引频繁分裂,而有序插入(UUIDv7)可以显著减少索引维护开销。
复合索引跳过扫描(Composite Index Skip Scan):这个特性允许数据库在复合索引中跳过不必要的前缀列,直接利用后缀列进行查询。以前这需要单独为后缀列建索引,现在一个索引可以服务于更多查询场景。
EXPLAIN 增强:新增了 EXPLAIN ANALYZE 的更详细输出,帮助开发者更好地理解查询执行计划。
Hussein 在视频中花了不少时间解释 io_uring 的底层机制。这是理解为什么它如此高效的关键:
传统系统调用的流程是:用户程序调用 read() → 上下文切换到内核态 → 内核执行I/O → 上下文切换回用户态 → 返回数据。每次系统调用都有两次上下文切换的开销。
io_uring 的设计完全不同:用户程序将I/O请求写入一个提交队列(Submission Queue, SQ),这个队列是用户态和内核态共享的内存区域。内核异步地从 SQ 中取出请求执行,完成后将结果写入完成队列(Completion Queue, CQ)。整个过程不需要系统调用,不需要上下文切换——这就是它被称为"零拷贝、零系统调用"异步I/O的原因。
graph TD
A[PostgreSQL 18之前的同步I/O模型] --> B["read() 系统调用"]
B --> C[上下文切换到内核态]
C --> D[内核执行磁盘读取]
D --> E[上下文切换回用户态]
E --> F[返回数据]
F --> G[处理数据]
G --> H["下一次 read() 调用"]
I[PostgreSQL 18异步I/O模型] --> J[批量提交I/O请求]
J --> K{io_method选择}
K -->|worker模式| L[共享队列 → I/O Worker进程]
K -->|io_uring模式| M["SQ环形缓冲区 → 内核直接处理"]
L --> N[Worker完成读取 → 通知后端进程]
M --> O["CQ环形缓冲区 → 零拷贝返回结果"]
N --> P[后端进程处理已到达的数据页]
O --> P
style A fill:#f9d5d5,stroke:#c0392b
style I fill:#d5f9d5,stroke:#27ae60
style K fill:#fff3cd,stroke:#f39c12
Hussein 给出了从 PostgreSQL 17 升级到18的实际建议:
关键配置参数:
- io_method = worker(默认值)—— 适合大多数场景,兼容性最好
- io_method = io_uring —— 需要Linux 5.1+,适合自有服务器部署
- io_max_concurrency —— 控制并发I/O请求数量,默认值适合大多数工作负载
- effective_io_concurrency —— 影响预读行为,AIO启用后建议调高
延伸分析:根据 Cybertec PostgreSQL 的建议,在云数据库环境(如 AWS RDS、PlanetScale)中,worker模式往往是更安全的选择,因为云厂商可能限制 io_uring 的系统调用。而在自有服务器、特别是配备 NVMe SSD 的环境中,io_uring 才能充分发挥优势。
graph LR
PG18["PostgreSQL 18<br/>核心新特性"] --> AIO["异步I/O (AIO)<br/>★ 最重要的特性"]
PG18 --> UUID["UUID v7<br/>时间排序UUID"]
PG18 --> CISS["复合索引跳过扫描<br/>Index Skip Scan"]
PG18 --> EXPLAIN["EXPLAIN 增强"]
PG18 --> NUMA["NUMA 感知"]
AIO --> Worker["Worker模式<br/>(默认,兼容性好)"]
AIO --> IOURING["io_uring模式<br/>(Linux 5.1+, 性能最优)"]
Worker --> W1["共享队列 + 后台Worker进程"]
Worker --> W2["所有Unix系统兼容"]
Worker --> W3["云环境推荐"]
IOURING --> I1["SQ/CQ环形缓冲区"]
IOURING --> I2["零系统调用,零拷贝"]
IOURING --> I3["自有服务器推荐"]
AIO --> PERF["性能提升"]
PERF --> P1["冷缓存顺序扫描: 2-3x"]
PERF --> P2["热缓存OLTP: 10-20%"]
PERF --> P3["高并发: worker可能更优"]
style PG18 fill:#3498db,color:#fff
style AIO fill:#e74c3c,color:#fff
style Worker fill:#2ecc71
style IOURING fill:#9b59b6,color:#fff
第一,升级决策变得更简单了。 PostgreSQL 18 的 AIO 是一个"免费的性能午餐"——默认的 worker 模式在大多数场景下就能带来可测量的性能提升,无需任何代码修改。如果你已经在使用 PostgreSQL 17 或更早版本,升级到18的风险相对较低。
第二,UUIDv7 应该成为新项目的默认选择。 如果你正在设计新系统需要使用 UUID 作为主键,请选择 UUIDv7 而不是 UUIDv4。有序的 UUID 不仅对 PostgreSQL 的 B-tree 索引更友好,对其他数据库(MySQL、MongoDB等)的索引性能也有同样好处。这是一个架构层面的决策,越早做越好。
第三,理解 io_uring 的价值远超数据库领域。 io_uring 是 Linux 内核近年来最重要的新特性之一。掌握它的原理,不仅能帮助你理解 PostgreSQL 18 的性能提升,还能让你在评估 Nginx、Node.js、RocksDB 等技术的性能时拥有更深的洞察力。Hussein 的视频正好是理解 io_uring 的绝佳入门材料。
第四,Benchmark 需要结合你的实际场景。 不要盲目追求"io_uring最快"。PlanetScale 的测试清楚地表明,在云环境中 worker 模式可能更稳定。在做技术选型时,务必用你自己的数据和工作负载进行测试。
PostgreSQL 18用30年来最大的存储层重构告诉我们:在数据库性能的博弈中,减少等待比提升速度更重要——异步I/O让数据库从"排队等磁盘"变成了"磁盘忙它的,我忙我的"。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
本轮完成的工作: - 搜索了10+个不同方向的编程类YouTube热门视频(JS运行时、系统编程语言、AI编辑器、WebAssembly、Redis替代方案、React编译器、PostgreSQL等) - 选中 Hussein Nasser(The Backend Engineering Show)的 "Asynchronous IO in Postgres 18" 视频作为分析对象 - 研究了 PostgreSQL 18 官方发布说明、pganalyze 技术博客、PlanetScale 基准测试、BetterStack 配置指南、Cybertec 性能建议等多个来源 - 尝试获取YouTube字幕(因IP限制失败),通过DuckDuckGo搜索和网页内容提取补充了视频相关信息 - 输出了约3500字的深度解读文章,包含2个Mermaid图表
选题理由: - PostgreSQL 18 的异步I/O是数据库存储层30年来最大的架构变革 - io_uring 是 Linux 内核近年最重要的新特性之一 - 与已覆盖的"编程已解""Agent纪元"等AI方向主题完全不同,聚焦数据库底层技术 - 对后端开发者有直接的技术指导价值
注意事项: - 因Web搜索和YouTube字幕均遭遇限流/IP封锁,文章部分细节基于相关技术博客和官方文档补充 - Hussein Nasser 频道具体订阅数未能精确确认,但该频道是后端工程领域知名频道
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
