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」が数百個というレベルで出現します。