亚马逊的一位工程师发现,Linux 内核 7.0(预计将于 4 月 13 日发布)存在一个特定的回归问题。任务调度器设置的更改导致在 ARM64 系统上运行 PostgreSQL 时吞吐量和响应速度显著下降。使用内核 7.0 后,pgbench “simple-update” 测试的性能几乎下降了一半,从 98565 降至 50751。
性能下降的原因是,在支持 PREEMPT_LAZY 架构上,默认调度器抢占模式从 PREEMPT_NONE 更改为 PREEMPT_LAZY。这导致 PostgreSQL 55% 的 CPU 时间都用于在用户空间调用 s_lock() 函数。为了解决这个问题,建议将 PREEMPT_NONE 恢复为默认值,并将其与 ARCH_NO_PREEMPT 设置解除关联。
导致性能下降的变更作者、任务调度器和锁相关内核子系统的维护者 Peter Zijlstra 表示,需要在 PostgreSQL 代码中实现修复。为了解决性能下降问题,他建议使用 PostgreSQL 内核中最近添加的“rseq slice”(可重启序列)扩展,以降低锁持有者被驱逐的可能性。
目前尚不清楚 Linus Torvalds 将做出何种决定,因为他坚持内核不应降低性能或破坏用户空间兼容性的原则。一方面,7.0 内核正处于发布前的最后测试阶段,回滚调度器设置可能会导致其他回归问题。另一方面,用户可能会遇到最常用数据库之一的性能减半的情况。
来源: opennet.ru
