PgBouncerのスループットを4倍に拡張
मूल शीर्षक: We scaled PgBouncer to 4x throughput
यह क्यों महत्वपूर्ण है
マネージドPostgresサービスにおけるConnectionPoolerのスケーリング手法として、実測値付きで示された実践的な知見は業界の参考になる。
ClickHouseはManaged Postgresサービスにおいて、PgBouncerのスループットを4倍に向上させる手法を公開した。シングルスレッドの制約をso_reuseportとプロセスフリートで解決し、16vCPU環境で全コアを活用することに成功した。
ClickHouseはManaged Postgresにおいて、PgBouncerのスループットを4倍に拡張する技術的アプローチを公式ブログで発表した。
PgBouncerはシングルスレッドで動作するため、1プロセスは1つのCPUコアしか使用できない。16vCPUマシンでは残り15コアが遊休状態となり、PostgreSQL側の処理能力が残っていてもPoolerがボトルネックになる問題があった。
ClickHouseはこの問題を解決するため、利用可能なコア数に比例したPgBouncerプロセスのフリートを構成した。各プロセスはso_reuseportを有効にした上で同一ポートをバインドし、カーネルが受信接続をプロセス群に分散させる。クライアントからは単一エンドポイントとして見え、複数プロセスの存在を意識する必要がない。
ただし、この構成ではクエリのキャンセル処理に課題が生じる。PostgreSQLのキャンセルリクエストは新規接続経由でキャンセルキーを送信するが、so_reuseportによって別プロセスに届く可能性がある。ClickHouseはプロセス間のPeeringでこれを解決しており、誤ったプロセスに届いたキャンセルが正しいプロセスに転送される。
トランザクションモードのPoolingでは、トランザクションのコミット時にサーバー接続がPoolに返却される。max_client_connとmax_db_connectionsはプロセス数で分割され、PostgreSQLへの接続過多を防止している。
AWS EC2の16vCPU c7i.4xlargeを使用した実測では、単一プロセスとフリート(16プロセス)を比較。pgbenchによる読み取り専用・トランザクションプーリングモードで、スループットが4倍に向上したことが確認された。