※この記事はアフィリエイト広告を含みます
Linux 7.0下PostgreSQL性能下降50%!?调度器变更的陷阱
📰 新闻概述
- 性能剧烈下降: 在搭载Linux 7.0的96-vCPU Graviton4机器上,PostgreSQL的吞吐量与Linux 6.x相比下降了大约一半(约9.8万条→约5万条/秒)。
- 瓶颈的识别: AWS的工程师Salvatore Dipietro的调查发现,CPU时间的55%以上消耗在
s_lock(自旋锁)函数中。 - 调度器的仕様变更: 在Linux 7.0中,之前推荐的服务器配置“PREEMPT_NONE”被废除,强制应用“PREEMPT_LAZY”或“FULL”。
💡 重要要点
- 自旋锁的崩溃: 持有自旋锁的线程被内核中断执行(抢占),导致其他线程在等待该锁时处于空转状态,形成“负循环”。
- StrategyGetBuffer的竞争: PostgreSQL在共享缓冲池中查找缓冲时使用的
StrategyGetBuffer函数的竞争带来了致命的损害。 - 现代架构的挑战: 在96 vCPU的多核环境和高并发负载下,操作系统调度的微小差异使整个系统面临瘫痪的风险。
🦈 鲨鱼的眼(策展人的视角)
这条新闻是操作系统“本意良好的进化”对数据库等中间件核心的直接打击的一个非常有趣的例子啊!
尤其是,Linux 6.12中作为妥协方案引入的“PREEMPT_LAZY”,在像PostgreSQL这样高度依赖自旋锁的高负载服务器工作负载中显得不足,这一点尤为具体。55%的CPU时间被一个函数s_lock消耗的事实,显示了操作系统的抢占(中断)是多么精细地平衡。考虑迁移到Linux 7.0的工程师们,必然需要应用补丁或进行配置更改,以避免这个“调度器的陷阱”!
🚀 接下来会怎样?
在Linux内核社区中,针对像PostgreSQL这样的案例进行抢占控制补丁的讨论和修正的引入的可能性很高。此外,数据库方面也可能加速向不再过度依赖自旋锁的更高级的无锁算法的转变。
💬 鲨鱼视角的一句话
最新的操作系统并不一定意味着更快!自旋锁让人头晕,鲨鱼都快变成黄油了呢!🦈🌀
📚 术语解读
-
抢占: 操作系统强制中断正在执行的进程,并将CPU分配给其他进程。
-
自旋锁: 一种轻量级同步机制,CPU在锁释放前会不断循环(空转)等待。
-
缓冲池: 数据库将从磁盘读取的数据缓存到内存中的区域。
-
信息来源: Linux 7.0 Broke PostgreSQL: The Preemption Regression Explained