ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server Java EE運用ガイド

7.7.1 スレッドプーリング

クライアントからEnterprise JavaBeanに対して同時に要求が発行された場合、EJBコンテナは要求を別スレッドで実行して並列処理します。
スレッドの作成処理はレスポンス時間に影響するため、スレッドプールを活用してスレッドを再利用しています。

スレッドプーリングは以下のチューニングを行うことができます。

スレッドはEnterprise JavaBeanのアクセスパターンにより、制御が異なります。以下にEnterprise JavaBeanのアクセスパターンとスレッド制御の関係を説明します。

Enterprise JavaBeanのアクセスパターンとスレッド制御の関係

以下にEnterprise JavaBeanのアクセスパターンを示します。

EJBコンテナがスレッド制御を行うアクセスパターン

以下の場合はEJBコンテナがスレッドプールを使用してスレッド制御します。

  • RMI-IIOPによるリモートアクセスによりEnterprise JavaBeanに対して要求が発行される場合

  • JMSメッセージが受信され、Message-driven Beanが実行される場合

  • リソースアダプタのメッセージが受信され、Message-driven Beanが実行される場合

呼出し元のスレッドで動作するアクセスパターン

以下のJava VM内の呼出しの場合は呼出し元のスレッドで動作します。

  • EJB間の呼出し

  • Servlet/JSPからのEJB呼出し

  • WebサービスからのEJB呼出し

  • JPA Entityに対する操作

HTTP通信によるアクセスの場合はスレッドのチューニングについては、「7.6 Webコンテナのチューニング」と「7.9 Webサービスのチューニング」を参照してください。

リソースアダプタのスレッドで動作するアクセスパターン

リソースアダプタのメッセージを受信するMessage-driven Beanの場合、メッセージリスナーメソッドはリソースアダプタが作成したスレッドで動作します。

EJBアプリケーションの同時処理数制御

IJServerクラスタプロセス起動時にスレッドプールの最小プールサイズのスレッドを作成しプールに格納します。
要求の処理開始前にプールを検索し、プールにスレッドがない場合、スレッドを作成して要求を実行します。
処理完了後、作成したスレッドは削除されることなくプールに返却されます。現在のスレッド数がスレッドプールの最大プールサイズとなり、プールにスレッドがない状態で要求が配信された場合、スレッドがプールに戻るまで要求をキューに入れて待機します。

リクエストの優先順位付け

EJBアプリケーションごとにスレッドプールを作成し最大プール数を指定することにより、EJBアプリケーションごとに同時処理数を制御できます。

EJBアプリケーションに個別にスレッドプールを割り当てることによって、他のEJBアプリケーションよりも高い優先度で実行できます。個別のスレッドプールに割り当てられたEJBアプリケーションは、他のEJBアプリケーションに対する要求がスレッドプールでキューイングされていても独立したスレッドプールで実行できるため、優先的に実行できます。

スレッドプールの設定

以下にスレッドプールのチューニング項目について説明します。

チューニング項目

意味

効果

最小プールサイズ

スレッドプールの初期数および最小数です。
IJServerクラスタ起動時に作成するスレッド数です。

想定している同時に発行される要求数を指定するとレスポンスタイムを削減できます。

最大プールサイズ

スレッドプールの最大値です。
最大値のスレッドが動作した場合、要求が発行されてもスレッドを作成せず、スレッドが空くまで、要求はキューに置かれます。

スレッドプールの最大値によりスレッドプールが使用するメモリやリソースを制御できます。

アイドルタイムアウト

プール内のスレッドがアイドル状態のままでいられる最長時間(秒単位)です。
この期間を過ぎるとスレッドを破棄します。ただし、最小値のスレッド数分はプーリングされ続けますので破棄対象外となります。また、IJServerクラスタプロセスが停止するとスレッドも削除されます。

不要になった過度のスレッドを破棄することによりメモリやリソースの最適化ができます。

EJBアプリケーションに個別にスレッドプールを定義しない場合は、用意されているデフォルトスレッドプールが使用されます。デフォルトスレッドプールは、以下の機能も使用しているため、EJBアプリケーションへの要求が多くなるとスレッド空き待ちが発生し、遅延が発生する場合や応答がなくなる場合があります。必ずデフォルトスレッドプールとは別のスレッドプールを作成し、「Enterprise Beanごとのスレッドプール設定」を行ってください。

デフォルトスレッドプールは、初期値が「thread-pool-1」になっています。このスレッドプールは削除しないでください。

Enterprise Beanごとのスレッドプールの最大プールサイズは、以下の見積もりを行ってください。

最大プールサイズ  =  想定される同時接続クライアント数

デフォルトスレッドプール(thread-pool-1)の最大プールサイズは、以下の見積もりを行ってください。200より小さい値になった場合は、200(デフォルト)にしてください。

最大プールサイズ  =  EJBタイマーサービスのタイマーの数
                  +  Enterprise Beanの数
                  +  リソースアダプタのWork数 (注1)
                  +  想定される最大クライアント多重度 (注2)
                  +  呼出し先IJServerクラスタのプロセス数 (注3)
注1) スレッドプールIDを定義していないリソースアダプタだけ。
注2) 想定されるスレッド多重度の合計。
注3) 他IJServerクラスタのEJBアプリケーションなどを呼び出した場合の、呼出し先IJServerクラスタのプロセス数。

スレッドプール設定は、Interstage Java EE管理コンソール、およびasadminコマンドを使用して変更できます。詳細については、以下のマニュアルを参照してください。

Enterprise Beanごとのスレッドプール設定

Enterprise Beanごとのスレッドプール設定については、以下のマニュアルを参照してください。