WAS製品のタイムアウト設定において、いくつかわかりにくいところがあるため、下記の通りに該当内容を補足する:
上図は、WebSphere Application Serverにおいて、一つのリクエスト処理の流れを示すものです。
この一連の処理の中に、タイムアウトといわれる設定がいくつかある。
まずは、ブラウザとIHSサーバの間から話そう。
1.ブラウザとIHSサーバの間
ブラウザの設定はここで割愛させてもらうが、ここではIHSサーバのhttp.conf設定ファイルの設定項目をみることにする:
Timeout:この属性に設定された値は、以下の場合の時間になる。(デフォルトは300秒)
・ GET要求受信にかかる合計時間:http getを使った場合は、1つのGETリクエスト内容の受信にかかる時間。
・POST または PUT要求の TCPパケット受信間隔:1つのPOSTまたはPUTリクエスト内における、複数TCPパケット受信の間にかかる時間。
(http postもしくはputを使って、1リクエストの内容が多くて、数回に分けて送信する場合に注意する必要がある。)
・応答パケット送信時の ACK間隔:IHSサーバからブラウザにレスポンスを送る場合に、複数TCPパケット転送へのそれぞれのACKの間にかかる時間。(※ブラウザからのACKパケットの受信)
ご覧の通り、上記のいずれも、いわばIHSサーバがブラウザからのリクエストに対して制限をかけているというものだろう。
KeepAliveTimeout:次のリクエストまでにコネクションを保持する時間。(デフォルトは15秒)
2.IHSサーバとWASサーバの間
正確にいうと、上図にあるように、WASのPluginAgentとHttpTransportコンポーネントの間の設定といえるだろう。
まずは、PluginAgentの設定を見ていこう。
WASのplugin-cfg.xmlに、タイムアウトに関する設定は下記の通りです。
ServerタグのConnectTimeout属性:WASサーバとの接続をブロッキング/非ブロッキングのどちらかに指定する。デフォルト値は0です
・指定してないもしくは0の場合、PluginAgentはブロッキング接続を実行する。
この場合の接続は、OSが定義しているTCP通信タイムアウト時間に依存する。
PluginAgentは、ServerClusterタグに定義してあるServerタグにコネクション接続するためのSYNを送信する。
(どのServerを選択するかについて、ここで割愛させてもらう。)
接続が初期化できてから、PluginAgentはリクエスト内容を対象のサーバのHttpTransportに送信するが、
コネクション接続のためのSYNもしくはその後のパッケージ送信に対して、
もし対象のWASサーバからのACK返答が上記のタイムアウト時間を過ぎてから戻ってきた場合、
PluginAgentは該当WASサーバにunavailableとマークを付けてServerClusterタグにある他のServerに接続してみる。
(Serverタグのもう一つの属性RetryIntervalについて補足するが、PluginAgentは、
RetryIntervalに指定した時間内にunavailableマークが付けられたWASサーバに対して接続を試みることはないとのことです。)
・0より大きい場合、上記の処理の流れと似ているが、PluginAgentが正常に接続されるまで待機する秒数はOSが定義しているものではなく、
ConnectTimeout属性に指定した秒数になる。
( 正確にいうと、両方ともブロッキング接続になる。)
ServerタグのServerIOTimeout属性:上のConnectTimeout属性とは違い、
ServerIOTimeoutは、PluginAgentから対象WASサーバへのリクエスト内容の送信が完了してからの待機時間を示すものです。
この属性は最初からあるものではなく、WAS V5.xのFixPackとして追加で提供されたものです。
(例えば、AIX版のV5.1.1の場合は、CF10に含まれている。)
PluinAgentは、リクエスト内容の送信が完了してから、ブロックI/Oの形でWASサーバからのレスポンスを待つ。
WASサーバに不具合があった場合(シャットダウンとか、ハングなど)、IHS側の該当スレッドもハングになってしまう。
ServerIOTimeoutを設定することによって、指定した時間内WASサーバからレスポンスが帰ってこなかった場合に、
IHS側のスレッドを開放し、エンドユーザに適切なメッセージを表示することが可能になる。
ということで、人によく聞かれるIHSがWASからレスポンスを返すまでの最大待機時間については、この属性に該当する。
TransportタグのConnectionIOTimeout属性:PluginAgentではなく、HttpTransportコンポーネントに対する設定である。
この属性において、 IHSサーバ側のPluginAgentとの間に、コネクション接続ができていることを前提としている。
HttpTransportコンポーネントは、PluginAgentとのコネクション接続ができてから、リクエスト内容のRead処理を実行する。
PluginAgentからのリクエスト内容の送信を完了する前に、
ConnectionIOTimeout属性に指定されている時間内PluginAgentからデータが何も送られてこなかったら、
HttpTransportコンポーネントのほうでタイムアウトエラーが発生する。
デフォルト値は5秒です。
TransportタグのConnectionKeepAliveTimeout属性:同様に、HttpTransportコンポーネントに対する設定である。
一つのリクエストの処理を終えてから、この属性に指定している時間内、同じコネクション経由で新しいリクエストがこなかったら、
該当コネクションをクローズするという設定である。
3.上図には書いてないが、HttpTransportコンポーネントとWAS上のせているJSP/Servletベースのアプリケーションとの間に、
データの受け渡しが発生している。
ただし、TCPソケット通信でないし、Http通信でもないし、単なるJVM内のJavaオブジェクト間の通信であり、
タイムアウトになることはない。
というわけで、WAS製品のタイムアウト設定を上記の通りに簡単にまとめた。
上図は、WebSphere Application Serverにおいて、一つのリクエスト処理の流れを示すものです。
この一連の処理の中に、タイムアウトといわれる設定がいくつかある。
まずは、ブラウザとIHSサーバの間から話そう。
1.ブラウザとIHSサーバの間
ブラウザの設定はここで割愛させてもらうが、ここではIHSサーバのhttp.conf設定ファイルの設定項目をみることにする:
Timeout:この属性に設定された値は、以下の場合の時間になる。(デフォルトは300秒)
・ GET要求受信にかかる合計時間:http getを使った場合は、1つのGETリクエスト内容の受信にかかる時間。
・POST または PUT要求の TCPパケット受信間隔:1つのPOSTまたはPUTリクエスト内における、複数TCPパケット受信の間にかかる時間。
(http postもしくはputを使って、1リクエストの内容が多くて、数回に分けて送信する場合に注意する必要がある。)
・応答パケット送信時の ACK間隔:IHSサーバからブラウザにレスポンスを送る場合に、複数TCPパケット転送へのそれぞれのACKの間にかかる時間。(※ブラウザからのACKパケットの受信)
ご覧の通り、上記のいずれも、いわばIHSサーバがブラウザからのリクエストに対して制限をかけているというものだろう。
KeepAliveTimeout:次のリクエストまでにコネクションを保持する時間。(デフォルトは15秒)
2.IHSサーバとWASサーバの間
正確にいうと、上図にあるように、WASのPluginAgentとHttpTransportコンポーネントの間の設定といえるだろう。
まずは、PluginAgentの設定を見ていこう。
WASのplugin-cfg.xmlに、タイムアウトに関する設定は下記の通りです。
ServerタグのConnectTimeout属性:WASサーバとの接続をブロッキング/非ブロッキングのどちらかに指定する。デフォルト値は0です
・指定してないもしくは0の場合、PluginAgentはブロッキング接続を実行する。
この場合の接続は、OSが定義しているTCP通信タイムアウト時間に依存する。
PluginAgentは、ServerClusterタグに定義してあるServerタグにコネクション接続するためのSYNを送信する。
(どのServerを選択するかについて、ここで割愛させてもらう。)
接続が初期化できてから、PluginAgentはリクエスト内容を対象のサーバのHttpTransportに送信するが、
コネクション接続のためのSYNもしくはその後のパッケージ送信に対して、
もし対象のWASサーバからのACK返答が上記のタイムアウト時間を過ぎてから戻ってきた場合、
PluginAgentは該当WASサーバにunavailableとマークを付けてServerClusterタグにある他のServerに接続してみる。
(Serverタグのもう一つの属性RetryIntervalについて補足するが、PluginAgentは、
RetryIntervalに指定した時間内にunavailableマークが付けられたWASサーバに対して接続を試みることはないとのことです。)
・0より大きい場合、上記の処理の流れと似ているが、PluginAgentが正常に接続されるまで待機する秒数はOSが定義しているものではなく、
ConnectTimeout属性に指定した秒数になる。
( 正確にいうと、両方ともブロッキング接続になる。)
ServerタグのServerIOTimeout属性:上のConnectTimeout属性とは違い、
ServerIOTimeoutは、PluginAgentから対象WASサーバへのリクエスト内容の送信が完了してからの待機時間を示すものです。
この属性は最初からあるものではなく、WAS V5.xのFixPackとして追加で提供されたものです。
(例えば、AIX版のV5.1.1の場合は、CF10に含まれている。)
PluinAgentは、リクエスト内容の送信が完了してから、ブロックI/Oの形でWASサーバからのレスポンスを待つ。
WASサーバに不具合があった場合(シャットダウンとか、ハングなど)、IHS側の該当スレッドもハングになってしまう。
ServerIOTimeoutを設定することによって、指定した時間内WASサーバからレスポンスが帰ってこなかった場合に、
IHS側のスレッドを開放し、エンドユーザに適切なメッセージを表示することが可能になる。
ということで、人によく聞かれるIHSがWASからレスポンスを返すまでの最大待機時間については、この属性に該当する。
TransportタグのConnectionIOTimeout属性:PluginAgentではなく、HttpTransportコンポーネントに対する設定である。
この属性において、 IHSサーバ側のPluginAgentとの間に、コネクション接続ができていることを前提としている。
HttpTransportコンポーネントは、PluginAgentとのコネクション接続ができてから、リクエスト内容のRead処理を実行する。
PluginAgentからのリクエスト内容の送信を完了する前に、
ConnectionIOTimeout属性に指定されている時間内PluginAgentからデータが何も送られてこなかったら、
HttpTransportコンポーネントのほうでタイムアウトエラーが発生する。
デフォルト値は5秒です。
TransportタグのConnectionKeepAliveTimeout属性:同様に、HttpTransportコンポーネントに対する設定である。
一つのリクエストの処理を終えてから、この属性に指定している時間内、同じコネクション経由で新しいリクエストがこなかったら、
該当コネクションをクローズするという設定である。
3.上図には書いてないが、HttpTransportコンポーネントとWAS上のせているJSP/Servletベースのアプリケーションとの間に、
データの受け渡しが発生している。
ただし、TCPソケット通信でないし、Http通信でもないし、単なるJVM内のJavaオブジェクト間の通信であり、
タイムアウトになることはない。
というわけで、WAS製品のタイムアウト設定を上記の通りに簡単にまとめた。