PgBouncerをマルチプロセス化でスループット4倍に
Judul asli: We scaled PgBouncer to 4x throughput
Mengapa Ini Penting
マルチコアを活かしたPgBouncer水平拡張は、マネージドPostgresの性能上限を大幅に引き上げる実践的手法として注目される。
ClickHouseはManaged PostgresでPgBouncerをマルチプロセス構成に拡張し、AWS EC2 c7i.4xlarge(16 vCPU)での検証でスループットを4倍に改善したと発表した。
PgBouncerはシングルスレッド動作のため、1プロセスが1コアしか使用できない。16 vCPUマシンでは残りの15コアがアイドル状態となり、Postgresが限界に達する前にプーラーがボトルネックになる問題があった。
ClickHouse Managed Postgresでは、利用可能なコア数に比例したPgBouncerプロセス群(フリート)を構成。各プロセスが`so_reuseport`オプションで同一ポートをバインドし、カーネルが接続をプロセス間に分散する仕組みを採用した。クライアントは単一エンドポイントに接続するため、内部構成を意識しない。
ただし、クエリキャンセルに課題があった。Postgresのキャンセルリクエストは別接続で届くため、`so_reuseport`環境では異なるプロセスに届いて無効になるケースがある。これを解決するため、プロセス間で「ピアリング」機能を実装し、誤ったプロセスに届いたキャンセルを正しいプロセスへ転送する仕組みを導入した。
また、`max_client_conn`と`max_db_connections`をプロセス数で均等分割することでPostgresへの過剰接続を防止。AWS EC2 c7i.4xlarge(16 vCPU)上での実測では、単一プロセス構成と16プロセス構成を比較し、pgbenchのselect-only・トランザクションプールモードでスループット約4倍を確認した。