注目★★★★★Hacker News
PostgreSQL がメモリ不足で全接続ダウン、厳密なオーバーコミット設定で防ぐ
30秒で把握
- 1PostgreSQL 5 つのマネージドサービスで 15 年、厳密なオーバーコミット設定により OOM キラーによる全接続喪失を防止
- 2OOM 時に 1 接続が ENOMEM エラーで止まるだけで済み、他の接続と postmaster が生存・クラッシュリカバリ回避
- 3有効化後にカーネルの Committed_AS カウンタリーク (8GB 機で 651GB 報告) により一時無効化・カーネルバグ調査に
要約
PostgreSQL のマネージドサービスを 15 年運用する Ubicloud チームは、Linux の厳密なメモリオーバーコミット (strict memory overcommit) で OOM キラーによる致命的障害を防いできた。PostgreSQL の postmaster は子プロセスが OOM で強制終了されると、共有メモリが破損した可能性を想定してすべてのバックエンドを終了させるため、1 つの接続の OOM が全接続の喪失とクラッシュリカバリの長時間化につながる。厳密なオーバーコミット設定では、メモリ枯渇時に OOM キラーの代わりに ENOMEM エラーが返り、PostgreSQL は単一の接続エラーで対応でき、他の接続は継続する。ただしチームは enable 後、/proc/meminfo の Committed_AS が 8GB マシンで 651GB と報告されるカウンタリーク現象に遭遇し、この 3 文字のカーネルバグで一時的に設定を無効化した。
あなたへの影響
PostgreSQL を本番運用する場合、ホストの memory overcommit ポリシーの設定が全接続喪失リスクに直結するため。
推奨:現在の設定値を確認し shared_buffers 規模に合わせた CommitLimit の算出と定期的な Committed_AS 監視の導入を検討すべき。