[PHP-users 18128]Re: 持続的接続の接続上限秒数と接続数上限はどうやって指定する?

Tatsuya Matsuyama tatsuya @ kk-okamoto.jp
2003年 9月 30日 (火) 15:38:30 JST


松山です。
レスありがとうございます。

SQLserverの最大接続数は75で間違いがないとします。
# 正直「?」な部分もあるのですが、
# 本論からずれるのでそのようにご理解下さい。

----- Original Message ----- 
Sent: Tuesday, September 30, 2003 12:45 PM
Subject: [PHP-users 18125] Re: 持続的接続の接続上限秒数と接続数上限はどうやって指定する?


> httpd.conf の maxclientsの値はどうなっていますか?
> 
> max_persistent > maxclients になっていればそうなるのも道理なような?
> 
> http://php.planetmirror.com/manual/ja/features.persistent-connections.php
> このページの下のほうのメモには、こんな投稿があります。
> 
<中略>  
> だそうです。
> 
> ということは、Apacheのhttpd.confの MaxClients で設定されている数
> 分のDB接続プロセスができてもおかしくないですよね。

httpd.confの該当箇所は以下のようになっています。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 5
StartServers 5
MaxClients 73

php.iniの該当箇所は以下のようになっています。
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = 12
mssql.max_links = -1

設定の意図は、SQLserverの最大接続数75を超えないよう
max_persistent(12) × apacheのプロセス数(5) < SQLserverの最大接続数(75)
としているつもりです。
# ご指摘いただいた参考ページによると
# 上記の場合apacheのプロセス数は
# MinSpareServers 5 + MaxSpareServers 5 = 10と
# なるかもしれませんけど...

ご指摘いただい語句なども頼りにググッてみました。
ただ、それでも
 phpの_pconnectを切断するにはどうすればいいのか
ハッキリした記述を見つけられません。

ここで、apache(php)の気持ちになって現象を整理してみたいと思います。

例えば、apacheで5個のサーバープロセスが起動しているとします。
(以下KとはKeepAlive中)
#1 #2 #3 #4 #5
------------
_ _ _ _ _

ある、ユーザーが1ページだけ表示リクエストを出して
phpファイルの冒頭で
$dbHandle  = sybase_pconnect($connectDbName,"$Login_user","$Login_passwd");
として1回だけ持続的接続をオープンし
最初から最後までで同じユーザー名で複数回のsqlを発行し
例として#3のプロセスがSQLserverと交信したとします。
#1 #2 #3 #4 #5
------------
_ _ K _ _

ページの表示が完了した直後からapacheは
KeepAliveの秒指定だけ次のリクエストを待ちます。


KeepAliveの指定秒以上、時間が経ってから
#1 #2 #3 #4 #5
------------
_ _ _ _ _
# この段階でもSQLserver側に#3のプロセスは残ったまま

同じユーザーが再度、別のページのリクエストを出したとします。
同じクライアントからのリクエストではありますが、
apacheはKeepAliceを超過しているので同一クライアントからどうか判別をせず、
たまたま#5のプロセスがSQLserverと交信したとします。
#1 #2 #3 #4 #5
------------
_ _ _ _ K

この段階で、SQLserverは、
プロセスをまたいだ同一ユーザーのアクセスは
別ものとみなすので別のコネクションを開きます。
結果として#3と#5で持続的接続がオープンされます。

KeepAlive超過後、同じクライアントからさらに次のリクエストを出し、
apacheが#3で応答すれば、持続的接続を再利用されることになります。

質問時の
「SQLserverに同じユーザー名のプロセスが増大していく」
ことの説明にはなると思います。

この論が正しければ、以下の認識も正しいですよネ?

1.apacheが起動した後、*同じプロセス*を保持しないと
  同一ユーザー名で各プロセスごとに
  いくつもの持続的接続がオープンされる(可能性がある)。

2.仮に(起動後から増減のないまま)プロセス数を保持できたとすると、
  最大で
  apacheのプロセス数×SQLserverへのログインユーザー名数
  だけ「持続的接続」が発生する。

そうすると、私の疑問は、
SQLserverの最大接続数に達することがハッキリしているような状況
(例えばSQLserverのログインユーザー名が20名で
SQLserverの最大接続数が75だとしたら、
4つ以上のapacheのサーバープロセスを起動する場合など)では、

1.
双方で安定するよう
apacheのプロセス数とSQLserverの最大接続数を指定し
apacheでは故意にプロセスが増減しないようにする

もしくは、
2.
持続的接続をcloseする処理を追加する

の2つの選択肢の内、
どちらを選ぶべきなのか分からない点です。

2については(phpでは)方法がない(?)ので
1の方法を探るのが一般的と考えてよいのでしょうか?





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