返回首页

Linux 7.0 PostgreSQL ARM64 性能回归

在 Linux 7.0 中,调度器回归导致 ARM64 上 PostgreSQL 性能减半,原因是 PREEMPT_LAZY 和 s_lock() 中时间增加。Amazon 建议回滚,Zijlstra — 用户空间中的 rseq。预计在发布前解决。

Linux 7.0 上 PostgreSQL 两倍下降:s_lock 问题
Advertisement 728x90

Linux 7.0 回归问题导致 PostgreSQL 在 ARM64 上 s_lock() 时间翻倍

亚马逊开发者萨尔瓦托雷·迪皮特罗在测试预发布版 Linux 内核 7.0 上的 PostgreSQL 时,发现 ARM64 系统性能下降。在 simple-update 场景下的 pgbench 测试中,TPS 从 98,565 降至 50,751——几乎减半。该问题源于任务调度器的抢占模式变更:默认从 PREEMPT_NONE 切换至 PREEMPT_LAZY(针对支持的架构)。

这一变更导致用户空间的 PostgreSQL 在 s_lock() 调用上占用 55% 的 CPU 时间。内核 7.0 将用于 Ubuntu 26.04 LTS,预计 2026 年 4 月中旬发布。

回归细节与分析

调度器变更由彼得·齐尔斯特拉实施,激活了 PREEMPT_LAZY,与 ARCH_NO_PREEMPT 绑定。在 ARM64 上,这会增加任务抢占频率,对于 PostgreSQL 等高负载数据库管理系统尤为关键。

Google AdInline article slot

性能分析显示:

  • s_lock() 中的时间膨胀至总 CPU 的 55%。
  • pgbench 负载下吞吐量和响应性下降。
  • 仅影响支持 LAZY 模式的架构。

专家指出,内核 7.0 最终测试阶段限制了回退选项,以免引入新回归。

提议的修复

迪皮特罗提议默认回退至 PREEMPT_NONE,并将其与 ARCH_NO_PREEMPT 解耦。补丁作者兼调度子系统维护者齐尔斯特拉坚持优化 PostgreSQL:

Google AdInline article slot
  • 使用内核的 rseq(Restartable Sequences,可重启序列)扩展,最小化锁持有者的抢占。
  • 优化用户空间代码中的自旋锁处理。

rseq 扩展可实现序列状态的原子检查与更新,降低中断关键代码段的风险。

社区立场与 Linus 的决定

OpenNET 专家强调林纳斯·托瓦兹的原则:内核不得降低性能或破坏用户空间兼容性。内核回退(发布风险)与 PostgreSQL 修复(需调整数据库管理系统)之间的僵局尚未打破。

对于在 ARM64 上测试 PostgreSQL 的中高级开发者:

Google AdInline article slot
  • 在内核 7.0-rc 上基准测试 pgbench 性能。
  • 通过 perf 监控 s_lock() 中的 %CPU。
  • 在项目中考虑 rseq 优化锁机制。
  • 关注 LKML 上的调度器补丁。

关键点

  • 回归因 PREEMPT_LAZY 导致 PostgreSQL 在 ARM64 上的 TPS 减半。
  • 齐尔斯特拉推荐用户空间使用 rseq 扩展,而非内核回退。
  • 托瓦兹将在 2026 年 4 月 Linux 7.0 发布前拍板。
  • 测试 rc 版本:perf record -e cycles 用于 s_lock() 分析。

— Editorial Team

Advertisement 728x90

继续阅读