AWSエンジニア、Linux 7.0でPostgreSQL性能が半減したと報告 – 修正は容易でない可能性
(phoronix.com/news)- Linux 7.0の開発カーネルで、PostgreSQLデータベースサーバーのスループットが従来カーネル比で約半分に低下する深刻な性能リグレッションがAmazon/AWSエンジニアによって発見された
- Graviton4サーバーでの測定結果では、Linux 7.0は従来カーネル比で約0.51倍のスループットしか提供せず、その原因はユーザースペースのスピンロックで大幅に多くの時間が消費されることにあると判明した
- リグレッションの原因は、Linux 7.0で行われたカーネルプリエンプション(preemption)モード制限の変更で、PREEMPT_NONEをデフォルト値として復元するパッチが提出されたものの、採用の見通しは不透明な状況
- 作者のPeter Zijlstraは、カーネル修正ではなくPostgreSQLがRSEQ(Restartable Sequences)タイムスライス拡張を活用するよう修正すべきだとの立場を示した
- Linux 7.0安定版は約2週間後にリリース予定で、Ubuntu 26.04 LTSのベースカーネルとしても使われる予定のため、PostgreSQLが適応するまで広範な性能低下が懸念される
問題の発見と規模
- Amazon/AWSエンジニアのSalvatore DipietroがPostgreSQLのスループットとレイテンシのリグレッションを報告
- Graviton4サーバー基準の測定で、Linux 7.0は既存カーネル比で0.51倍のスループットしか提供しなかった
- 原因はユーザースペースのスピンロックで大幅に多くの時間が消費されることだと確認された
リグレッションの原因: プリエンプションモード制限
- バイセクティング(bisecting)の結果、Linux 7.0でカーネルプリエンプションモードを制限した変更が原因と特定された
- この変更は最新CPUアーキテクチャを対象にFullおよびLazyプリエンプションモードのみを維持する方向で実施され、Linux 7.0スケジューラ更新の一環として含まれた
提出されたパッチとカーネルメンテナの反応
- 深刻なリグレッションを理由に、PREEMPT_NONEをデフォルトのプリエンプションモードとして復元するパッチがLinuxカーネルメーリングリストに提出された
- しかし、元のコードを書いたPeter Zijlstraはこのパッチの受け入れに否定的で、解決策はPostgreSQLがRSEQ(Restartable Sequences)タイムスライス拡張を活用することだと述べている
- RSEQタイムスライス拡張もLinux 7.0に含まれた機能
- Zijlstraは「これによりロックホルダーのプリエンプション露出を制限できる」と説明した
影響範囲とリリース日程
- もしこの立場が維持される場合、PostgreSQLが更新されるまで、Linux 7.0安定版では一部シナリオでPostgreSQL性能が大きく低下する可能性がある
- Linux 7.0安定版は約2週間後にリリース予定
- Linux 7.0はUbuntu 26.04 LTSのベースカーネルであり、4月末にリリース予定のUbuntu 26.04 LTSにも同様の影響が及ぶ可能性がある
2件のコメント
聞くところによると、カーネル開発者たちは10〜20年近く前から PostgreSQL 開発者に対して「ユーザーランドでのスピンロックは推奨しないので、見直してほしい」と話していたそうです..
https://x.com/kosaki55tea/status/2040458791536497035
Hacker Newsのコメント
Postgres開発者 Andres Freund の LKMLの追補投稿 を読む価値がある
Linuxメンテナーは PostgreSQLのような中核アプリ を優先的なサポート対象にすべきだという意見である
以前 Fedora で Wine をインストールするとアップデートが止まった事例を思い出す
つまり、PostgreSQL を最新カーネルへ上げるすべてのユーザーが経験する問題ではない
ユーザー空間で spinlock をカーネル支援なしに使うのは、性能低下を自ら招く行為だという意見である
しかし futex ベースのロックは メモリバリアの増加 によって性能リグレッションが生じる
また Postgres は依然として 8バイトのアトミック演算をサポートしないプラットフォームも考慮しなければならず、置き換えは難しい
問題の spinlock は最近削除され、huge pages 使用時 にはボトルネックもほぼ消える
「最新カーネルを本番で使う人はいない」という主張もあった
実際には Ubuntu 26.04 LTS が Linux 7.0ベース でまもなくリリースされるため、多くのユーザーが近く使うことになる
現時点では sysctl ではなく カーネルパッチ が必要だという点が問題である
PREEMPT_LAZY の背景は LWNの記事 で確認できる
「Jia Tan が最近カーネルパッチを出していないか確認したか」という冗談めいたコメントがあり、
それに対して「わざわざその必要もない、すでに 脆弱性だらけだ」という返信が付いていた
PostgreSQL 18 の 非同期 I/O と並列クエリ最適化 が今回の性能低下を相殺できるのか気になるという意見があった
関連内容は PostgreSQL 18 リリースノート で確認できる
PREEMPT_LAZY のような 動的プリエンプションモード がなぜ必要なのか疑問だという意見もあった
一般ユーザーが得る利点が不明確だということである
カーネルがより明示的な情報を受け取り、スケジューリング判断を改善 できるようになるということだ
FreeBSD 14 と 15.0 の間で 10%の性能低下 を測定したが、今回の事例を見て慰めになったというコメントがあった
Phoronix が 十分な検証なしに記事化した という批判もあった
追補メールではベンチマーク自体が誤っており、実際には大きな問題ではないという結論になった
PostgreSQL には大きな問題ではないかもしれないが、huge pages を使えない他のアプリには影響する可能性がある
そのため、単純に無視してよい話ではないという意見である
古い LKMLスレッドのリンク も共有されていた