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