コネクションプールで接続負荷を軽減!
コネクションプールとは
「第1回:pgpool-IIのインストール方法(http://www.thinkit.co.jp/article/98/1/)」では、pgpool-IIとWebベースの管理ツールであるpgpoolAdminのインストール方法について解説しました。今回は、pgpool-IIの「コネクションプール」機能について解説します。
コネクションプールとは、クライアントからpgpool-IIへの接続が切断した時、pgpool-IIからPostgreSQL間の接続を保持し、後で新たにクライアントからの接続要求を受けた時に再利用することで、接続によるオーバーヘッドを軽減する機能です。
特にWebアプリケーションのようにデータベースに対する接続、切断を頻繁に繰り返すシステムにおいて、全体的にスループットを向上させることができます。
pgpool-IIのコネクションプールの特徴
コネクションプールの特徴の1つがprefork型であることです。PostgreSQLは、クライアントからの接続を親プロセスが待ち受け、接続要求がある度に子プロセスを起動します。これに対して、pgpool-IIはあらかじめ複数の子プロセスを起動(prefork)しておき、それぞれがクライアントからの接続を待ち受けます。
このため、pgpool-IIとの接続は、PostgreSQLとの接続に比べて小さなオーバーヘッド確立することができます。
もう1つの特徴が最大同時接続数の制限です。PostgreSQLでは、postgresql.confのmax_connectionsで設定した最大同時接続数を超えて接続要求を受けると、クライアントに対してエラーを返します。このため、Webアプリケーションでは、HTTPサーバーの最大同時接続数分max_connectionsを確保しておかなければいけません。
これに対しpgpool-IIは、最大同時接続数を超えてクライアントからの接続要求があった場合もエラーとはならず、そのクライアントは他のクライアントが切断されるまで待たされます。このため、HTTPサーバーの最大同時接続数より小さい値をmax_connectionsに設定してリソースを節約し、ピーク時にPostgreSQLにかかる負荷を抑えることができます。
では、コネクションプールの効果をみていきましょう。実際にコネクションプールを使うことによりどの程度パフォーマンスが改善できるのでしょうか。PostgreSQL用のベンチマークツール「pgbench」を使って手元のマシンで検証したところ、参照のみのトランザクション(pgbenchの-Sオプションを使用)では、pgpool-IIを使うことで3倍以上のトランザクション数を計測しました。
なお、pgbenchはデフォルトでは最初に一度しかPostgreSQLに対して接続を行いません。接続のオーバーヘッドを計測するには、-Cオプションを使用し、トランザクションごとに新たに接続を確立させるようにします。また、pgbenchの同時接続数(-cオプションで指定)は、後述するpgpool.confのnum_init_children以下にする必要があります。
pgbenchのインストールや使い方に関しては、PostgreSQLドキュメントの「付録 F. 追加で提供されるモジュール(http://www.postgresql.jp/document/current/html/contrib.html)」「F.18. pgbench(http://www.postgresql.jp/document/current/html/pgbench.html)」を参照してください。
次は、主なパラメータとその設定内容について紹介します。