Pgpoolのプロセスについて

 

PostgreSQLのプロセスを確認しようとしてpsコマンド打ったら、以下のようなプロセスが大量に出てビビッてしまった。。でもよく見ると、これは「pgpool」のプロセスじゃないか。。起動ユーザが「postgres」というOSユーザなだけw

[root]# ps -aef | grep postgres
postgres 32228 13092・・・        00:00:00 pgpool: wait for connection request
・・・
postgres 32404 13092・・・        00:00:00 pgpool: wait for connection request


以上、終わり。

では、あれなので、この機会にpgpoolのプロセス*1について、少し整理しておきたいと思います。

PostgreSQL側から見た最大同時接続数はnum_init_children * max_poolとなるが、クライアント側から見た最大同時接続数はnum_init_childrenとなる。

http://www.mono-space.net/doc/pgpool.html

num_init_childrenについて

重要なことは、上記引用にも挙げましたが、DBとしての同時接続数は、「num_init_children」で設定した値によって決まるということです。以下、ポイントの整理です。

  • pgpoolを起動すると、num_init_children分の子プロセスが作成される。*2
  • 生成された各子プロセスは、(PHPアプリケーションなどの)クライアントからの接続を待つ。
  • クライアントから接続要求があると、子プロセスはPostgreSQLと接続する。
  • 1つの子プロセスでは1クライアント分の接続のみ可能で、要求が同時に複数来た場合は、複数の子プロセスで対応する。

max_poolについて

前回の接続要求と、ユーザ名、データベース名が同じならば、各子プロセスが保持している接続を使いまわします。

  • クライアントから接続が切断される際、子プロセスからPostgreSQLへの接続は保持される。
  • ユーザ名、データベース名が同じならば、接続が使いまわされる。
  • もし、異なるユーザ名、データベース名ならば、新たにPostgreSQLとの接続を行う。

*1:このページの図解がとても参考になります。http://www.mono-space.net/doc/pgpool.html

*2:この動作により、冒頭のように「pgpool: wait for connection request」が数百個というレベルで出現します。