PgBouncerのスループットを4倍に:ClickHouseの手法
Original : We scaled PgBouncer to 4x throughput
Pourquoi c'est important
PostgreSQLマネージドサービスの接続プーリング性能向上は、大規模OLTP環境に直接影響する。
ClickHouseはManaged Postgresサービスにおいて、PgBouncerのフリートをso_reuseportで並列化し、16コアのAWS EC2(c7i.4xlarge)でスループットを最大4倍に向上させたと発表した。
PgBouncerはシングルスレッドのプロセスであり、1つのCPUコアしか使用しない。16vCPUのマシンでは、残り15コアがアイドル状態となり、Postgresの処理能力に達する前にプーリングがボトルネックになる。
ClickHouseはManaged Postgresにおいて、利用可能なコア数に比例したPgBouncerフリートを構築した。各プロセスは`so_reuseport`オプションで同一ポートをバインドし、カーネルが接続をプロセス間で負荷分散する。クライアントからは単一エンドポイントに見え、複数プロセスの存在を意識しない。
課題はクエリキャンセル処理だ。Postgresのキャンセルリクエストは新規接続で届くため、`so_reuseport`環境では別プロセスに届く可能性がある。これを解決するため、各プロセスは互いを認識し、誤着したキャンセルを正しいプロセスへ転送する「ピアリング」機能を実装した。
接続予算はフリート全体で分割され、`max_client_conn`と`max_db_connections`をプロセス数で割ることでPostgresの過負荷を防ぐ。AWS EC2 c7i.4xlarge(16vCPU)を用いたベンチマークでは、単一プロセスと比較してフリート構成が約4倍のスループットを達成した。