7.4.1 リクエスト処理スレッド数の制御の概要
NIO HTTPサーバにはスレッドプールがあり,一度作成したスレッドを再利用することで効率よく処理できます。スレッドプール内のスレッド数は,最小値と最大値を調整できます。最小値と最大値を同じ値にした場合は,固定スレッド数のスレッドプールとなります。
NIO HTTPサーバでは,Webコンテナ管理の処理スレッド数はスレッドプールの最小サイズ,最大サイズとスレッドプールの持つキューとの相互作用によって,次のとおり推移します。
-
実行中のスレッド数がスレッドプールの現在のサイズ以下の値で,アイドルスレッド(処理を実行していないで待機状態の空きスレッド)がある場合,処理要求はキューに投入され,アイドルスレッドが処理要求を受け付けて実行します。
-
アイドルスレッドがない場合,新しいスレッドを生成して処理を実行します。生成されたスレッドの個数分,スレッドプールの現在のサイズが大きくなります。スレッドプールの現在のサイズは最大サイズを超えることはありません。
-
実行中のスレッド数がプールの最大サイズの値に達した場合,処理要求はキューに投入され,アイドルスレッドができるまで待ち,アイドル状態になったスレッドが処理要求を受け付けて実行します。
-
スレッドプールの現在のサイズが最小サイズより大きい場合,アイドル状態になってから一定時間(webserver.connector.nio_http.idle_thread_timeoutで指定した時間:デフォルト60秒)を超えたアイドルスレッドは削除されます。スレッドプールの現在のサイズが最小サイズより小さくなることはありません。
スレッドプールの持つキューのサイズに制限はありません(Integer.MAX_VALUE)。
NIO HTTPサーバでのスレッド数の遷移例を次の図に示します。この例では,プロパティを次のように設定しています。
-
webserver.connector.nio_http.min_threads:5
-
webserver.connector.nio_http.max_threads:10
-
webserver.connector.nio_http.max_connections:1024
-
webserver.connector.nio_http.idle_thread_timeout:60 (秒)
図7‒2 NIO HTTPサーバでのスレッド数の遷移例
図中の項番1〜6について説明します。
-
J2EEサーバ起動直後は,スレッド数最小値に指定した数のスレッドが生成され,アイドルスレッドとして待機します。
-
同時に3多重のリクエストが投入された場合,アイドルスレッドの中の三つが実行中スレッドとなります。
-
スレッド数最小値を超えるリクエストが同時に投入された場合は,必要数分のスレッドを新たに作成します。
-
実行中スレッド数が再びスレッド数最小値を下回った場合でも,未使用となったスレッドはidle_timeout_timeoutに指定した秒数(デフォルト60秒)は待機します。
-
idle_timeout_timeoutに指定した時間経過しても実行中にならなかったアイドルスレッドは破棄されます。ただし,スレッド数最小値分のスレッドは破棄されません。
-
クライアント接続数上限は下回るが,スレッド数最大値を超えるリクエストが同時に投入された場合は,最大値を超えた分のリクエスト処理要求は実行待ちキューで待たされます。先に処理を終えてスレッドに空きが出ると,キューから取り出されて処理されます。