[PHP-users 32303] Re: 持続的接続の挙動について質問があります。

KOYAMA Tetsuji koyama @ hoge.org
2007年 6月 11日 (月) 16:33:15 JST


小山です。

On 6/8/07, 福永 周司 <fuku_315 @ yahoo.co.jp> wrote:
> > PostgreSQL の同時接続数 (max_connections) と
> > Apache の同時処理数 (MaxClients)
> > はどちらが大きいですか?
>
> PostgreSQLのmax_connectionsは、100
>
> ApacheのMaxClientsはないので、
> おそらく
> ThreadsPerChild 250
> MaxRequestsPerChild  0
> になろうかと思います。
>
> どちらもデフォルト値にしています。

ということは、Apache では最大 250 の処理スレッドが起動して、
それぞれが PostgreSQL への接続を保持しようとするわけです。
対して PostgreSQL の最大接続数は 100。どう考えても PostgreSQL
の接続数不足になりますよね。

> pg_pconnectで接続した場合、PHPプログラムが終了しても
> リンクは接続されたままとなる事は認識しています。
> pg_pconnectは、同じ接続があればそれを使い回せるのだと
> 思っていたのですが、どうも直ぐには使い回せていないよう
> な挙動に見えるので、その動作が正しい動きなのかおかしい
> 動きのかという質問になります。

やはり pconnect の動作を勘違いされていますね。
pconnect は Java のコネクションプールのようなものではありません。

Apache 内ではリクエストを処理するためのプロセス/スレッドが複数
動作しますが、

  1. あるApacheプロセス/スレッドがリクエストを処理
  2. そのリクエスト内で php が pconnect を使用
  3. リクエスト処理が終了(pconnectなので、DB接続は終了せずに保持)
  4. Apacheプロセス/スレッドは次のリクエストを処理
  5. 次のリクエストでも php が pconnect を使用
  6. 前回のpconnectとパラメータが同じならば、前回のDB接続を再使用

という処理をするものに過ぎません。各 Apacheプロセス/スレッド間で
DB接続がやりくりされることはありません。

福永さんのケースでは、100しか用意していない PostgreSQL 接続に対して
250 の Apache スレッドが接続しに行くので、それは数が足りてませんという
ことです。

-- 
    小山哲志@ビート・クラフト
    koyama @ beatcraft.com
    koyama @ hoge.org


PHP-users メーリングリストの案内