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 等高负载数据库管理系统尤为关键。
性能分析显示:
- s_lock() 中的时间膨胀至总 CPU 的 55%。
- pgbench 负载下吞吐量和响应性下降。
- 仅影响支持 LAZY 模式的架构。
专家指出,内核 7.0 最终测试阶段限制了回退选项,以免引入新回归。
提议的修复
迪皮特罗提议默认回退至 PREEMPT_NONE,并将其与 ARCH_NO_PREEMPT 解耦。补丁作者兼调度子系统维护者齐尔斯特拉坚持优化 PostgreSQL:
- 使用内核的 rseq(Restartable Sequences,可重启序列)扩展,最小化锁持有者的抢占。
- 优化用户空间代码中的自旋锁处理。
rseq 扩展可实现序列状态的原子检查与更新,降低中断关键代码段的风险。
社区立场与 Linus 的决定
OpenNET 专家强调林纳斯·托瓦兹的原则:内核不得降低性能或破坏用户空间兼容性。内核回退(发布风险)与 PostgreSQL 修复(需调整数据库管理系统)之间的僵局尚未打破。
对于在 ARM64 上测试 PostgreSQL 的中高级开发者:
- 在内核 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
暂无评论。