もっぱら外向きサイトはLinux + Apache + ColdFusionで動かしていることもあり、ColdFusionとIISとの組み合わせは社内向けの小規模なシステムばかりで、同時接続数の上限は気にしたことがなかった。
ある時、Apache JMeterを使ってColdFusionの処理の状態をcfstatで計測していた
【テスト条件】
- ColdFusion Administratorの『同時テンプレートの最大数』を500にしてみる
- テストページに
<cfset sleep(900000)>
900秒=15分スリープを入れる - JMeterでスレッド数を500にして、Ramp-Up期間とループ回数は任意の数を設定する
この条件でColdFusion + IISの環境をテストしていたら、下記のような動きになった
- JMeterからの多重のリクエストが来ているはずなのに、ColdFusion側で接続数の増加が緩やか。だいたい1秒につき1つしか同時接続処理が増加していかない
- 接続数が256で頭打ちになって、それ以上増えない
最初はテストの仕方が悪かったかな?と思って色々パラメータを調整してみたが、結果が変わらない。それならと同梱Webサーバー(デフォルトポート:8500)やColdFusion のWebサーバー接続を Apache に変更して動作を確認したら、こちらは想定通りJMeterからのリクエスト数に応じてColdFusionも設定した上限まで処理を受け付けている。
接続コネクタのAJPのドキュメントを見てみたが、それっぽい制限も無いようだし、じゃあ、ColdFusion+IISの組み合わせでのみ発生するってことか。たしか、Windows 2000 WorkStation とか XP ProとかだとIISの同時接続数が最大で10個までに制限されていたなあ。って思っていたが、今回は、Windows 2019 Serverだから、これにも該当しないし。。
この記事を見るまで知らなかったけど、Win10 Homeだとさらに同時接続数は最大で3になるっぽい creativeweb.jp
じゃあ、他のIISの設定が影響しているのかなぁと、IISの設定を色々と調べていたら、関係する設定を見つけた。それは、アプリケーションプールの詳細設定にあった「ワーカープロセスの最大数」だった。
この値は初期値は1になっている。説明にも書かれている通り、アプリケーションプールに対するリクエストを処理できるワーカープロセス(w3wp.exe)の数だそうだ。たしかに、初期値の1が指定されていると、IISのワーカープロセス(w3wp.exe)が起動されても最大で1になる。
この最大値を2以上にすると、ワーカープロセスが増えて、その分多重に処理が渡されるようになった。
例えば、4を指定して多重に処理を掛けると、ワーカープロセス(w3wp.exe)も最大4つ起動され、ColdFusion側で受け入れた接続数の増加もだいたい1秒につき4つの同時処理が増加していった。また、接続数の上限も256を超えて500まで増加して、想定の処理数となった。どうも1つのワーカープロセスにつき256(16x16)が上限になるようだ。
忘れないうちに。メモメモ。
その他・参考情報
ワーカープロセスを2以上にすると、Webガーデンと呼ばれる機能で動作するらしい。複数プロセスへの負荷を分散してくれるらしい。ASP.NETのサイトなどではプロセス間での情報の共有ができないので注意する必要があるようだが、ColdFusionは関係はない。
生成されたプロセスは、アプリケーションプールの詳細設定にある、「アイドル状態のタイムアウト」の時間を過ぎると開放されるようだ(すぐにまた処理数が増えてワーカープロセスが起動するような状況の場合は、「アイドル タイムアウトの操作」をTerminateではなくSuspendにした方が良いらしい)。 ワーカープロセスの内部の詳細については、これ以上は分からないようだが、CPU利用率などは、タスクマネージャーでプロセスを確認するか、インターネット インフォメーション サービス(IIS) マネージャーでも確認ができるので、大まかな状況の確認はできると思う。