Hotdry.
systems-engineering

Postgres 17 与 18 基准测试:OLTP 查询吞吐量、索引效率及并发扩展升级指南

通过基准测试剖析 Postgres 18 的 I/O 优化对 OLTP 的影响,指导查询吞吐、索引和并发升级。

在 OLTP(在线事务处理)工作负载中,数据库的查询吞吐量、索引效率和并发扩展能力直接决定了系统的整体性能。Postgres 18 引入了 io_method 配置选项,提供了 sync、worker 和 io_uring 三种 I/O 处理方式,这为优化读密集型 OLTP 场景带来了新机遇。相较于 Postgres 17,18 版本在这些方面的改进可以显著提升系统响应速度,尤其是在高并发环境下。本文基于基准测试结果,分析这些改进的实际效果,并提供可落地的升级参数、监控清单和风险控制策略,帮助工程师决定是否及如何从 17 升级到 18。

首先,从查询吞吐量角度来看,Postgres 18 的 I/O 优化在直线性能上表现出色。基准测试显示,在单连接读 - only 工作负载下,使用默认 range_size=100 的 oltp_read_only 测试,Postgres 18 的 sync 和 worker 模式比 17 版本快约 10-20%,特别是在网络附加存储(如 AWS gp3)上。这得益于 worker 模式的后台进程处理 I/O 操作,减少了主线程的阻塞。举例而言,在 8 vCPU、64 GB RAM 的 r7i.2xlarge 实例上,gp3 存储(3k IOPS)下的 QPS(每秒查询数)从 17 版本的约 500 提升到 18 版本 worker 模式的 600 左右。对于更大的 range_size=10000(模拟更复杂的范围扫描和聚合),差异缩小,但 18 版本仍保持 5-10% 的优势。这表明,对于点查询和小型范围扫描主导的 OLTP 场景,升级后吞吐量可预期提升,尤其当数据规模远超内存时(测试中 300 GB 数据 vs 64 GB RAM)。

证据支持这一观点:测试采用 sysbench 工具,创建 100 个表各 1300 万行,总数据约 300 GB,确保 I/O 密集型负载。在本地 NVMe 存储上,所有模式性能趋近,但网络存储受益最大。这里的关键是 io_method=worker 作为新默认值,能在不依赖特定内核接口(如 io_uring)的情况下实现异步 I/O 益处,避免了 17 版本的同步阻塞瓶颈。

接下来,索引效率是 OLTP 升级的另一焦点。Postgres 的索引扫描(如 B-tree)在读操作中占比高,18 版本的 I/O 改进间接提升了索引访问速度。基准中,range_size 参数控制扫描范围:小范围(100)模拟点选和短扫描,大范围(10000)模拟聚合查询。在小范围测试下,worker 模式下索引命中率和扫描效率更高,因为后台 worker 能并行处理多个 I/O 请求,减少等待时间。测试结果显示,在高 IOPS io2 存储(16k IOPS)上,18 版本的索引相关 QPS 比 17 高 15%,这归因于 effective_io_concurrency 参数的优化潜力。在大范围扫描中,CPU 负载增加(聚合 10k 行),I/O 优势减弱,但 18 版本的 io_uring 在 NVMe 上略胜一筹,QPS 提升 5%。总体而言,索引效率改进主要体现在低延迟存储上,对于 OLTP 的二级索引查询(如用户会话过滤),升级可降低平均响应时间 10-20 ms。

为了落地这些改进,建议在升级前进行参数调优。核心配置包括:shared_buffers 设置为 RAM 的 25%(如 16 GB),effective_cache_size 为 75%(48 GB),以优化缓存命中。针对 I/O,io_method=worker(默认),并设置 io_workers=3-8,根据 vCPU 数调整(测试中默认 3 已有效)。对于索引效率,random_page_cost=1.1(假设 SSD),effective_io_concurrency=200(针对多列索引)。work_mem=64 MB 确保排序和聚合不溢出磁盘。升级清单如下:

  1. 基准测试准备:使用 sysbench 模拟 OLTP 负载,设置 TABLES=100, SCALE=13000000,确保数据规模 > RAM 2-3 倍。运行 oltp_read_only,变参:threads=1/10/50, range_size=100/10000,各 5 分钟 x 4 次重复。

  2. 配置迁移:从 17 复制 postgresql.conf,添加 io_method=worker。启用 track_io_timing=on 监控 I/O 延迟。

  3. 性能验证:升级后对比 QPS 和 95th 百分位延迟。阈值:QPS 提升 <5% 则检查存储 IOPS;索引扫描时间>50 ms 则调高 default_statistics_target=100。

  4. 回滚策略:准备 17 版本镜像,监控 wal_level=replica,确保 max_wal_size=16 GB。测试期内设置 checkpoint_completion_target=0.9 避免 checkpoint 风暴。

最后,并发扩展是 OLTP 升级的核心挑战。高并发(50 连接)下,基准显示 IOPS 和存储延迟成为瓶颈。在 gp3-10k(10k IOPS)上,18 版本 worker 模式的总 QPS 达 20000+,比 17 高 8%,但 io_uring 在低并发(10 连接)下表现逊色,表明其适合高 I/O 并行场景。对于 OLTP 的并发用户(如电商订单查询),建议 max_parallel_workers=8,max_parallel_workers_per_gather=4,利用 18 版本的并行 I/O。成本考虑:本地 NVMe 实例(如 i7i.2xlarge)QPS 最高(300k IOPS),月成本约 550 USD,性价比胜过 io2(1513 USD)。风险包括 io_uring 在网络存储上的不稳定性,仅在内核 5.1+ 和调优后使用;OLTP 写负载未测试,建议补充 pgbench 读写混合基准。

监控要点清单:1. 使用 pg_stat_statements 跟踪 top 查询 I/O 时间;2. 警报 IOPS 利用率 >80% 或平均 I/O 延迟 >10 ms;3. 并发峰值下观察 bgwriter_lru_maxpages=100 是否足够;4. 定期 autovacuum,scale_factor=0.05 防表膨胀影响索引。

综上,从 17 到 18 升级对 OLTP 有益,尤其在读吞吐和索引上,但需匹配存储类型。实际部署中,先小规模测试,预期 ROI 在高并发场景下达 15% 性能提升。

资料来源:基于 PlanetScale 的 Postgres 17 vs 18 基准测试报告(2025 年 10 月),以及 PostgreSQL 官方文档的 io_method 配置说明。

(字数:约 1050 字)

查看归档