很多人都有一个习惯性认知:
系统版本越新,性能一定越好
内核升级,默认是“利大于弊”
但这一次,Linux 7.0 狠狠打了这个认知一巴掌。
最近社区里有个挺炸的测试结果:
AWS 工程师在 Graviton4 上跑 PostgreSQL,
换成 Linux 7.0 开发版之后——
吞吐量直接掉到原来的一半左右
延迟明显变差
不是小波动,是那种你一眼就能看出来“系统出问题了”的级别。
很多人第一反应肯定是:
- SQL 写错了?
- 参数没调好?
- PostgreSQL bug?
但这次都不是。
问题在更底层——内核调度行为变了。
本质原因:内核改了“抢占规则”
简单说,这次 Linux 7.0 在“什么时候打断一个任务”这件事上,策略发生了变化(也就是所谓的抢占模型调整)。
这听起来很底层,但对 PostgreSQL 影响非常大。
为什么?
因为 PostgreSQL 的并发模型,本来就很依赖这种调度行为:
- 多进程模型
- 大量锁竞争
- 用户态自旋锁
一旦内核更容易把“持锁的进程”切走,就会出现一个很典型的问题:
- 锁在你手里
- 你被调度走了
- 其他进程全部干等
- CPU 开始空转
最终结果就是:
- 吞吐下降
- 延迟上升
- 系统看起来还挺忙(但都是无效工作)
这件事最关键的点:不是 bug,是“规则变了”
很多人会问:
那是不是 Linux 7.0 有 bug?
严格来说,不算。
更准确的说法是:
- Linux 7.0 改了调度规则
- PostgreSQL 还没适配这个新规则
这就导致原本正常的运行模式,在新内核下变成了“低效路径”。
那现在怎么解决?
目前社区其实已经在讨论两个方向:
方案一:让内核回退
把相关抢占行为改回去,让 Linux 继续适配 PostgreSQL。
好处:简单粗暴,立刻恢复性能
问题:内核开发者一般不太愿意“倒退设计”
方案二:让 PostgreSQL 适配
修改 PostgreSQL 的实现(比如结合 RSEQ 机制),去适应新的调度方式。
这也是目前内核社区更倾向的方向
一句话总结就是:
不是内核迁就你,是你要跟上内核演进
重点来了:这对生产环境意味着什么?
很多人平时升级系统的流程是这样的:
- yum update / dnf upgrade
- 重启
- 完事
但这次的事情说明一个问题:
内核升级,已经不是“默认安全”的操作了。
特别是这几种情况,一定要谨慎:
- PostgreSQL 高并发业务
- 跑在云厂商新硬件(尤其 ARM)
- 对延迟敏感的 OLTP 系统
- 没做过内核级压测
给一个非常现实的建议
在最终结论出来之前,我的建议就一句话:
跑 PostgreSQL 的生产环境,先不要升级到 Linux 7.0
原因很简单:
这不是“可能有影响”,而是已经有人测出来:
性能可能直接掉 50%
数据库这种核心组件,一旦掉这个量级,基本就是事故级别了。
