Hotdry.

Article

Linux 7.0 调度器回归:PREEMPT_NONE 移除如何导致 PostgreSQL 性能腰斩

深度解析 Linux 7.0 内核移除 PREEMPT_NONE 预emption模式后,PostgreSQL 在 AWS Graviton4 等平台吞吐量下降 50% 的根因与工程应对策略。

2026-04-29systems

Linux 7.0 内核的一个调度器改动引发了数据库社区的广泛关注。2026 年初,多位运维工程师和 AWS 平台用户报告称,在升级到 Linux 7.0 后,PostgreSQL 的事务处理能力出现了显著下降,部分场景下吞吐量甚至下降至原来的一半。这一现象并非孤例,而是在多个架构和云环境中被反复观测到,其中 AWS Graviton4(ARM64)平台的表现尤为突出。本文将从技术原理出发,分析这一调度器回归的根本原因,并给出可行的缓解策略与工程实践建议。

调度器预 emption 模式的基础概念

Linux 内核提供了多种预 emption(抢占)模式,用于平衡系统吞吐量和响应延迟。PREEMPT_NONE 是传统服务器工作负载的默认选择,它不在内核代码路径中强制插入抢占点,从而最大化计算任务的连续执行时间,减少上下文切换开销。对于 PostgreSQL 这类依赖大量用户态自旋锁和共享内存访问的数据库系统来说,PREEMPT_NONE 能够确保锁持有期间不会被调度器强行中断,避免了不必要的锁争用和缓存失效。

相比之下,PREEMPT_VOLUNTARY 会在内核中增加自愿抢占点,提升交互式响应速度;而 PREEMPT_RT(实时抢占)则将几乎所有内核代码路径变为可抢占的,以牺牲一定吞吐量为代价换取极低的延迟。长期以来,主流发行版在 x86_64 和 ARM64 架构上都默认使用 PREEMPT_NONE,这一选择在大量数据库和后端服务实践中被证明是稳定且高效的。

Linux 7.0 的关键改动

Linux 7.0 在调度器架构层面进行了简化,移除了多个架构上的 PREEMPT_NONE 作为默认选项。这一设计变更导致受影响平台只剩下两种预 emption 模式可选:完全抢占(PREEMPT)和惰性抢占。在实际部署中,这意味着原本依赖无抢占特性的工作负载被迫进入更高频率的内核抢占循环。

对于 PostgreSQL 而言,后果是致命的。PostgreSQL 的并发控制机制大量使用用户态的自旋锁来保护共享数据结构,当这些自旋锁被内核抢占打断时,不仅会导致锁持有时间延长,还会造成 CPU 缓存失效和分支预测失败。实验数据表明,在 AWS Graviton4 上运行 pgbench 简单更新测试时,Linux 7.0-rc 版本的吞吐量下降至约 50%,延迟显著上升,TPS(每秒事务数)从数万跌至不足两万。

性能回归的量化表现

根据社区反馈和基准测试数据,Linux 7.0 调度器变更对 PostgreSQL 的影响可以通过以下几个维度量化。在 8 并发客户端的 pgbench 测试中,Graviton4 实例的事务处理能力下降约 45% 至 55%;高并发写入场景下的锁等待时间增加了 2 到 3 倍;平均事务延迟从原本的个位数毫秒上升至十几毫秒。这一影响在依赖大量短事务的 OLTP 负载中尤为明显,而对于以复杂查询为主的 OLAP 场景,影响相对较小但仍可感知。

值得注意的是,这一回归并非 Linux 7.0 独有。类似的问题在某些发行版的中期维护版本中也曾出现,但影响范围和严重程度均不及此次。AWS 工程师在内部测试中确认了这一问题,并将其归类为需要内核层面修复的高优先级缺陷。

根因分析

从技术角度来看,问题的核心在于内核抢占行为与用户态锁的交互。PostgreSQL 的进程间通信和共享内存访问高度依赖内核提供的原子操作和内存屏障。当内核在用户态代码执行过程中强行进行抢占时,正在自旋等待锁的进程会被挂起,而持有锁的进程可能因抢占而延迟释放锁,从而形成连锁的锁争用效应。PREEMPT_NONE 的存在本质上为这类工作负载提供了一个相对稳定的执行窗口,使其能够在一个抢占周期内完成锁的获取和释放。

Linux 7.0 移除该模式后,内核调度器变得更加积极地尝试抢占任何长时间运行的任务,这直接破坏了 PostgreSQL 长期以来依赖的调度假设。在 ARM64 架构上,由于内存顺序模型和缓存一致性的特殊性质,这一问题被进一步放大,导致性能回退比 x86_64 平台更加明显。

缓解策略与工程实践

面对这一回归,运维团队和数据库管理员可以采取以下几种应对措施。首先,最直接的方式是在生产环境中暂缓升级 Linux 7.0,等待内核社区发布官方修复或发行版提供回滚 PREEMPT_NONE 的补丁。目前 Debian、Ubuntu 和 RHEL 社区均在讨论相关修复方案,部分厂商已推出包含 PREEMPT_NONE 恢复的定制内核。

其次,可以考虑在应用层启用 Restartable Sequences(RSEQ)扩展。RSEQ 是 Linux 4.18 引入的一项技术,旨在为用户提供态提供高效的线程局部存储和快速路径恢复能力。PostgreSQL 社区已经开始讨论利用 RSEQ 的 timeslice 扩展来减轻调度器变更带来的负面影响。虽然该方案需要重新编译 PostgreSQL 并确保内核支持 RSEQ,但它可以在不改变内核配置的情况下部分恢复性能。

第三,对于在云环境中的部署,建议关注云厂商提供的内核镜像更新。AWS 已在后续的 Amazon Linux 镜像中回滚了部分调度器变更,并在官方文档中给出了针对 Graviton 实例的推荐内核版本。阿里云和 Google Cloud 也同步跟进,提供了经过测试的稳定内核版本供用户使用。

第四,在基准测试和容量规划层面,运维团队应当在升级内核前使用 pgbench 或生产级别的真实 workload 进行性能验证。推荐的做法是建立一个灰度环境,在相同的硬件配置下对比升级前后的 TPS 和延迟指标,确保业务系统能够接受潜在的性能变化。

总结与建议

Linux 7.0 调度器的预 emption 模式变更是一个典型的内核演进与遗留工作负载兼容性冲突的案例。PREEMPT_NONE 的移除虽然简化了内核维护并提升了交互式体验,但却在无形中损害了 PostgreSQL 等数据库系统的吞吐量表现。对于运行关键数据库服务的团队来说,建议在内核升级前充分评估兼容性风险,密切关注发行版的补丁动态,并在必要时保留使用稳定内核版本的灵活性。在问题得到根本解决之前,通过暂缓升级、选用云厂商优化镜像或启用 RSEQ 等 workaround,可以在一定程度上缓解性能回退带来的影响。


参考资料

  • Linux 7.0 PREEMPT_NONE 移除与 PostgreSQL 性能回归报告(UBOS Tech)
  • LWN.net:重新审视内核预 emption 模型

systems