[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 メーリングリストの案内