[pgpool-general-jp: 16] Re: childprocessとconnection

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2006年 10月 17日 (火) 16:04:04 JST


浅羽です。

From: koyama <mlus @ hintmark.com>
Subject: [pgpool-general-jp: 15] childprocessとconnection
Date: Tue, 17 Oct 2006 02:17:10 +0900

> 何度も質問ばかりですいません。

いえいえ、どうぞ。


> pgpool の childプロセス と connection(pool) について質問させてください。
> 
> 接続クライアントA
> 接続クライアントB
> connection pool
> 
> の関係ですが、
> 
> 接続クライアントA が、pgpoolに接続に来た時には、childプロセスが1つ
> 使われる。
> 
> 接続クライアントB が、pgpoolに接続に来た時には、childプロセスが1つ
> 使われる。
> 
> 認識1
>   従って、init_childプロセスは、接続クライアント数 以上を設定しておかないと
>   いっぱいになった時点で、次に接続するクライアントは、待たされる。
> 
>   接続クライアントA----------child_process
>                                 connection1
>                                 connection1
>                                 connection1
>                                 connection1

はい、その通りになります。


> 認識2
>   接続を許可されたクライアントは、connection_poolの max 値まで、
>   同時に、SQL操作を行う事ができるが、最大値を超えた場合は、処理を終えた
>   一番古いconnection が再利用される。

ちょっと、ここが違うかもしれません。max_pool は各プロセスがキャッシュ
を持つことができる最大の数になります。キャッシュを識別する情報は

  1. プロトコルバージョン
  2. 接続ユーザ名
  3. データベース名

になります。この 3 つの情報が一致した場合に、キャッシュされたコネクショ
ンを再利用することができます。言い換えると、ユーザ名やデータベース名が
頻繁に変わるような接続があるシステムの場合、pgpool によるコネクション
キャッシュがあまり有効になりません。

例えば、max_pool = 4 の場合、

  dbname=A, username=X, version=30
  dbname=B, username=X, version=30
  dbname=C, username=X, version=30
  dbname=C, username=Y, version=30

というキャッシュを 1 プロセスに持つことができます。これ以上の異なる接
続が来ると

  "connection cache is full."

というエラーになります。その場合には max_pool を増やすか、
connection_life_time を適当な値に設定する必要があります。


> 認識3
>   接続を切断されたchild processは、別のユーザーが接続に来た時に
>   再利用される。

はい、その通りです。1 クライアント<--> 1 child process という通信にな
ります。

--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp


pgpool-general-jp メーリングリストの案内