以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
まず、第1の実施の形態について説明する。第1の実施の形態は、あるサーバが、細かい時間粒度で観測可能な飽和状態となっても、その影響で、システム全体の単位時間当たりの平均応答時間が乱高下することを抑止するものである。
図1は、第1の実施の形態に係る装置の機能構成例を示す図である。情報処理装置1は、多階層システムの一部を構成している。図1の例では、情報処理装置1は、サーバ2の下位の階層であり、サーバ4の上位の階層である。すなわち情報処理装置1は、サーバ2からのジョブの処理要求をコネクション3を介して受信し、受信した処理要求に応じてジョブを実行する。また情報処理装置1は、ジョブの実行の過程で、コネクション5を介して、サーバ4に対してジョブの処理要求を送信する。
情報処理装置1は、複数の実行手段1a−1,1a−2,1a−3,1a−4、決定手段1b、重いジョブの待ち行列1c、軽いジョブの待ち行列1d、算出手段1e、計数手段1f、および抑止手段1gを有する。
実行手段1a−1,1a−2,1a−3,1a−4は、サーバ2からのジョブの処理要求に応じて、処理要求で示されるジョブを実行する。実行手段1a−1,1a−2,1a−3,1a−4は、ジョブの実行過程において、サーバ4で実行させるジョブを生成し、そのジョブの処理要求を出力する。
なお実行手段1a−1,1a−2,1a−3,1a−4が生成するジョブは、複数のグループに分類されている。図1の例では実行手段1a−1,1a−2が生成するジョブで1つのグループが形成され、実行手段1a−3,1a−4が生成するジョブで他の1つのグループが形成されている。各グループは、属するジョブによるサーバ4への負荷が軽いほど上位となるように、グループが順位付けされている。実行手段1a−3,1a−4が生成するジョブが属するグループの方が上位であるものとする。なお、ジョブがサーバ4に与える負荷は、例えばそのジョブをサーバ4が実行したときの処理時間で判断できる。
実行手段1a−1,1a−2,1a−3,1a−4は、サーバ4に実行させるジョブを生成すると、そのジョブが属するグループに対応する待ち行列に、そのジョブの処理要求を登録(キューイング)する。例えば実行手段1a−1,1a−2は、重いジョブの待ち行列1cに、ジョブの処理要求を登録する。また実行手段1a−3,1a−4は、軽いジョブの待ち行列1dに、ジョブの処理要求を登録する。
決定手段1bは、ジョブを種別に応じて複数のグループに分類する。例えば実行手段1a−1,1a−2,1a−3,1a−4は、それぞれ異なる種別のジョブを生成するものとする。このとき決定手段1bは、実行手段1a−1,1a−2,1a−3,1a−4それぞれが生成するジョブの種別ごとに、どのグループに属するかを決定する。例えば決定手段1bは、ジョブの種別ごとに、サーバ4に実行させたときの平均処理時間を計算し、平均処理時間が短い種別のジョブほど上位のグループとなるように、ジョブが属するグループを決定する。
また決定手段1bは、ジョブをサーバ4に実行させたときの、ジョブの種別ごとの平均処理時間と発生比率とに基づいて、ジョブが属するグループを決定することもできる。ジョブの種別の発生比率とは、全体のジョブに対する、その種別のジョブが占める割合である。例えば決定手段1bは、ジョブの種別ごとに、平均処理時間と発生比率とを計算する。次に決定手段1bは、種別ごとにジョブを複数のグループに振り分ける組み合わせパターンを複数生成する。さらに決定手段1bは、組み合わせパターンごとに、上位から所定数のグループ以外のグループに属するジョブの処理要求の抑止によるジョブの処理時間の短縮率を計算する。そして決定手段1bは、最も短縮率が大きくなる組み合わせパターンに従って、各種別のジョブが属するグループを決定する。決定手段1bは、種別ごとに、その種別のジョブが属するグループを決定すると、決定した結果を実行手段1a−1,1a−2,1a−3,1a−4に通知する。各実行手段1a−1,1a−2,1a−3,1a−4は、決定手段1bからの通知により、ジョブの処理要求を登録する待ち行列を認識できる。
重いジョブの待ち行列1cは、サーバ4に実行させるジョブのうち、重いジョブのグループに属するジョブの処理要求を格納する待ち行列である。
軽いジョブの待ち行列1dは、サーバ4に実行させるジョブのうち、軽いジョブのグループに属するジョブの処理要求を格納する待ち行列である。
算出手段1eは、抑止手段1gが重いジョブの処理要求のサーバ4への送信をするか否かの判断に使用する閾値を計算する。例えば算出手段1eは、複数のグループそれぞれについて、グループに属するジョブをサーバ4に実行させたときの平均処理時間と、サーバ4に実行させたジョブのうちそのグループに属するジョブが占める割合を示す発生比率とを計算する。そして算出手段1eは、複数のグループそれぞれについての平均処理時間と発生比率とに基づいて閾値T(Tは、0より大きい実数)を算出する。例えば算出手段1eは、グループごとに平均処理時間と発生比率とを乗算し、上位から所定数のグループそれぞれの乗算結果の合計を、複数のグループすべての乗算結果の合計で除算する。そして算出手段1eは、除算結果に、サーバ4に同時に実行させることを許容するジョブ数の最大値を乗算し、最大値の乗算結果を閾値Tとする。算出手段1eは、算出された閾値を、抑止手段1gに通知する。
計数手段1fは、サーバ4で実行中のジョブのうち、上位から所定数のグループに属するジョブの数a(aは、1以上の整数)を計数する。例えば計数手段1fは、軽いジョブの処理要求をサーバ4に送信するのに使用されているコネクション5の数を、上位から所定数のグループに属するジョブの数aとする。
抑止手段1gは、計数したジョブの数aが予め定められた閾値T以上であり、かつ上位から所定数のグループに属する処理待ちのジョブがあるという条件が満たされるかどうかを判断する。そして抑止手段1gは、条件が満たされた場合、上位から所定数のグループ以外のグループに属するジョブの処理要求を抑止対象として、抑止対象の処理要求のサーバ4への送信を抑止する。なお、上位から所定数のグループに属する処理待ちのジョブがあるかどうかは、例えば軽いジョブの待ち行列1dに、少なくとも1つのジョブの処理要求が登録されているかどうかで判断できる。また抑止手段1gは、抑止対象の処理要求を送信する実行手段へのコネクションの割り当てを停止することで、停止対象の処理要求のサーバ4への送信を抑止することができる。
このような情報処理装置1によれば、サーバ2からのジョブの処理要求が入力されると、実行手段1a−1,1a−2,1a−3,1a−4によってジョブが実行される。なお実行手段1a−1,1a−2,1a−3,1a−4には、決定手段1bから、サーバ4に実行させるジョブの属するグループが指定されている。実行手段1a−1,1a−2,1a−3,1a−4は、ジョブの実行過程で、サーバ4に実行させるジョブを生成すると、そのジョブが属するグループに応じた待ち行列に、そのジョブの処理要求を登録する。
軽いジョブの待ち行列1dに登録されたジョブの処理要求は、コネクション5を介して順次サーバ4に送信される。そして軽いジョブはサーバ4で実行される。このとき、計数手段1fにより、サーバ4で実行されているジョブのうちの、軽いジョブの数が計数される。
抑止手段1gには、算出手段1eによって算出された閾値Tが予め通知されている。そして重いジョブの待ち行列1cにジョブの処理要求が登録されると、抑止手段1gが、サーバ4で実行中の軽いジョブの数aが、閾値Tより少ないかどうかを判断する。軽いジョブの数aが閾値Tより少なければ、重いジョブの待ち行列1cからジョブの処理要求が取り出され、コネクション5を介してサーバ4に送信される。他方、軽いジョブの数aが閾値T以上の場合、重いジョブの待ち行列1cに登録されたジョブの処理要求のサーバ4への送信は抑止される。
このようにして、サーバ4に与える負荷の大きいジョブの待ち時間に、負荷の小さいジョブが巻き込まれることを最少化し、多階層システム全体の平均応答時間の乱高下を抑止することができる。
すなわち第1の実施の形態では、ジョブ実行の優先度制御を、サーバ4で実行中の上位のグループに属するジョブの数に基づいて行っている。これは、サーバ4において飽和しつつある資源の状態を、同時実行ジョブ数の増減から判断していることになる。こうすることによって、サーバ4の処理能力が飽和しつつあることを、完全に飽和しきる前の適切なタイミングで判断できる。そしてサーバ4の資源が飽和しつつある場合、軽いジョブの待ち行列1dに、閾値Tより多くの待機ジョブが発生する前に、処理負荷の重いジョブの処理要求の送信を抑止することが可能となる。処理負荷の重いジョブの処理要求の送信が抑止されれば、軽いジョブの処理要求が優先的にサーバ4に送信される。これにより、軽いジョブが重いジョブの処理待ちに巻き込まれ、軽いジョブの処理時間が長期化することが抑止される。また軽いジョブは短時間で処理が完了するため、コネクションの占有時間も短くて済む。そして多数のジョブが短時間で終了すれば、平均応答時間が長くならずに済み、サーバ4の処理能力が飽和しそうであっても、その影響が、情報処理装置1やその上位のサーバ2で増幅されることがなくなる。その結果、多階層システム全体において、応答時間の乱高下の発生が抑止される。
なお、図1に示した実行手段1a−1,1a−2,1a−3,1a−4、決定手段1b、算出手段1e、計数手段1f、および抑止手段1gは、例えば情報処理装置1が有するプロセッサにより実現することができる。また、重いジョブの待ち行列1c、軽いジョブの待ち行列1dは、例えば情報処理装置1が有するRAM(Random Access Memory)により実現することができる。
また、図1に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、Web3階層システムにおいて、実行するジョブの優先度制御を行うことで、各階層のサーバでの応答時間の変動を抑制するものである。なお以降の説明では、サーバにジョブの処理要求を送信することを、ジョブを投入すると呼ぶ。
ここで、Web3階層システムにおいて、細かい時間粒度で観測できる飽和状態が多階層コンピュータシステムの下の方の階層で発生したときに、最終的にシステム全体の応答時間が激しく乱高下するメカニズムについて説明する。応答時間が乱高下する現象が発生するメカニズムは、下記の通りである。
ステップ1.システムの各階層への入力ジョブ数は、特別に制御されている場合を除いては、細かな時間粒度で観測すると変動している。これは自然なことである。
ステップ2.システムの負荷の増大につれて、入力ジョブが、多階層コンピュータシステム内の1つ以上の階層の処理能力を飽和させ始める。この段階では、細かな時間粒度で平均応答時間を測定した場合に、一部の時間帯で処理能力の飽和が観測できる程度である。
ステップ3.多階層システム内のある階層の処理能力が一時的にでも飽和すると、その瞬間、その階層を利用するすべてのジョブが、その階層の処理能力に余裕ができるのを待たされる。
ステップ4.多階層システム内には軽い(処理時間が短い)ジョブもあれば重い(処理時間が長い)ジョブもあり、前ステップにおける飽和した階層の処理能力の空き待ちにおいて、軽いジョブが重いジョブの処理完了を待つことが発生する。そのため、軽いジョブであっても重いジョブと同等に応答時間が増大する。結果として、そこの階層における全ジョブ平均の応答時間が急激に上昇する。
ステップ5.平均応答時間の上昇は、同時処理されるジョブ数の増加を招き、上位階層において、ソフトウェア上の有限な資源(プロセス/スレッドやコネクション等)を消費し尽くし、その結果として、ステップ3〜5が再帰的に繰り返される。
ステップ6.変動する入力ジョブ量がピークを過ぎて減少すると、飽和していた階層に処理能力の余力が生まれ、上記の応答時間の増加が解消し、応答時間が減少して元のレベルに戻る。
平均値で測定すると各階層が処理能力に余力を残している段階で、このような応答時間の急激な増加や乱高下が発生すると、その応答時間の増加はエンドユーザへ約束した応答時間(SLA(Service Level Agreement)など)の達成を阻害する。また、原因不明の性能劣化と認識され、調査コストが増大することにもなる。
本現象の発生メカニズムを掘り下げて分析すると、以下のような原因が存在することが分かる。
第1の原因:1つの多階層コンピュータシステム内には様々な種類のジョブが混在し、それらがシステム内の各種資源を消費する量は各々異なる。ある資源の観点でみると、軽い(資源消費時間が短い)ジョブと重い(資源消費時間が長い)ジョブとが存在する。そのため、ある資源が飽和した際には、軽いジョブが重いジョブの処理待ちに巻き込まれて、平均応答時間が一気に増大する。
第2の原因:第1の原因によって増加した平均応答時間が、同時処理されるジョブ数の増加を招き、上位の階層において、ソフトウェア上の有限な資源を消費し尽くして、応答時間の増加をさらに拡大させる。
これらの原因について、図2を参照して説明する。
図2は、応答時間が乱高下する原因の一例を示すシーケンス図である。Webサーバ910には複数のスレッド911,912が生成されている。スレッド911,912は、ユーザが使用する端末装置から入力された処理要求に応じて生成されている。スレッド911,912は、それぞれ処理要求に応じたジョブ913,914を実行する。スレッド911,912は、ジョブ913,914の実行過程において、Appサーバ920との連携動作を行う処理があると、Appサーバ920に依頼するジョブを生成し、そのジョブをAppサーバ920に投入する。
Appサーバ920は、Webサーバ910からのジョブ投入に応じ、スレッド921,922を生成する。スレッド921は、スレッド911から投入されたジョブ923を実行する。スレッド922は、スレッド912から投入されたジョブ924を実行する。スレッド921は、ジョブ923の実行過程で、DBサーバ930に対するジョブの投入を3回行う。スレッド921が投入するジョブ1つ当たりのDBサーバ930での処理時間は短いが、3個のジョブ933〜935からなる一連のジョブの最初のジョブ933の投入から、最後のジョブ935の完了までの処理時間は長い。そのため、一連のジョブは重いジョブとして扱われる。また、スレッド922がDBサーバ930に投入するジョブ936は、DBサーバ930の処理能力が飽和していなければ、短時間で実行可能な軽いジョブであるものとする。
スレッド921,922は、ジョブ923,924の実行過程において、DBサーバ930との連携動作を行う処理があると、割り当てられたコネクションを用いて、DBサーバ930へジョブの処理要求を送信する。DBサーバ930では、スレッド931が、スレッド921から投入されたジョブ933〜935を実行する。またスレッド932が、スレッド922から投入されたジョブ936を実行する。このとき、図2の例では、DBサーバ930の処理能力が飽和状態にある。そのため、軽いジョブであるジョブ936の応答時間が長期化している。これは第1の原因に示したように、軽いジョブが重いジョブの処理に巻き込まれ、DBサーバ930内でジョブ936の処理待ちが発生したためである。
DBサーバ930のスレッド931,932は、ジョブの実行が完了すると、Appサーバ920に完了応答を返す。Appサーバ920のスレッド921は、ジョブ933の完了応答を受信すると、次のジョブ934をDBサーバ930に投入する。
さらにスレッド921,922は、ジョブ933〜935,936の完了応答を受信し、それぞれが実行するジョブ923,924が完了すると、Webサーバ910にジョブ完了の応答を送信する。Webサーバ910のスレッド911,912は、Appサーバ920のスレッド921,922からのジョブ完了の応答を受信後、それぞれが実行するジョブ913,914が完了すると、処理要求を送信した端末装置に、ジョブ完了の応答を送信する。
このように、重いジョブ933〜935の影響で軽いジョブ936の応答時間が長期化したことで、Appサーバ920においてジョブ936を投入したスレッド922の応答時間も長期化する。さらに、Webサーバ910においてジョブ924を投入したスレッド912の応答時間も長期化する。このように、ジョブ936の長期化の提供が、上位層のサーバに伝搬している。各サーバにおける応答時間が長期化すると、コネクションが専有される時間も長期化し、コネクションプール内のコネクションの枯渇を誘発する場合がある。すると、コネクションの割り当て待ちのスレッドが発生し、さらに応答時間の長期化が促進される。その結果、端末装置から観測した場合、処理要求に対する平均応答時間が乱高下する。
図3は、ジョブの優先度制御を行わない場合の平均応答時間の変化の一例を示す図である。図3のグラフは、横軸に時間進行を示し、縦軸に応答時間を示している。応答時間は、細かい時間粒度(例えば0.1秒)ごとの平均応答時間である。図3に示した例では、粗い時間粒度(例えば1秒)でサーバごとの平均応答時間を計測しても、各サーバの処理能力は飽和していない。それにも拘わらず、細かい時間粒度で観測すると、図3に示すように、応答時間が乱高下する。
この問題の解決に関連する技術としては、以下の3つの参考技術が考えられるが、それぞれに問題を抱えている。
図4は、第1の参考技術を示す図である。第1の参考技術は、ジョブの種別(ジョブ種)ごとの他のサーバに投入するジョブの比率が最適となるように、パラメータで静的に設定するものである。
処理能力が飽和しそうな階層のサーバにジョブを投入する階層のサーバにおいて、アプリケーション925a,925b,925c,925dそれぞれが個別のジョブ種のジョブを投入するものとする。アプリケーション925a,925b,925c,925dには、コネクションプール926a,926b,926c,926dが対応付けられている。アプリケーション925a,925b,925c,925dは、対応するコネクションプールからコネクションの割り当てを受け、割り当てられたコネクションを用いてジョブを投入する。第1の参考技術では、アプリケーション925a,925b,925c,925dそれぞれがDBサーバ930に送り込むジョブ数の割合を、パラメータで静的に最適値に設定しておく。コネクションプール926a,926b,926c,926dそれぞれには、対応するアプリケーションが送り込むジョブ数の割合に応じた数のコネクションが用意される。
この第1の参考技術は、以下の2つの問題を有している。
第1の問題は、ジョブ種別間の投入されるジョブ数の割合が完全に一定となるように特別な制御がなされていない限り、静的に定めた固定のジョブ投入割合が適切に機能しないことである。特別な制御がなされていない一般的な状況下では、ジョブ種別間の投入されるジョブ数の割合は細かな時間間隔で動的に変動する。このような状況下では、第1の参考技術では、処理能力に余力があるときには十分な量のジョブを下位の階層へ送り込めずに、そのことによって性能低下が発生することがある。
例えば、図4の例では、アプリケーション925a,925b,925c,925dそれぞれが投入するジョブ数の割合が、[4:3:1:2]に設定されているものとする。このとき、アプリケーション925bの投入するジョブが想定よりも多いと、図4に示すように、DBサーバ930に処理能力の余力があるにも拘わらず、アプリケーション925bが投入するジョブだけが、長い待ち行列927bで投入を待たされる。
第2の問題は、ジョブ投入割合を静的に定めたのでは、上記第1の原因も第2の原因も解決できないことである。処理能力が飽和しそうな階層に対して送り込むジョブの割合を固定すると、その階層の処理能力が飽和した瞬間に、送り手側にジョブが滞留して待ち行列に並ぶことになる。その送り手側の待ち行列の中で、重いジョブが終了しても、また重いジョブが投入される。そして、軽いジョブは、重いジョブの影響で応答時間が長期化する。
図5は、第2の参考技術を示す図である。第2の参考技術は、上位階層からのジョブの送付量を資源の飽和状況に応じて動的に制御するものである。
飽和しつつある階層の処理能力の飽和状況に応じて、その階層にジョブを送り込んでいる前の階層(上位階層)において、ジョブの送付量・送付割合を動的に変更することが可能である。例えば図5に示すように、DBサーバ930内のエージェント937が、処理能力の飽和状況をAppサーバ920に通知する。Appサーバ920では、通知された処理能力の飽和状況に応じて、アプリケーション925a,925b,925c,925dごとの投入するジョブ数の割合を動的に変更する。投入するジョブ数の割合を動的に応じて、例えばコネクションプール926a,926b,926c,926dが割り当てるコネクション数も変動する。これにより、状況に応じて投入するジョブ数の割合を最適化でき、上記第1の原因や第2の原因の問題点を解決できる可能性がある。
しかし、多階層システムでは、処理能力が飽和しつつある階層と、そこに対してジョブを送り込む階層とが異なる。このような状況下では、ジョブを送り込む階層において、処理能力が飽和しつつある階層の飽和状況を取得するのにコンピュータ間通信を必要とする。第2の参考技術では、飽和状況を取得する際の通信時間の分のタイムラグがあることによって、飽和状況を取得した後に動的制御を実施したとしても、極めて短時間に発生する飽和状態に対処するには、制御のタイミングが間に合わない。そのため、DBサーバ930において短時間だけ発生した飽和状態の影響で、Appサーバ920の各アプリケーション925a,925b,925c,925dそれぞれから投入するジョブの待ち行列927a,927b,927c,927dが長くなる。
図6は、第3の参考技術を示す図である。第3の参考技術は、待ち行列の長さに応じて、ジョブ投入の優先度を動的に制御するものである。
第3の参考技術では、DBサーバ930に対してジョブを送り込んでいるAppサーバ920において、優先度制御部928が、ジョブの待ち行列927a,927b,927c,927dの長さから、DBサーバ930の処理能力の飽和状態を推測する。そして優先度制御部928は、DBサーバ930の飽和状態に応じて、各アプリケーション925a,925b,925c,925dのジョブの送付量・送付割合を動的に変更する。第3の参考技術は、第2の参考技術で問題となった、階層が異なるために処理能力が飽和しつつある階層の情報収集にタイムラグが発生して、適切なタイミングで動的制御を掛けられないという問題の解決を試みている。そして、処理能力の飽和状況に応じて、異なるジョブ投入割合を設定できるので、最適化できる可能性がある。しかし、第3の参考技術にも以下の問題が残っている。
待ち行列が発生した段階で既に処理能力は完全に飽和しきっており、その段階で動的制御を開始したとしても、現在の飽和状態が解消されるまでの間は、次のジョブの実行が待たされることになる。もし、その瞬間に実行中のジョブが重いジョブばかりならば、重いジョブの処理が完了するまで、軽いジョブの投入が待たされることになり、上記の第1の原因が発生してしまう。
これから詳細に説明する第2の実施の形態では、上位の階層のサーバにおいて、その階層からジョブを投入する下位の階層のサーバで短時間に発生する飽和状態になりつつあることを迅速に検出し、ジョブの優先度制御を行う。これにより、軽いジョブが重いジョブの処理待ちに巻き込まれて平均応答時間が長期化するのを抑止し、上位の階層のサーバで資源が無駄に消費されることを抑止する。すなわち、ジョブを送り込む階層において、送り込み先の階層の処理能力が飽和しつつあるかどうかを、処理能力が飽和しきって長い待ち行列が発生する前の段階において検出し、その段階において、軽いジョブと重いジョブの処理優先度の動的制御を開始する。それによって、処理能力が飽和した際に発生する、軽いジョブが重いジョブの処理待ちに巻き込まれるという現象を極力避けて、システム全体としての応答時間が必要以上に増加することを抑制する。上記第1の原因の発生が抑止されれば、第1の原因から連鎖的に発生する第2の原因も抑止される。
以下、第2の実施の形態について詳細に説明する。
図7は、第2の実施の形態のシステムの全体構成を示す図である。このシステムは、分析サーバ400、Webサーバ200、Appサーバ100、およびDBサーバ300を有する。Webサーバ200と、Appサーバ100とは、スイッチ装置31を介して相互に接続されている。Appサーバ100とDBサーバ300とは、スイッチ装置32を介して相互に接続されている。
スイッチ装置31,32は、ポートミラーリング機能を有している。スイッチ装置31,32それぞれのポートミラーリング用のポートには、スイッチ装置34が接続されている。スイッチ装置31は、ポートミラーリングにより、Webサーバ200とAppサーバ100との間で送受信されるパケットをコピーし、スイッチ装置34に送信する。スイッチ装置32は、ポートミラーリングにより、Appサーバ100とDBサーバ300との間で送受信されるパケットをコピーし、スイッチ装置34に送信する。
ネットワークタップ33のモニタ用ポートには、スイッチ装置34が接続されている。ネットワークタップ33は、Webサーバ200とネットワーク10との間で通信されるパケットをコピーし、スイッチ装置34に送信する。
スイッチ装置34には、分析サーバ400が接続されている。スイッチ装置34は、他のスイッチ装置31,32や、ネットワークタップ33から送られたパケットを、分析サーバ400に転送する。
端末装置29a,29b,・・・は、ネットワーク10を介してWebサーバ200にアクセス可能である。端末装置29a,29b,・・・のユーザは、Webサーバ200が提供するGUI(Graphical User Interface)を端末装置29a,29b,・・・から操作してシステムを利用できる。
分析サーバ400は、Webサーバ200、Appサーバ100およびDBサーバ300の稼働状況を管理する。分析サーバ400は、稼働状況を管理するための情報を、スイッチ装置34を介して取得することができる。すなわち、分析サーバ400は、スイッチ装置34から送信される通信パケットを受信して、記憶する(パケットキャプチャ)。分析サーバ400は、キャプチャしたパケットを解析し、処理能力が飽和状態となったサーバを検出する。分析サーバ400は、最上位の階層のサーバ(Web3階層システムではWebサーバ200)以外のサーバにおいて処理能力が飽和状態となったことを検出すると、そのサーバの上位のサーバに、ジョブ実行優先度制御を有効(ON)に変更する指示を送信する。
Webサーバ200は、Webブラウザを実行する端末装置29a,29b,・・・から出力された処理要求(メッセージ)を受け付ける。ここで、Webサーバ200と端末装置29a,29b,・・・とのメッセージ交換は、例えばHTTP(HyperText Transfer Protocol)によって行われる。
Webサーバ200は、端末装置29a,29b,・・・から受信した処理要求に基づいて、静的コンテンツに関しては自装置でHTTPレスポンスを生成し、端末装置29a,29b,・・・に送信する。なお、動的コンテンツに関しては、Appサーバ100に依頼すべき処理(ジョブ)の処理要求(メッセージ)を生成して、Appサーバ100に送信する。ここで、Webサーバ200とAppサーバ100とのメッセージ交換は、例えばIIOP(Internet Inter-ORB(Object Request Broker) Protocol)によって行われる。Webサーバ200は、処理要求に対する応答をAppサーバ100から受信すると、その応答内容に基づいて端末装置29a,29b,・・・への応答メッセージを生成する。そしてWebサーバ200は、生成した応答メッセージを端末装置29a,29b,・・・に送信する。
Appサーバ100は、Webサーバ200から受信した処理要求に基づいてDBサーバ300に依頼すべき処理(ジョブ)のクエリを生成し、DBサーバ300に送信する。ここで、Appサーバ100が生成するクエリは、例えばSQL(Structured Query Language)文によって表記され、DBサーバ300に固有のプロトコルでDBサーバ300へと送信される。Appサーバ100は、DBサーバ300から応答を受信すると、その応答内容に基づいてWebサーバ200への応答メッセージを生成する。そしてAppサーバ100は、生成した応答メッセージをWebサーバ200に送信する。
DBサーバ300は、Appサーバ100から受信したクエリに含まれるSQL文を実行してDBの参照や更新等の処理を実行する。DBサーバ300は、その処理結果に基づいてDBレスポンスを生成する。そしてDBサーバ300は、生成した応答メッセージを、Appサーバ100に送信する。
なお、以下の説明では、各サーバという場合、Webサーバ200、Appサーバ100およびDBサーバ300を示すものとする。さらに、Webサーバ200は、Appサーバ100およびDBサーバ300よりも上位層のサーバであるものとする。また、Appサーバ100は、DBサーバ300よりも上位層のサーバであるものとする。
図8は、第2の実施の形態に用いるAppサーバのハードウェアの一構成例を示す図である。Appサーバ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してRAM102と複数の周辺機器が接続されている。なおプロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、MPU(Micro Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、またはPLD(Programmable Logic Device)である。またプロセッサ101は、CPU、MPU、DSP、ASIC、PLDのうちの2以上の要素の組み合わせであってもよい。
RAM102は、Appサーバ100の主記憶装置として使用される。RAM102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM102には、プロセッサ101による処理に必要な各種データが格納される。
バス109に接続されている周辺機器としては、HDD(Hard Disk Drive)103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108a,108bがある。
HDD103は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、Appサーバ100の補助記憶装置として使用される。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
グラフィック処理装置104には、モニタ11が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ11の画面に表示させる。モニタ11としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード12とマウス13とが接続されている。入力インタフェース105は、キーボード12やマウス13から送られてくる信号をプロセッサ101に送信する。なお、マウス13は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク14に記録されたデータの読み取りを行う。光ディスク14は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク14には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、Appサーバ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置15やメモリリーダライタ16を接続することができる。メモリ装置15は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ16は、メモリカード17へのデータの書き込み、またはメモリカード17からのデータの読み出しを行う装置である。メモリカード17は、カード型の記録媒体である。
ネットワークインタフェース108aは、スイッチ装置31に接続されている。ネットワークインタフェース108aは、スイッチ装置31を介して、Webサーバ200などの他のコンピュータとの間でデータの送受信を行う。
ネットワークインタフェース108bは、スイッチ装置32に接続されている。ネットワークインタフェース108bは、スイッチ装置32を介して、DBサーバ300などの他のコンピュータとの間でデータの送受信を行う。
以上のようなハードウェア構成によって、Appサーバ100は、第2の実施の形態の処理機能を実現することができる。なおWebサーバ200、DBサーバ300、および分析サーバ400も、Appサーバ100と同様のハードウェアにより実現することができる。また図1に示した第1の実施の形態に係る情報処理装置1も、図8に示したAppサーバ100と同様のハードウェアにより実現することができる。
Appサーバ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。Appサーバ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、Appサーバ100に実行させるプログラムをHDD103に格納しておくことができる。プロセッサ101は、HDD103内のプログラムの少なくとも一部をRAM102にロードし、プログラムを実行する。またAppサーバ100に実行させるプログラムを、光ディスク14、メモリ装置15、メモリカード17などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、HDD103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
次に、ジョブ実行優先度制御を行うためのAppサーバ100の機能について説明する。
図9は、Appサーバの機能の一例を示すブロック図である。Appサーバ100は、パラメータ記憶部110、状態設定部120、閾値算出部130、複数のアプリケーション141,142,143,144、複数のジョブ制御部150,160、および振り分け決定部170を有する。
パラメータ記憶部110は、ジョブへのコネクションの割り当てに利用される各種パラメータを記憶する。例えばRAM102またはHDD103の記憶領域の一部が、パラメータ記憶部110として使用される。
状態設定部120は、ジョブ実行優先度制御を実行するか否かを示すジョブ実行優先度制御状態を示すフラグを、パラメータ記憶部110に格納する。また状態設定部120は、DBサーバ300に対して同時に実行させることができる最大のジョブ数を示す同時最大実行ジョブ数N(Nは、1以上の整数)を、パラメータ記憶部110に格納する。例えば状態設定部120は、ジョブ実行優先度制御状態の変更指示を分析サーバ400から取得し、取得した変更指示に従ってジョブ実行優先度制御状態を示すフラグを、パラメータ記憶部110に格納する。また状態設定部120は、同時最大実行ジョブ数を分析サーバ400から取得し、取得した同時最大実行ジョブ数をパラメータ記憶部110に格納する。
閾値算出部130は、重いジョブを投入するスレッドへコネクションを割り当てるか否かの判断に利用する閾値α(αは、0<α<Nを満たす実数)を算出する。そして閾値算出部130は、例えば、DBサーバ300で実行されているジョブのうち、軽いジョブの数が閾値αより少なければ、重いジョブを投入するスレッドへのジョブ投入用のコネクションの割り当てを許容する。
閾値算出部130は、閾値αを、例えば、それまでに取得し蓄積した統計値(低負荷時における各ジョブ種の平均処理時間と発生比率)から自動算出する。低負荷という判断は、例えば、DBサーバ300で実行されている同時に実行されているジョブ数が所定値より少ないことで判定できる。また、第2の実施の形態における処理時間とは、1つのスレッドが最初のジョブを実行開始してから最後のジョブの実行が完了するまでの時間となる。第2の実施の形態では、ジョブの投入の際にコネクションの割り当てが行われる。そのため、スレッドがコネクションプールからコネクションの割り当てを受け、そのスレッドがコネクションを返却するまでの時間が、そのスレッドが投入したジョブの処理時間となる。そして、あるジョブ種のジョブの処理時間の平均が、そのジョブ種の平均処理時間である。
なおコネクションを使用している時間の中で、DBサーバ300へリクエストを送ってから返信を待っている時間(DBサーバ300へ複数回のリクエストを送る場合はそれらの合計)を処理時間とすることもできる。このほうが、DBサーバ300に与える負荷が正確に表される。ただし、コネクションの割り当てから解放までの時間を処理時間としても、DBサーバ300に与える負荷の度合いが十分正確に反映されている。
ジョブ種の発生比率とは、全ジョブの中で、そのジョブ種に属するジョブが占める割合である。
これら統計値より、DBサーバ300における同時実行ジョブ数の合計が、最大同時実行ジョブ数Nとなったときに、DBサーバ300で同時に実行されるジョブに含まれる軽いジョブの数の期待値を算出することができる。閾値算出部130は、その期待値を閾値αとして用いることができる。この場合、閾値算出部130は、ジョブ種ごとに、そのジョブ種に属するジョブの平均処理時間と発生比率とを乗算する。次に閾値算出部130は、軽いジョブ種それぞれの乗算結果の合計を、全ジョブ種それぞれの乗算結果の合計で除算する。閾値算出部130は、除算結果に最大同時実行ジョブ数Nを乗算した値を、閾値αとする。
例えば、最大同時実行ジョブ数N=6の場合において、統計値が
ジョブA(軽いジョブに分類):平均処理時間5ms,発生比率0.30
ジョブB(軽いジョブに分類):平均処理時間2ms,発生比率0.35
ジョブC(重いジョブに分類):平均処理時間20ms,発生比率0.20
ジョブD(重いジョブに分類):平均処理時間30ms,発生比率0.15
の場合を想定する。この場合の閾値αは、(5×0.30+2×0.35)÷(5×0.30+2×0.35+20×0.20+30×0.15)×6=1.23となる。軽いジョブを優先させる閾値αが1.23なので、同時実行されている軽いジョブの数が、1.23を超えたら(ジョブ数は整数なので1を超えて2に達したら)、その超えている間は軽いジョブが重いジョブより優先して実行される。
この閾値αは、動的に変更することも可能である。例えば閾値算出部130は、定期的に、なるべく近い時期に収集した統計値で新たな閾値αを計算し、古い統計値から算出した古い閾値αを更新してもよい。使用される統計値はいずれも、アプリケーション141〜144で収集することができる。なおジョブ制御部150,160が統計値を収集してもよい。
アプリケーション141,142,143,144は、アプリケーションソフトウェアによって実現される処理機能である。例えばアプリケーション141,142,143,144は、サーブレットと呼ばれるプログラムをプロセッサ101が実行することで実現される。
アプリケーション141は、Webサーバ200からのジョブの処理要求に応じてジョブを実行する。またアプリケーション141は、ジョブの実行過程において、適宜DBサーバ300に対してジョブを投入する。DBサーバ300からジョブの実行結果が応答されると、アプリケーション141は、Webサーバ200から投入されたジョブの続きを実行する。そしてアプリケーション141は、ジョブの実行が終了すると、ジョブの実行結果をWebサーバ200に送信する。例えばアプリケーション141は、Webサーバ200からジョブの処理要求が入力されるごとに、スレッド141aを立ち上げ、立ち上げたスレッド141aに、処理要求に従ったジョブを実行させる。
なおアプリケーション141は、振り分け決定部170によって、DBサーバ300へジョブを投入する際に使用するジョブ制御部が指定されている。例えばジョブを実行するスレッド141aは、DBサーバ300へのアクセスが必要な場合、DBサーバ300に投入するジョブを生成する。生成されたジョブは、処理内容などを定義した情報である。そしてスレッド141aは、生成したジョブをDBサーバ300に投入するためのコネクションの割り当て要求を、指定されたジョブ制御部に送信する。これにより、アプリケーション141は、ジョブの投入に使用するコネクションの割り当てを受けることができる。
またアプリケーション141は、計測部141bを有している。計測部141bは、アプリケーション141の各スレッドがDBサーバ300に投入した一連のジョブの平均処理時間、呼出回数などを計測する。一連のジョブの平均の処理時間は、例えば、1つのスレッドが投入した一連のジョブのうちの、先頭のジョブの投入時刻から、最後のジョブの実行完了の応答時刻までの時間である。また呼出回数は、例えば、各スレッドがDBサーバに投入したジョブの数である。
アプリケーション142,143,144は、アプリケーション141と同様に、スレッド142a,143a,144aを用いてジョブを実行する。またアプリケーション142,143,144は、計測部142b,143b,144bを有する。アプリケーション142,143,144は、それぞれ振り分け決定部170によって、DBサーバ300へジョブを投入する際に使用するジョブ制御部が指定されている。アプリケーション142、143,144のスレッド142a,143a,144aは、予め指定されたジョブ制御部を介して、DBサーバ300にジョブを投入する。計測部142b,143b,144bは、アプリケーション142,143,144の各スレッドがDBサーバ300に投入した一連のジョブの平均処理時間、呼出回数などの統計値を計測する。
ジョブ制御部150,160の一方は、DBサーバ300に同時に実行させる重いジョブの数を制御し、他方は、DBサーバ300に同時に実行させる軽いジョブの数を制御する。第2の実施の形態では、ジョブ制御部150が重いジョブのジョブ数を制御し、ジョブ制御部160が軽いジョブのジョブ数を制御するものとする。
ジョブ制御部150は、DBサーバ300との通信用に確立されたコネクションのコネクションプール151を有している。そしてジョブ制御部150は、コネクションプール151に含まれるコネクションを、重いジョブをDBサーバ300に投入するスレッドに割り当てる。ただしジョブ制御部150は、使用中の合計のコネクション数が所定の最大同時実行ジョブ数Nを超えないように、コネクションの割り当てを制御する。またジョブ制御部150は、ジョブ実行優先度制御がON(有効)になっており、DBサーバ300で実行されている軽いジョブの数が閾値αを超えており、かつ投入待ちの軽いジョブが存在する場合には、重いジョブのDBサーバ300への投入を抑止する。
ジョブ制御部160は、DBサーバ300との通信用に確立されたコネクションのコネクションプール161を有している。そしてジョブ制御部160は、コネクションプール161に含まれるコネクションを、軽いジョブをDBサーバ300に投入するスレッドに割り当てる。ただしジョブ制御部160は、使用中の合計のコネクション数が最大同時実行ジョブ数Nを超えないように、コネクションの割り当てを制御する。
振り分け決定部170は、アプリケーション141〜144がDBサーバ300に投入するジョブの、ジョブ制御部150,160への振り分けを決定する。例えばユーザからの入力に従って、アプリケーション141〜144それぞれが使用するジョブ制御部150,160を決定することができる。
また振り分け決定部170は、アプリケーション141〜144それぞれが使用するジョブ制御部を、以下のように自動決定することもできる。その場合、振り分け決定部170は、それまでに取得した統計値から、各ジョブ種別をどのような組み合わせでジョブ制御部150,160に割り振れば、処理時間の短縮効果が最も高くなるかを見積もる。統計値は、例えば低負荷時におけるジョブ種ごとの平均処理時間や、処理能力が飽和している期間のジョブ種ごとの発生数である。なお、第2の実施の形態では、同じアプリケーションから投入されるジョブは、同じジョブ種とする。
例えば、振り分け決定部170は、ジョブ種を、処理の重さ(待ち時間がない場合の平均処理時間の長さ)順にソートする。次に振り分け決定部170は、ソートされたジョブ種の配列を任意の位置で分割し、分割位置よりも重い方のジョブ種を重いジョブ種群、分割位置よりも軽い方のジョブ種を軽いジョブ種群とする。振り分け決定部170は、ジョブ種の配列上の分割位置を変えながら、重いジョブ種群と軽いジョブ種群との組み合わせパターンを複数生成する。
次に、振り分け決定部170は、生成した組み合わせパターンごとに、処理時間の短縮効果を見積もる。処理時間の短縮効果の見積もりには、例えば、重いジョブ種群に属する重いジョブと軽いジョブ種群に属する軽いジョブとの、DBサーバ300が低負荷時の平均処理時間の比率m:1(mは1以上の実数)を用いる。ここで、DBサーバ300の処理能力が飽和している期間における重いジョブと軽いジョブとの発生数を、それぞれn1とn2とする。このとき、最悪のスケジューリングの場合の処理時間と最高のスケジューリングの場合の処理時間の比は以下の通りとなる。
振り分け決定部170は、生成した複数の組み合わせパターンごとに、式(1)で示した比率を計算する。さらに振り分け決定部170は、式(1)で示した比が最適となる組み合わせパターンを選出する。比が最適であるとは、例えば、比の値の逆数(最高のスケジューリングの合計処理時間/最悪のスケジューリングの合計処理時間)が最も小さいことである。そして振り分け決定部170は、選出した組み合わせパターンに従って、各アプリケーションからのコネクション割り当て要求の送信先となるジョブ制御部を決定する。
なお、比の値の逆数は、最悪のスケジューリングから最高のスケジューリングに、ジョブの実行順を変更した場合の平均処理時間の短縮率を表している。平均処理時間の短縮率が一定の閾値(例えば0.7(70%))を超えなかった場合は、ジョブ実行の優先度制御を行ったとしても効果が小さい。そこで比が最適の組み合わせパターンであっても平均処理時間の短縮率が一定の閾値以上の場合、ジョブ実行の優先度制御をOFFにしてもよい。効果が発揮できない場合には、ジョブ実行の優先度制御をOFFにしておくことで、Appサーバ100の処理負荷を軽減できる。
なお図9に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、閾値算出部130は、図1に示した第1の実施の形態の算出手段1eの一例である。アプリケーション141〜144は、図1に示した第1の実施の形態の実行手段1a−1,1a−2,1a−3,1a−4の一例である。ジョブ制御部150,160それぞれは、図1に示した第1の実施の形態の計数手段1fと抑止手段1gとを包含する機能の一例である。振り分け決定部170は、図1に示した第1の実施の形態の決定手段1bの一例である。
次にパラメータ記憶部110に格納されるパラメータについて詳細に説明する。
図10は、パラメータ記憶部のデータ構造の一例を示す図である。パラメータ記憶部110には、優先度制御フラグ111、最大同時実行ジョブ数112、閾値113、同時実行ジョブ数カウンタ114、重いジョブ実行数カウンタ115、軽いジョブ実行数カウンタ116、重いジョブ待ち数カウンタ117、および軽いジョブ待ち数カウンタ118が格納されている。
優先度制御フラグ111は、ジョブ実行優先度制御の状態を示すフラグである。例えばジョブ実行優先度制御が有効(ON)の場合、優先度制御フラグ111に「1」が設定される。またジョブ実行優先度制御が無効(OFF)の場合、優先度制御フラグ111に「0」が設定される。
最大同時実行ジョブ数112は、DBサーバ300に同時に実行させるジョブの最大数である。以下、最大同時実行ジョブ数112に設定された値をNとする。
閾値113は、ジョブ実行優先度制御が有効な場合に、重いジョブを投入するスレッドにコネクションを割り当てるか否かの判断基準となる閾値である。以下、閾値113の値をαとする。
同時実行ジョブ数カウンタ114は、DBサーバ300で同時に実行されているジョブ数を示すカウンタである。同時実行ジョブ数カウンタ114の初期値は「0」である。同時実行ジョブ数カウンタ114の値は、DBサーバ300にジョブが投入されるごとに、1ずつカウントアップされ、DBサーバ300で実行されたジョブが終了するごとにカウントダウンされる。
重いジョブ実行数カウンタ115は、DBサーバ300で実行中のジョブのうちの、重いジョブの数を示すカウンタである。重いジョブ実行数カウンタ115の初期値は「0」である。重いジョブ実行数カウンタ115の値は、DBサーバ300に重いジョブが投入されるごとに、1ずつカウントアップされ、DBサーバ300で実行された重いジョブが終了するごとにカウントダウンされる。
軽いジョブ実行数カウンタ116は、DBサーバ300で実行中のジョブのうちの、軽いジョブの数を示すカウンタである。軽いジョブ実行数カウンタ116の初期値は「0」である。軽いジョブ実行数カウンタ116の値は、DBサーバ300に軽いジョブが投入されるごとに、1ずつカウントアップされ、DBサーバ300で実行された軽いジョブが終了するごとにカウントダウンされる。
重いジョブ待ち数カウンタ117は、DBサーバ300への投入待ち状態の重いジョブの数を示すカウンタである。重いジョブ待ち数カウンタ117の初期値は「0」である。重いジョブ待ち数カウンタ117の値は、重いジョブをDBサーバ300に投入するスレッドへのコネクションの割り当てが保留されるごとにカウントアップされる。また重いジョブ待ち数カウンタ117の値は、コネクションの割り当てが保留された、重いジョブをDBサーバ300に投入するスレッドについて、コネクションの割り当てを行うか否かの判断を再度行う際にカウントダウンされる。
軽いジョブ待ち数カウンタ118は、DBサーバ300への投入待ち状態の軽いジョブの数を示すカウンタである。軽いジョブ待ち数カウンタ118の初期値は「0」である。軽いジョブ待ち数カウンタ118の値は、軽いジョブをDBサーバ300に投入するスレッドへのコネクションの割り当てが保留されるごとにカウントアップされる。また軽いジョブ待ち数カウンタ118の値は、コネクションの割り当てが保留された、軽いジョブをDBサーバ300に投入するスレッドについて、コネクションの割り当てを行うか否かの判断を再度行う際にカウントダウンされる。
図10に示すようなパラメータ記憶部110内の各種パラメータを用いて、DBサーバ300の応答時間の変動を抑止させるような、コネクションの割り当てを行う。
図11は、コネクションの割り当て状況の一例を示す図である。図11の例では、アプリケーション141,142がDBサーバ300に投入するジョブは重いジョブであり、アプリケーション143,144がDBサーバ300に投入するジョブは軽いジョブである。そこでアプリケーション141,142には、コネクション割り当て要求の送信先として、DBサーバ300に実行させる重いジョブの数を制御するジョブ制御部150が指定されている。また、アプリケーション143,144には、コネクション割り当て要求の送信先として、DBサーバ300に実行させる軽いジョブの数を制御するジョブ制御部160が指定されている。
Webサーバ200とAppサーバ100との間には、複数のコネクション41が確立されている。またAppサーバ100とDBサーバ300との間にも、複数のコネクション42が確立されている。Appサーバ100とDBサーバ300との間に確立されたコネクションは、ジョブ制御部150,160において、コネクションプール151,161として管理されている。図11では、複数のコネクション41,42のうち、使用されているコネクションを実線で示し、使用されていないコネクションを点線で示している。
Webサーバ200からAppサーバ100へは、いずれかのコネクションを用いてジョブが投入される。Webサーバ200からAppサーバ100に投入されるジョブでは、ジョブを実行するアプリケーションが指定されている。Appサーバ100は、投入されたジョブで指定されたアプリケーションにそのジョブを実行させる。
各アプリケーション141〜144は、ジョブを実行する場合、そのジョブを実行するスレッドを生成する。そして生成したスレッドにジョブを実行させる。アプリケーション141〜144内のスレッドは、ジョブの実行中にDBサーバ300との連携処理が発生すると、DBサーバ300に投入するジョブを生成し、予め指定されたジョブ制御部にコネクション割り当て要求を送信する。例えば重いジョブを実行するアプリケーション141,142内のスレッドは、ジョブ制御部150に対してコネクション割り当て要求を送信する。また、軽いジョブを実行するアプリケーション143,144内のスレッドは、ジョブ制御部160に対してコネクション割り当て要求を送信する。
ジョブ制御部150,160では、コネクション割り当て要求に応じて、スレッドに対するコネクションの割り当てを行う。コネクションが割り当てられたスレッドは、そのコネクションを用いてDBサーバ300に対してジョブを投入する。コネクションの割り当てが保留された場合、そのスレッドが投入するジョブは、例えば、待ち行列141c,142c,143c,144cにキューイング(待ち行列の最後尾にジョブを登録すること)される。アプリケーション141,142それぞれが投入するジョブの待ち行列141c,142cは、例えばジョブ制御部150で管理される。またアプリケーション143,144それぞれが投入するジョブの待ち行列143c,144cは、例えばジョブ制御部160で管理される。
このような構成のWeb3階層システムにより、ユーザへのサービスが提供される。以下、DBサーバ300の処理能力の飽和状態の発生による、システム全体としての応答時間の乱高下を抑止する場合を例に採って、優先度制御処理を説明する。
図12は、第2の実施の形態に係るAppサーバの処理の概要を示す図である。ジョブ実行の優先度制御を行うかどうかは、分析サーバ400から送られる、優先度制御状態のON/OFF信号によって切り替えられる。例えば分析サーバ400は、各サーバが通信したパケットを収集して、短い時間間隔(例えば0.1秒)の時間帯ごとに、各サーバの処理能力が飽和しているかどうかを監視する。そして分析サーバ400は、処理能力が飽和状態となっている時間帯が存在するサーバを検出すると、そのサーバが属する階層の上位の階層のサーバに対して、ジョブ実行の優先度制御をONにすることを指示する信号を送信する。例えばDBサーバ300の処理能力が間欠的に飽和状態となっている場合、Appサーバ100に対して、ジョブ実行の優先度制御をONにすることを指示する信号を送信する。また分析サーバ400は、優先度制御をONにしたサーバの下位の階層のサーバについて、飽和状態が長期間継続すること(完全飽和状態)、または飽和状態がまったく検出されなくなったこと(未飽和状態)を検出する。分析サーバ400は、サーバの完全飽和状態への移行、または未飽和状態への移行を検知すると、そのサーバの上位の階層の、ジョブ実行の優先度制御がONとなっているサーバに、優先度制御をOFFにすることを指示する信号を送信する。
分析サーバ400は、例えば、DBサーバ300で実行されるジョブの多重度(同時並行に実行する処理の個数)と、1つのジョブの応答時間との関係に基づいて、多重度の飽和状態を判断し、優先度制御のONまたはOFFを指示する信号を送信する。例えば分析サーバ400は、観測期間を細分化して得られる集計区間ごとに、その集計区間内で実行された単位期間における処理の多重度の平均と、その単位期間における処理の合計進行量との関係を求める。合計進行量は、集計区間内で実行された処理それぞれの進行量を合計したものである。各処理の進行量は、例えばその処理全体の所要時間に対する、該当集計区間内で実行した時間の割合で表される。分析サーバ400は、多重度が上昇しても合計進行量が上昇しなくなっている境界の多重度を、処理性能が限界(飽和状態)に達した多重度とする。そして分析サーバ400は、飽和多重度以上の多重度である集計区間の出現割合が所定の第1の閾値を超えたサーバを、部分飽和状態にあると判断する。分析サーバ400は、部分飽和状態となったサーバの上位の階層のサーバに、優先度制御のONを指示する信号を送信する。また分析サーバ400は、飽和多重度以上の多重度である集計区間の出現割合が、第1の閾値より大きな第2の閾値を超えたサーバを、完全飽和状態にあると判断する。分析サーバ400は、完全飽和状態となったサーバの上位の階層のサーバに、優先度制御のOFFを指示する信号を送信する。さらに分析サーバ400は、飽和多重度以上の多重度である集計区間の出現割合が第1の閾値より小さな第3の閾値未満にあるサーバを、未飽和状態と判断する。分析サーバ400は、未飽和状態となったサーバの上位の階層のサーバに、優先度制御のOFFを指示する信号を送信する。
また分析サーバ400は、例えば、DBサーバ300に同時に実行させるジョブの合計の最大数(最大同時実行ジョブ数N)を、Appサーバ100に通知する。最大同時実行ジョブ数Nは、例えば、処理能力が飽和しつつある層のサーバを完全飽和させるのに丁度よい、不必要なオーバヘッドを生じさせない数である。
分析サーバ400は、例えば、DBサーバ300で実行されるジョブの多重度と、1つのジョブの応答時間との関係に基づいて、最大同時実行ジョブ数Nを決定する。例えば分析サーバ400は、観測期間を細分化して得られる集計区間ごとに、その集計区間内での平均の多重度を計算する。また分析サーバ400は、各集計区間内における、応答時間が所定の許容時間以下のトランザクションを抽出する。そして分析サーバ400は、抽出したトランザクションを実行するジョブのうちの、DBサーバ300内のジョブによる処理の合計進行量を計算する。そして分析サーバ400は、多重度の増加に伴って合計進行量が低下し始める多重度を、最大同時実行ジョブ数Nとする。このようにして求められた最大同時実行ジョブ数Nは、応答時間を許容範囲内に維持できる多重度制限値の上限である。
なおジョブの多重度を用いた優先度制御のON/OFF制御や最大同時実行ジョブ数Nの決定は一例であり、他の方法で優先度制御のON/OFF制御や最大同時実行ジョブ数Nの決定を行ってもよい。
分析サーバ400からAppサーバ100に送られた優先度制御のONまたはOFFを指示する信号に基づいて、状態設定部120が、パラメータ記憶部110内の優先度制御フラグ111の値を変更する。また分析サーバ400からAppサーバ100に送られた最大同時実行ジョブ数Nを、状態設定部120が受信し、パラメータ記憶部110に格納する。
またAppサーバ100内で動作するアプリケーション141〜144それぞれの計測部141b,142b,143b,144bでは、投入した一連のジョブの平均処理時間や呼出回数(DBサーバ300へのジョブの投入回数)などの統計値が収集される。なお1つのスレッドがDBサーバ300に複数回のジョブの投入を行う場合、最初のジョブの投入時刻から、最後のジョブの完了応答の受信時刻までの時間が、そのスレッドにおける一連のジョブの処理時間となる。そして、各計測部141b,142b,143b,144bから閾値算出部130へ、統計値が送信される。
閾値算出部130では、アプリケーション141〜144から受け取った統計値を、RAM102またはHDD103に蓄積する。そして閾値算出部130は、ジョブ実行の優先度の動的変更を行うための閾値αを、それまでに取得し蓄積しておいた統計値から自動算出する。例えば閾値算出部130は、低負荷時における各ジョブ種の平均処理時間と発生比率に基づいて、閾値αを算出する。低負荷という判断は、両方のジョブ制御部150,160で実行されている同時実行ジョブ数の合計値が、所定の閾値より低いことで判定できる。閾値算出部130は、例えば、最大同時実行ジョブ数Nをパラメータ記憶部110から読み出す。そして閾値算出部130は、最大同時実行ジョブ数Nの中で軽いジョブが占める数の期待値を、各ジョブ種の平均処理時間と発生比率に基づいて算出する。閾値算出部130は、算出した期待値を閾値αとして、パラメータ記憶部110に登録する。
最大同時実行ジョブ数Nにおける軽いジョブが占める数の期待値を閾値αとしたのは、次の理由による。処理能力が飽和しつつある階層に対して、最大同時実行ジョブ数Nでジョブを送り込むと、その階層の処理能力が飽和することが分かっている。また、2つのジョブ制御部150,160に割り当てられている重いジョブと軽いジョブの間での、同時実行ジョブ数の比率の期待値も分かっている。そこで、軽いジョブがその閾値αを超えた場合には、重いジョブと軽いジョブの合計で同時実行ジョブ数の合計値がNまで達していなくても、その階層における処理能力は飽和状態に近づいていると判断できる。そこで第2の実施の形態では、最大同時実行ジョブ数Nにおける軽いジョブが占める数の期待値を閾値αとして、軽い実行ジョブ数が閾値αを超えた場合、その階層における処理能力は飽和状態に近づいていると判断するようにした。
このようにして、設定された各種パラメータを用いて、2つのジョブ制御部150,160が、DBサーバ300に実行させるジョブの優先度を動的に制御する。以下、投入するジョブの優先度制御を行っているときの、重いジョブと軽いジョブとの優先度制御について、図13を参照して説明する。
図13は、ジョブの優先度制御の一例を示す図である。Webサーバ200には複数のスレッド201,202が生成されている。スレッド201,202は、ユーザが使用する端末装置から入力された処理要求(ジョブの投入)に応じて生成されている。スレッド201,202は、それぞれ処理要求に応じたジョブ211,212を実行する。スレッド201,202は、ジョブ211,212の実行過程において、Appサーバ100との連携動作を行う処理があると、Appサーバ100に依頼するジョブを生成し、そのジョブをAppサーバ100に投入する。
Appサーバ100は、Webサーバ200からのジョブ投入に応じ、スレッド141a,143aを生成する。スレッド141aは、スレッド201から投入されたジョブ181を実行する。スレッド143aは、スレッド202から投入されたジョブ182を実行する。スレッド141aは、ジョブ181の実行過程で、DBサーバ300に対するジョブ投入を3回行う。スレッド141aが投入するジョブ1つ当たりのDBサーバ300での処理時間は短いが、3個のジョブ311〜313からなる一連のジョブの最初のジョブ311の投入から、最後のジョブ313の完了までの処理時間は長い。第2の実施の形態において、同一コネクションで投入される一連のジョブは、処理時間の計算上、同一のジョブとして扱われる。そのため、一連のジョブ311〜313は重いジョブと判断される。また、スレッド143aがDBサーバ300に投入するジョブ314は、DBサーバ300の処理能力が飽和していなければ、短時間で実行可能な軽いジョブである。
ここでAppサーバ100において、優先度制御フラグ111がONとなっており、優先度制御が行われているものとする。また図示しない別の軽いジョブが、待ち行列143cにキューイングされており、DBサーバ300における軽いジョブの同時実行数が、閾値αを超えているものとする。
このような状況において、スレッド141aがジョブ181を実行する過程でDBサーバ300と連携する処理が発生すると、スレッド141aは、重いジョブ用のジョブ制御部150に対して、コネクション割り当て要求を送信する(ステップS11)。ジョブ制御部150は、優先度制御中であり、軽いジョブが待ち行列143cにキューイングされているため、重いジョブのコネクション割り当てを抑止する(ステップS12)。
他方、スレッド143aがジョブ182を実行する過程でDBサーバ300と連携する処理が発生すると、スレッド143aは、軽いジョブ用のジョブ制御部160に対して、コネクション割り当て要求を送信する(ステップS13)。ジョブ制御部160は、DBサーバ300に投入しているジョブの総数が同時最大実行ジョブ数N未満であれば、コネクション割り当て要求に応じて、スレッド143aにコネクションを割り当てる(ステップS14)。そしてジョブ制御部160は、スレッド143aに対して、コネクション割り当て完了通知を送信する(ステップS15)。その後、スレッド143aは、割り当てられたコネクションを用いて、DBサーバ300にジョブを投入する。するとDBサーバ300でスレッド302が生成され、投入されたジョブ314をスレッド302が実行する。ジョブ314の処理が完了すると、スレッド302からAppサーバ100へ、ジョブの完了応答が送信される。
Appサーバ100のスレッド143aは、DBサーバ300からのジョブの完了応答を受信すると、ジョブ制御部160に対し、コネクション返却通知を送信する(ステップS16)。ジョブ制御部160は、コネクション返却通知に応答して、スレッド143aに割り当てたコネクションを解放する(ステップS17)。そしてジョブ制御部160は、スレッド143aに、コネクション解放完了応答を送信する(ステップS18)。コネクション解放完了応答を受信したスレッド143aは、ジョブ182の残りの処理を実行し、ジョブ182の処理が完了すると、Webサーバ200にジョブの完了応答を送信する。
その後、ジョブ制御部150は、優先度制御がOFFに変更されるか、待ち行列143c,144cに登録された軽いジョブが無くなったときに、スレッド141aに対してコネクションを割り当てる。そしてジョブ制御部150は、スレッド141aに対して、コネクション割り当て完了通知を送信する。その後、スレッド141aは、割り当てられたコネクションを用いて、DBサーバ300に3つのジョブを順番に投入する。するとDBサーバ300でスレッド301が生成され、投入されたジョブ311〜313をスレッド301が実行する。ジョブ311〜313の処理が完了すると、スレッド301からAppサーバ100へ、ジョブの完了応答が送信される。
Appサーバ100のスレッド141aは、DBサーバ300からのジョブの完了応答を受信すると、ジョブ制御部150に対し、コネクション返却通知を送信する(ステップS20)。ジョブ制御部150は、コネクション返却通知に応答して、スレッド141aに割り当てたコネクションを解放する(ステップS21)。そしてジョブ制御部150は、スレッド141aに、コネクション解放完了応答を送信する(ステップS22)。コネクション解放完了応答を受信したスレッド141aは、ジョブ181の残りの処理を実行し、ジョブ181の処理が完了すると、Webサーバ200にジョブの完了応答を送信する。
このように第2の実施の形態では、軽いジョブ用のジョブ制御部160を経由してDBサーバ300に投入されているジョブの同時実行数が閾値αを超えている間は、軽いジョブが、高い優先度でDBサーバ300に投入される。またDBサーバ300に投入されているジョブの同時実行数が閾値αを超えている間は、ジョブ制御部150は、重いジョブの新規の投入を抑止する。ただし、既に実行を開始している重いジョブに関しては、そのまま完了するまで処理が継続される。こうすることによって、軽いジョブが重いジョブより前にスケジューリングされて、軽いジョブの実行が重いジョブの実行に巻き込まれて余分な待ち時間が発生することが抑止される。その結果、システム全体としての応答時間の増加を最小限に止めることができる。
図14は、ジョブの実行順の違いによる平均応答時間の変化の一例を示す図である。図14の例では、重いジョブA(処理に要する時間:20ミリ秒)と軽いジョブB(処理に要する時間:2ミリ秒)が同時に到着した場合の、実行順の違いによる平均応答時間の違いを示している。なお、図14では、簡略化のために並列度(同時に投入可能なジョブ数)が「1」であると仮定している。
図14の上段は、重いジョブAを先に投入した場合の例である。この場合、重いジョブAの応答時間は20ミリ秒、軽いジョブBの応答時間は22ミリ秒となる。その結果、平均応答時間は21ミリ秒となる。
図14の下段は、軽いジョブBを先に投入した場合の例である。この場合、重いジョブAの応答時間は22ミリ秒、軽いジョブBの応答時間は2ミリ秒となる。その結果、平均応答時間は12ミリ秒となる。
このように、軽いジョブを優先的に実行することで、DBサーバ300が部分飽和状態になっても、平均応答時間の増加を最小限に抑えることができる。応答時間の増加が少ないということは、システム内に滞留している同時実行ジョブ数の増加が少ないということである。これは、同時処理されるジョブ数の増加により、上位の階層において資源が枯渇し、応答時間の増加をさらに拡大させることが抑止されることを意味する。すなわち前述の第2の原因が取り除かれ、応答時間の乱高下が抑止される。
なお、第2の実施の形態では、軽いジョブ用のジョブ制御部160を経由して実行されているジョブの同時実行数が閾値αを超えている期間において、重いジョブが投入されるのは、次のケースに限られる。
・DBサーバ300に同時に投入されている重いジョブと軽いジョブとの合計値が、最大同時実行ジョブ数N未満であり、かつ、軽いジョブ用の待ち行列143c,144cにジョブが存在しない場合である。
なお、軽いジョブ用のジョブ制御部160を経由して投入されているジョブの同時実行数が閾値α未満になれば、重いジョブは初期状態に従って処理される。
次に、このようなジョブの優先度制御の処理手順について詳細に説明する。まず、状態設定部120による状態設定処理について説明する。
図15は、状態設定処理の手順の一例を示すフローチャートである。以下、図15に示す処理をステップ番号に沿って説明する。
[ステップS101]状態設定部120は、分析サーバ400から、ジョブ実行の優先度制御をONすることを指示する信号が入力されたか否かを判断する。状態設定部120は、その信号が入力された場合、処理をステップS102に進める。また状態設定部120は、その信号が入力されていなければ、処理をステップS103に進める。
[ステップS102]状態設定部120は、優先度制御をONすることを指示する信号が入力されると、優先度制御状態をONにする。例えば状態設定部120は、パラメータ記憶部110内の優先度制御フラグ111に「1」を設定する。その後、状態設定部120は、処理をステップS103に進める。
[ステップS103]状態設定部120は、分析サーバ400から、ジョブ実行の優先度制御をOFFにすることを指示する信号が入力されたか否かを判断する。状態設定部120は、その信号が入力された場合、処理をステップS104に進める。また状態設定部120は、その信号が入力されていなければ、処理をステップS105に進める。
[ステップS104]状態設定部120は、優先度制御をOFFすることを指示する信号が入力されると、優先度制御状態をOFFにする。例えば状態設定部120は、パラメータ記憶部110内の優先度制御フラグ111に「0」を設定する。その後、状態設定部120は、処理をステップS105に進める。
[ステップS105]状態設定部120は、状態設定処理の停止コマンドが入力されたか否かを判断する。状態設定部120は、停止コマンドが入力された場合、状態設定処理を終了する。また状態設定部120は、停止コマンドが入力されていなければ、処理をステップS101に進める。
このように、第2の実施の形態では、分析サーバ400からの指示により、ジョブ実行の優先度制御のON/OFFの切り替えが行われる。
次に、重いジョブ用のジョブ制御部150におけるジョブ数制御処理について説明する。
図16は、重いジョブ数制御処理の手順の一例を示すフローチャートの前半である。以下、図16に示す処理をステップ番号に沿って説明する。なお、重いジョブ数制御処理は、アプリケーション141,142内のスレッドが、ジョブ制御部150にコネクション割り当て要求を送信したときに実行される。以下、スレッド141aがコネクション割り当て要求を送信したものとして、重いジョブ数制御処理を説明する。
[ステップS111]ジョブ制御部150は、ジョブ実行の優先度制御がONに設定されているか否かを判断する。例えばジョブ制御部150は、パラメータ記憶部110内の優先度制御フラグ111の値が「1」であれば、優先度制御がONであると判断する。ジョブ制御部150は、優先度制御がONであれば、処理をステップS112に進める。またジョブ制御部150は、優先度制御がOFFであれば、処理をステップS118に進める。
[ステップS112]ジョブ制御部150は、優先度制御がONの場合、DBサーバ300で実行されているジョブの総数(同時実行ジョブ数)が、パラメータ記憶部110に設定された最大同時実行ジョブ数Nより小さいか否かを判断する。なおジョブ制御部150は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114を参照することで、現在の同時実行ジョブ数を認識する。ジョブ制御部150は、同時実行ジョブ数が、最大同時実行ジョブ数Nより小さければ、処理をステップS113に進める。またジョブ制御部150は、同時実行ジョブ数が、最大同時実行ジョブ数N以上であれば、処理をステップS115に進める。
[ステップS113]ジョブ制御部150は、DBサーバ300で実行されている軽いジョブの数(軽いジョブ実行数)が、パラメータ記憶部110に設定された閾値αより小さいか否かを判断する。なおジョブ制御部150は、パラメータ記憶部110内の軽いジョブ実行数カウンタ116を参照することで、現在の軽いジョブ実行数を認識する。ジョブ制御部150は、軽いジョブ実行数が閾値αより小さければ、処理をステップS118に進める。またジョブ制御部150は、軽いジョブ実行数が閾値α以上であれば、処理をステップS114に進める。
[ステップS114]ジョブ制御部150は、軽いジョブ用のジョブ制御部160が管理するジョブの待ち行列143c,144cに、処理待ちの軽いジョブがあるか否かを判断する。例えばジョブ制御部150は、パラメータ記憶部110内の軽いジョブ待ち数カウンタ118を参照し、軽いジョブ待ち数カウンタ118の値が「1」以上であれば、処理待ちの軽いジョブがあると判断する。ジョブ制御部150は、処理待ちの軽いジョブがある場合、処理をステップS115に進める。またジョブ制御部150は、処理待ちの軽いジョブがなければ、処理をステップS118に進める。
[ステップS115]ジョブ制御部150は、パラメータ記憶部110内の重いジョブ待ち数カウンタ117の値を「1」だけ増加させる。
[ステップS116]ジョブ制御部150は、コネクションプール151,161のいずれかにコネクションが返却されるまで、スレッド141aを待機させる。
[ステップS117]ジョブ制御部150は、コネクションが返却されスレッド141aの待機状態が解除されると、パラメータ記憶部110内の重いジョブ待ち数カウンタ117の値を「1」だけ減少させる。その後、ジョブ制御部150は処理をステップS111に進める。
[ステップS118]ジョブ制御部150は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114の値を「1」だけ増加させる。
[ステップS119]ジョブ制御部150は、パラメータ記憶部110内の重いジョブ実行数カウンタ115の値を「1」だけ増加させる。
[ステップS120]ジョブ制御部150は、重いジョブ用のコネクションプール151から1つのコネクションを獲得し、獲得したコネクションをスレッド141aに割り当てる。その後、ジョブ制御部150は処理をステップS131(図17参照)に進める。
図17は、重いジョブ数制御処理の手順の一例を示すフローチャートの後半である。以下、図17に示す処理をステップ番号に沿って説明する。
[ステップS131]ジョブ制御部150からコネクションの割り当てを受けたスレッド141aは、投入するジョブがあるか否かを判断する。スレッド141aは、投入するジョブがあれば、処理をステップS132に進める。またスレッド141aは、投入するジョブがなければ、処理をステップS134に進める。
[ステップS132]スレッド141aは、割り当てられたコネクションを使用して、DBサーバ300に対してジョブを投入する。
[ステップS133]スレッド141aは、DBサーバ300から、ステップS132で投入したジョブの完了応答を受信する。その後、スレッド141aは、処理をステップS131に進める。
[ステップS134]スレッド141aは、ジョブの投入に使用したコネクションを、コネクションプール151に返却する。例えばスレッド141aは、ジョブ制御部150へ、コネクション返却通知を送信する。するとジョブ制御部150は、スレッド141aに割り当てられていたコネクションを解放する。
[ステップS135]ジョブ制御部150は、パラメータ記憶部110内の重いジョブ実行数カウンタ115の値を「1」だけ減少させる。
[ステップS136]ジョブ制御部150は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114の値を「1」だけ減少させる。
[ステップS137]ジョブ制御部150は、待機中のスレッドの待機状態を解除する。例えばジョブ制御部150は、待機状態となっているスレッドのうちの、重いジョブを投入するスレッドについて、コネクション割り当て要求の送信時刻が最も古いスレッドから順に待機状態を解除する。またジョブ制御部150は、軽いジョブ用のジョブ制御部160に対して、コネクションが返却されたことを通知する。するとジョブ制御部160は、例えば、待機状態となっているスレッドのうちの、軽いジョブを投入するスレッドについて、コネクション割り当て要求の送信時刻が最も古いスレッドから順に待機状態を解除する。コネクション割り当て要求の送信時刻が最も古いスレッドから順に待機状態を解除することで、コネクション割り当て要求を先に送信したスレッドに、優先的にコネクションが割り当てられる。
次に、軽いジョブ用のジョブ制御部160におけるジョブ数制御処理について説明する。
図18は、軽いジョブ数制御処理の手順の一例を示すフローチャートの前半である。以下、図18に示す処理をステップ番号に沿って説明する。なお、軽いジョブ数制御処理は、アプリケーション143,144内のスレッドが、ジョブ制御部160にコネクション割り当て要求を送信したときに実行される。以下、スレッド143aがコネクション割り当て要求を送信したものとして、軽いジョブ数制御処理を説明する。
[ステップS141]ジョブ制御部160は、ジョブ実行の優先度制御がONに設定されているか否かを判断する。例えばジョブ制御部160は、パラメータ記憶部110内の優先度制御フラグ111の値が「1」であれば、優先度制御がONであると判断する。ジョブ制御部160は、優先度制御がONであれば、処理をステップS142に進める。またジョブ制御部160は、優先度制御がOFFであれば、処理をステップS146に進める。
[ステップS142]ジョブ制御部160は、優先度制御がONの場合、DBサーバ300で実行されているジョブの総数(同時実行ジョブ数)が、パラメータ記憶部110に設定された最大同時実行ジョブ数Nより小さいか否かを判断する。なおジョブ制御部160は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114を参照することで、現在の同時実行ジョブ数を認識する。ジョブ制御部160は、同時実行ジョブ数が、最大同時実行ジョブ数Nより小さければ、処理をステップS146に進める。またジョブ制御部160は、同時実行ジョブ数が、最大同時実行ジョブ数N以上であれば、処理をステップS143に進める。
[ステップS143]ジョブ制御部160は、パラメータ記憶部110内の軽いジョブ待ち数カウンタ118の値を「1」だけ増加させる。
[ステップS144]ジョブ制御部160は、コネクションプール151,161のいずれかにコネクションが返却されるまで、スレッド143aを待機させる。
[ステップS145]ジョブ制御部160は、コネクションが返却されスレッド143aの待機状態が解除されると、パラメータ記憶部110内の軽いジョブ待ち数カウンタ118の値を「1」だけ減少させる。その後、ジョブ制御部160は処理をステップS141に進める。
[ステップS146]ジョブ制御部160は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114の値を「1」だけ増加させる。
[ステップS147]ジョブ制御部160は、パラメータ記憶部110内の軽いジョブ実行数カウンタ116の値を「1」だけ増加させる。
[ステップS148]ジョブ制御部160は、軽いジョブ用のコネクションプール161から1つのコネクションを獲得し、獲得したコネクションをスレッド143aに割り当てる。その後、ジョブ制御部160は処理をステップS151(図19参照)に進める。
図19は、軽いジョブ数制御処理の手順の一例を示すフローチャートの後半である。以下、図19に示す処理をステップ番号に沿って説明する。
[ステップS151]ジョブ制御部160からコネクションの割り当てを受けたスレッド143aは、投入するジョブがあるか否かを判断する。スレッド143aは、投入するジョブがあれば、処理をステップS152に進める。またスレッド143aは、投入するジョブがなければ、処理をステップS154に進める。
[ステップS152]スレッド143aは、割り当てられたコネクションを使用して、DBサーバ300に対してジョブを投入する。
[ステップS153]スレッド143aは、DBサーバ300から、ステップS152で投入したジョブの完了応答を受信する。その後、スレッド143aは、処理をステップS151に進める。
[ステップS154]スレッド143aは、ジョブの投入に使用したコネクションを、コネクションプール161に返却する。例えばスレッド143aは、ジョブ制御部160へ、コネクション返却通知を送信する。するとジョブ制御部160は、スレッド143aに割り当てられていたコネクションを解放する。
[ステップS155]ジョブ制御部160は、パラメータ記憶部110内の軽いジョブ実行数カウンタ116の値を「1」だけ減少させる。
[ステップS156]ジョブ制御部160は、パラメータ記憶部110内の同時実行ジョブ数カウンタ114の値を「1」だけ減少させる。
[ステップS157]ジョブ制御部160は、待機中のスレッドの待機状態を解除する。例えばジョブ制御部160は、待機状態となっているスレッドのうちの、軽いジョブを投入するスレッドについて、コネクション割り当て要求の送信時刻が最も古いスレッドから順に待機状態を解除する。例えばジョブ制御部160は、重いジョブ用のジョブ制御部150に対して、コネクションが返却されたことを通知する。するとジョブ制御部150は、例えば、待機状態となっているスレッドのうちの、重いジョブを投入するスレッドについて、コネクション割り当て要求の送信時刻が最も古いスレッドから順に待機状態を解除する。
以上のように、第2の実施の形態では、DBサーバ300に投入したジョブの数に基づいて、ジョブ実行の優先度の動的制御を行っている。これは、他の階層における飽和しつつある資源の状態を、待ち行列の長さから判断するのではなく、同時実行ジョブ数の増減から判断していることになる。こうすることによって、DBサーバ300の処理能力が飽和し始めた後、完全に飽和する直前のタイミングを判断できる。そのため、軽いジョブの応答時間が、重いジョブの影響で長期化する前に、軽いジョブの優先実行に移行させることが可能となる。
このように、軽いジョブを優先的に実行させれば、平均応答時間が短くなる。その結果、下位の階層のサーバでの資源枯渇の影響が、上位の階層のサーバに伝搬することが抑止され、端末装置に対する応答時間の乱高下が抑止される。
図20は、ジョブの優先度制御を行った場合の応答時間の変化の一例を示す図である。図20のグラフは、横軸に時間進行を示し、縦軸に応答時間を示している。応答時間は、細かい時間粒度(例えば0.1秒)ごとの平均応答時間である。図20に示したグラフを、図3に示したジョブの優先度制御を行わない場合のグラフと比較すると、応答時間の最大値が低くなっているのが分かる。すなわち、応答時間の乱高下が抑止されている。
なお第2の実施の形態では、軽いジョブの実行数が閾値α以上の間、軽いジョブが優先的にDBサーバ300に投入される。ここで、軽いジョブだけが一時的に集中して投入され、処理能力が完全に飽和するまで余裕がある段階で、軽いジョブの同時実行ジョブ数が閾値αを超えることも考えられる。この場合、軽いジョブを優先的に実行しても、軽いジョブは完了するまでの時間が短いので、すぐにその状態が解消される。その結果、重いジョブの実行が待たされることによる応答時間への悪影響は軽微である。
また第2の実施の形態では、Appサーバ100と同様のジョブ数制御機能が、ジョブを下位の階層に投入する全ての階層のサーバに実装される。各サーバでは、普段はジョブ実行の優先度制御は無効(OFF)に設定される。そして、分析サーバ400が、ある階層のサーバの処理能力が部分的に飽和していることを検出した場合に、そのサーバへジョブを送っている上位の階層のサーバに、優先度制御をONにすることを指示する信号を送信する。これにより、部分飽和状態の階層の上位の階層のサーバにおいて、ジョブ実行の優先度制御がONに切り替わる。このようにして、DBサーバ300以外の階層のサーバで処理能力が飽和状態となった場合でも、上位の階層のサーバにおいて、適切なジョブの優先度制御を行うことができる。
また、分析サーバ400は、ある階層のサーバの処理能力が完全飽和になったことを検出した場合は、そのサーバの上位の階層のサーバに、優先度制御をOFFにすることを指示する信号を送信する。これにより、その信号を受信したサーバのジョブ実行の優先度制御がOFFに切り替わる。処理能力が完全飽和となったときに優先度制御を停止するようにしたのは以下の理由による。
完全飽和の状態では、ジョブ実行の優先度制御を行っても、応答時間の乱高下を抑止する十分な効果が期待できない。他方、下位の階層のサーバが完全に飽和している状態で軽いジョブを優先的に投入し続けると、重いジョブが投入できず、ジョブ間で実行順序の不公平が過大となる。そこで第2の実施の形態では、処理能力が完全飽和となったときに優先度制御を停止するようにし、応答時間の乱高下を抑止する効果が期待できない状況下では、各ジョブの投入順に従ってジョブを実行し、ジョブ実行の公平性を担保するようにしている。
なお、重いジョブだけが一時的に集中して生成される場合もあり得る。この場合には、軽いジョブのDBサーバ300での同時実行数が閾値α未満であっても、DBサーバ300は部分飽和状態となり得る。このとき、軽いジョブの実行数が閾値α未満のため、軽いジョブの優先投入は行われないが、DBサーバ300には重いジョブが大量に投入され、すぐにDBサーバ300が完全飽和状態となってしまう。そのため、重いジョブだけが一時的に集中して生成された場合に、軽いジョブを優先的に投入する必要性はない。
〔第3の実施の形態〕
次に第3の実施の形態について説明する。第3の実施の形態は、優先度制御のON/OFFの切り替え判断を、多階層システム内の各サーバが自律的に行うようにしたものである。
図21は、第3の実施の形態のシステムの全体構成の一例を示す図である。第3の実施の形態は、Webサーバ600、Appサーバ500、およびDBサーバ700によるWeb3階層システムが設けられている。このWeb3階層システムにより、Webサーバ600にネットワーク10を介して接続された端末装置29a,29b,・・・を使用するユーザにサービスを提供する。
図21に示すように、第3の実施の形態では、第2の実施の形態における分析サーバ400に相当する装置がない。すなわち第2の実施の形態では、サーバのジョブ実行の優先度制御をON/OFFするために、そのサーバのジョブの投入先の階層のサーバが部分的飽和状態になっているかどうかを検出するための分析サーバ400が設けられている。一方、第3の実施の形態では、ジョブ実行の優先度制御のON/OFFをWeb3階層システムを構成する各サーバが自律的に判断するため、分析サーバ400は不要となっている。これにより、システム構成の簡略化が可能となる。
外部からのジョブ実行の優先度制御のON/OFFの指示を不要とする手法の1つとしては、ジョブ実行の優先度制御を常にONにしておくことが考えられる。ただしジョブ実行の優先度制御が常にONだと、下位の階層のサーバが完全飽和状態に達したときに、軽いジョブだけが実行されて、重いジョブの待ち時間がどんどん増加していってしまう。そこで第3の実施の形態では、重いジョブ用のジョブ制御部150におけるジョブの待ち時間が、一定程度まで長くなったら、2つのジョブ制御部150,160におけるジョブ実行の優先度制御をOFFにする。それ以外の場合は、ジョブ実行の優先度制御はONのままとする。これにより、下位の階層のサーバが完全飽和状態に達した場合には、重いジョブ用のジョブ制御部150を経由したジョブの実行を再開することができる。
すなわち、第3の実施の形態は、少なくとも以下の点で第2の実施の形態と異なる。
・第1の相違点:外部の部分的飽和検出器からの情報を得ずに各階層が自律的に動作するので、全く飽和に達していない状態でもジョブ実行の優先度制御を機能させる。
・第2の相違点:下位の階層のサーバが完全飽和状態に達したことが、重いジョブ用のジョブ制御部150におけるジョブの待ち時間で判断される。
このような2つの相違点のうち特に第1の相違点によって、低負荷な状態で、瞬間的に軽いジョブだけが多数同時に到着した場合でも、ジョブ実行の優先度制御が機能してしまう。すると、結果的にシステム全体の性能(スループット(単位時間当たりの処理能力)、応答時間の両面)を低下させてしまう可能性が存在する。ただし、軽いジョブの同時実行数が閾値α以上となるまでは重いジョブも実行されるため、低負荷な状態にも拘わらず重いジョブの実行が抑止されるのは稀であると考えられる。そのため全く飽和に達していない状態でもジョブ実行の優先度制御を機能させることとしても、それによるシステム全体の性能低下は無視できるほど軽微になると期待することができる。
なお、第2の実施の形態では、最大同時実行ジョブ数Nが、分析サーバ400から通知されているが、第3の実施の形態では、最大同時実行ジョブ数Nは、予め管理者によって各サーバに設定されているものとする。
以下、第3の実施の形態では、重いジョブ用のジョブ制御部150における第2の実施の形態との相違点を詳細に説明する。
図22は、第3の実施の形態におけるAppサーバの機能の一例を示す図である。Appサーバ500は、パラメータ記憶部510、閾値算出部530、複数のアプリケーション541〜544、および2つのジョブ制御部550,560を有している。ジョブ制御部550が重いジョブ用であり、ジョブ制御部560が軽いジョブ用である。ジョブ制御部550は、重いジョブを実行するスレッドに割り当てるコネクションプール551を有している。またジョブ制御部560は、軽いジョブを実行するスレッドに割り当てるコネクションプール561を有している。図22に示した要素のうち、ジョブ制御部550,560以外の各要素は、図9に示した第2の実施の形態の同名の要素と同じ機能を有している。また、軽いジョブ用のジョブ制御部560は、図9に示した第2の実施の形態の軽いジョブ用のジョブ制御部160と同様の機能を有している。
なおパラメータ記憶部510には、第2の実施の形態におけるパラメータ記憶部110に格納されるパラメータに加え、重いジョブの待ち時間に関する2つの閾値が格納される。
図23は、第3の実施の形態のパラメータ記憶部のデータ構造の一例を示す図である。パラメータ記憶部510には、優先度制御フラグ511、最大同時実行ジョブ数512、閾値513、同時実行ジョブ数カウンタ514、重いジョブ実行数カウンタ515、軽いジョブ実行数カウンタ516、重いジョブ待ち数カウンタ517、軽いジョブ待ち数カウンタ518、第1の実行時間閾値519a、および第2の実行時間閾値519bが格納されている。第1の実行時間閾値519aと第2の実行時間閾値519b以外の各パラメータは、図10に示した第2の実施の形態の同名のパラメータと同種のパラメータである。
第1の実行時間閾値519aは、ジョブ実行の優先度制御の状態をOFFからONに切り替える際に用いられる、重いジョブの待ち時間の閾値である。重いジョブの待ち時間が第1の実行時間閾値519aに設定された値(β1)未満となると、優先度制御がONに変更される。
第2の実行時間閾値519bは、ジョブ実行の優先度制御の状態をONからOFFに切り替える際に用いられる、重いジョブの待ち時間の閾値である。重いジョブの待ち時間が第2の実行時間閾値519bに設定された値(β2)を超えると、優先度制御がOFFに変更される。
重いジョブ用のジョブ制御部550は、図9に示した第2の実施の形態の重いジョブ用のジョブ制御部150と同じ機能に加え、優先度制御のON/OFFを切り替える機能を有する。
このような構成の第3の実施の形態では、システムの管理者は、階層のサーバが低負荷のときには、ジョブ実行の優先度制御をONにしておく。例えば管理者は、各サーバのシステムの起動時の初期値として、ジョブ実行の優先度制御をONに設定しておく。その後、下位の階層のサーバの負荷状況に応じて、優先度制御のON/OFFの切り替えが行われる。
優先度制御のOFFへの切り替え方は以下の通りである。
重いジョブ用のジョブ制御部550におけるジョブの待ち時間が、予め定めた第2の実行時間閾値β2を超えたら、ジョブ実行の優先度の制御をOFFにして、重いジョブの実行を開始する。
優先度制御のONへの戻し方は以下の通りである。
重いジョブ用のジョブ制御部550におけるジョブの待ち時間が、予め定めた一定の閾値β1(β1≦β2)を下回ったら、ジョブ実行優先度の制御を再度ONにする。
第3の実施の形態では、優先度制御のON/OFFの切り替えを、重いジョブの実行が終了したときに行う。以下、このような切り替えを実現するための処理手順について説明する。なお、第3の実施の形態における重いジョブ数制御処理の前半は、図16に示した処理と同様である。そこで、重いジョブ数制御処理の後半を、図24を参照して説明する。
図24は、第3の実施の形態における重いジョブ数制御処理の手順の一例を示すフローチャートの後半である。なお第2の実施の形態と同様の処理については図17と同様のステップ番号を付し、説明を省略する。第2の実施の形態と異なる処理は、ステップS210である。
[ステップS210]ジョブ制御部550は、待機中のスレッドの待機状態を解除後、優先度制御ON/OFF切り替え処理を実行する。優先度制御ON/OFF切り替え処理完了後、ジョブ制御部550は、重いジョブ数制御処理を終了する。
図25は、優先度制御ON/OFF切り替え処理の手順の一例を示すフローチャートである。以下、図25に示す処理をステップ番号に沿って説明する。
[ステップS211]ジョブ制御部550は、優先度制御の状態がONか否かを判断する。例えばジョブ制御部550は、パラメータ記憶部510に設定されている優先度制御フラグの値が「1」であれば、優先度制御がONであると判断する。ジョブ制御部550は、優先度制御がONであれば、処理をステップS212に進める。またジョブ制御部550は、優先度制御がOFFであれば、処理をステップS214に進める。
[ステップS212]ジョブ制御部550は、コネクション待機待ちの時間を含む、重いジョブの実行に要した時間が、第2の実行時間閾値(β2)を超えているか否かを判断する。ジョブ制御部550は、ジョブの実行に要した時間が第2の実行時間閾値(β2)を超えている場合、処理をステップS213に進める。またジョブ制御部550は、ジョブの実行に要した時間が第2の実行時間閾値(β2)以下であれば、優先度制御ON/OFF切り替え処理を終了する。
[ステップS213]ジョブ制御部550は、ジョブ実行の優先度制御の状態をOFFに変更する。例えばジョブ制御部550は、パラメータ記憶部510内の優先度制御フラグ511の値を「0」に変更する。その後、ジョブ制御部550は、優先度制御ON/OFF切り替え処理を終了する。
[ステップS214]優先度制御がOFFの場合、コネクション待機待ちの時間を含む、重いジョブの実行に要した時間が、第1の実行時間閾値(β1)未満か否かを判断する。ジョブ制御部550は、ジョブの実行に要した時間が第1の実行時間閾値(β1)未満であれば、処理をステップS215に進める。またジョブ制御部550は、ジョブの実行に要した時間が第1の実行時間閾値(β1)以上であれば、優先度制御ON/OFF切り替え処理を終了する。
[ステップS215]ジョブ制御部550は、ジョブ実行の優先度制御の状態をONに変更する。例えばジョブ制御部550は、パラメータ記憶部510内の優先度制御フラグ511の値を「1」に変更する。その後、ジョブ制御部550は、優先度制御ON/OFF切り替え処理を終了する。
このようにして、各サーバが自律的にジョブ実行の優先度制御のON/OFFを適切に切り替えることができる。なお、この優先度制御のON/OFFの切り替えについては、他の方法も考えられる。例えば、以下のような切り替え方がある。
優先度制御のOFFへの切り替え方の他の例は以下の通りである。
重いジョブ用のジョブ制御部550は、重いジョブの待ち時間が、予め定めた一定の閾値γを予め定めた一定回数連続で上回り続けたら、もしくは予め定めた一定時間の間連続で上回り続けたら、ジョブ実行の優先度制御をOFFにする。
優先度制御をONへの戻し方の他の例は以下の通りである。
重いジョブ用のジョブ制御部550は、重いジョブの待ち時間が、予め定めた一定の閾値γを予め定めた一定回数連続で下回ったら、もしくは予め定めた一定時間の間連続で下回り続けたら、ジョブ実行の優先度制御をONにする。
このように、重いジョブの待ち時間、または待ち時間を含む実行時間を用いて、下位の階層のサーバの負荷の状況を判断し、上位の階層のサーバが自律的にジョブ実行の優先度制御のON/OFFを適切に切り替えることができる。
〔第4の実施の形態〕
次に第4の実施の形態について説明する。第4の実施の形態は、ジョブ制御部の数を、3つ以上へ拡張したものである。
ジョブ制御部の数は2つに限らず、n個(nは3以上の整数)にすることが可能である。その場合、第2の実施の形態に閾値αに代えて、n−1個の閾値α1,α2,・・・,αn-1(0<α1<α2<・・・<αn-1<N)が用いられる。これらの閾値を用いて、ジョブ実行の優先度はn段階に分けて制御される。こうすることによって、ジョブの種別によるジョブ処理時間に大きく差があって、2つのグループでは効果的なジョブ実行優先度制御が行えない場合にも、きめ細かく対応することが可能となる。
以下、図7に示した第2の実施の形態のシステムのうち、Appサーバにおけるジョブ制御部の数を3つ以上にした場合を想定し、第4の実施の形態について詳細に説明する。
図26は、第4の実施の形態におけるAppサーバの機能の一例を示す図である。Appサーバ800は、パラメータ記憶部810、状態設定部820、閾値算出部830、複数のアプリケーション841−1,841−2,・・・,842−1,842−2,・・・,84n−1,84n−2,・・・、および複数のジョブ制御部851,852,・・・,85nを有している。ジョブ制御部851,852,・・・,85nは、それぞれコネクションプール851a,852a,・・・,85naを管理している。
ジョブ制御部851,852,・・・,85nには、識別番号k(kは1以上n以下の整数)が付与されている。ジョブ制御部851,852,・・・,85nは、1または複数のアプリケーションが属するアプリケーション集合からのコネクション割り当て要求の送信先に指定されている。このとき、識別番号の値が小さいジョブ制御部ほど、軽いジョブを投入するアプリケーション集合からのコネクション割り当て要求の送信先に指定される。図26の例では、ジョブ制御部851の識別番号kの値が「1」である。この場合、ジョブ制御部851は、最も軽いジョブを投入するアプリケーション集合からのコネクション割り当て要求の送信先に指定される。またジョブ制御部85nは、最も重いジョブを投入するアプリケーション集合からのコネクション割り当て要求の送信先に指定される。
以下、k=iのジョブ制御部を、i番目のジョブ制御部と呼ぶ。またi番目のジョブ制御部にジョブの処理要求を送信するアプリケーションが、DBサーバ300に投入するジョブを、i番目のジョブ種のジョブと呼ぶ。
図26の例では、アプリケーション841−1,841−2,・・・は、コネクション割り当て要求の送信先としてジョブ制御部851が指定されている。アプリケーション841−1,841−2,・・・のスレッドは、ジョブ制御部851からコネクションの割り当てを受け、割り当てられたコネクションを用いてDBサーバ300にジョブを投入する。
アプリケーション842−1,842−2,・・・は、コネクション割り当て要求の送信先としてジョブ制御部852が指定されている。アプリケーション842−1,842−2,・・・のスレッドは、ジョブ制御部852からコネクションの割り当てを受け、割り当てられたコネクションを用いてDBサーバ300にジョブを投入する。
アプリケーション84n−1,84n−2,・・・は、コネクション割り当て要求の送信先としてジョブ制御部85nが指定されている。アプリケーション84n−1,84n−2,・・・のスレッドは、ジョブ制御部85nからコネクションの割り当てを受け、割り当てられたコネクションを用いてDBサーバ300にジョブを投入する。
次に、第4の実施の形態におけるパラメータ記憶部810のデータ構造について説明する。
図27は、第4の実施の形態のパラメータ記憶部のデータ構造の一例を示す図である。パラメータ記憶部810には、優先度制御フラグ811、最大同時実行ジョブ数812、複数の閾値813a,813b,・・・、同時実行ジョブ数カウンタ814、複数のジョブ実行数カウンタ815a,815b,・・・、および複数のジョブ待ち数カウンタ816a,816b,・・・が格納されている。優先度制御フラグ811、最大同時実行ジョブ数812、および同時実行ジョブ数カウンタ814は、図10に示した第2の実施の形態の同名のパラメータと同種のパラメータである。
複数の閾値813a,813b,・・・は、n−1個の閾値α1,α2,・・・,αn-1である。
ジョブ実行数カウンタ815a,815b,・・・は、それぞれジョブ制御部851,852,・・・,85nに1対1で対応付けられている。ジョブ実行数カウンタ815a,815b,・・・は、対応付けられたジョブ制御部がDBサーバ300に投入し、実行中のジョブの数を示す。
ジョブ待ち数カウンタ816a,816b,・・・は、それぞれジョブ制御部851,852,・・・,85nに1対1で対応付けられている。ジョブ待ち数カウンタ816a,816b,・・・は、対応付けられたジョブ制御部の待ち行列において実行待ちのジョブ数を示す。
次に、i番目(k=i)のジョブ制御部がジョブ数制御処理を行う場合を例にとって、第4の実施の形態におけるジョブ数制御処理を詳細に説明する。
図28は、第4の実施の形態のジョブ数制御処理の手順の一例を示すフローチャートの前半である。以下、図28に示す処理をステップ番号に沿って説明する。なおi番目のジョブ制御部は、対応するアプリケーション内のスレッドが、i番目のジョブ制御部にコネクション割り当て要求を送信したときに、ジョブ数制御処理を実行する。
[ステップS311]i番目のジョブ制御部は、ジョブ実行の優先度制御がONに設定されているか否かを判断する。i番目のジョブ制御部は、優先度制御がONであれば、処理をステップS312に進める。またi番目のジョブ制御部は、優先度制御がOFFであれば、処理をステップS320に進める。
[ステップS312]i番目のジョブ制御部は、優先度制御がONの場合、DBサーバ300で実行されているジョブの総数(同時実行ジョブ数)が、パラメータ記憶部810に設定された最大同時実行ジョブ数Nより小さいか否かを判断する。なおi番目のジョブ制御部は、パラメータ記憶部810内の同時実行ジョブ数カウンタ814を参照することで、現在の同時実行ジョブ数を認識する。i番目のジョブ制御部は、同時実行ジョブ数が、最大同時実行ジョブ数Nより小さければ、処理をステップS313に進める。またi番目のジョブ制御部は、同時実行ジョブ数が、最大同時実行ジョブ数N以上であれば、処理をステップS317に進める。
[ステップS313]i番目のジョブ制御部は、変数jを1からi−1まで1ずつカウントアップし、jの値ごとにステップS314,S315の処理を実行する。
[ステップS314]i番目のジョブ制御部は、k=1からk=jまでの実行ジョブ数の合計値が、閾値αjより小さいか否かを判断する。例えばi番目のジョブ制御部は、パラメータ記憶部810内のk=1,2,・・・,j用のジョブ実行数カウンタそれぞれの値を合計する。そしてi番目のジョブ制御部は、合計値を、j番目の閾値αjと比較して、実行ジョブ数の合計値が閾値αjより小さいか否かを判断する。i番目のジョブ制御部は、実行ジョブ数の合計値が閾値αjより小さい場合、処理をステップS316に進める。またi番目のジョブ制御部は、実行ジョブ数の合計値が閾値αj以上の場合、処理をステップS315に進める。
[ステップS315]i番目のジョブ制御部は、k=1からk=jまでのジョブ制御部のいずれかに処理待ちのジョブが少なくとも1つ存在するか否かを判断する。例えばi番目のジョブ制御部は、パラメータ記憶部810内のk=1,2,・・・,j用のジョブ実行数カウンタの少なくとも1つに、1以上の値が設定されていれば、処理待ちのジョブがあると判断する。i番目のジョブ制御部は、処理待ちのジョブがある場合、ステップS313〜S316のループを抜けて、処理をステップS317に進める。またi番目のジョブ制御部は、処理待ちのジョブがなければ、処理をステップS316に進める。
[ステップS316]i番目のジョブ制御部は、変数jを1からi−1までの各値について、ステップS314,S315の処理が完了し、ステップS315でYESと判断されることがなかった場合、ループを抜け、処理をステップS320に進める。
[ステップS317]同時実行ジョブ数が最大同時実行ジョブ数N以上であるか、またはステップS315でYESと判断された場合、i番目のジョブ制御部は、パラメータ記憶部810内のk=i用のジョブ待ち数カウンタの値を「1」だけ増加させる。
[ステップS318]i番目のジョブ制御部は、いずれかのコネクションプールにコネクションが返却されるまで、アプリケーション84i−1内のコネクション割り当て要求を送信したスレッドを待機させる。
[ステップS319]i番目のジョブ制御部は、コネクションが返却されスレッドの待機状態が解除されると、パラメータ記憶部810内のk=i用のジョブ待ち数カウンタの値を「1」だけ減少させる。その後、i番目のジョブ制御部は処理をステップS311に進める。
[ステップS320]ステップS315でYESとならずにステップS313からS316のループを抜けた場合、i番目のジョブ制御部は、パラメータ記憶部810内の同時実行ジョブ数カウンタ814の値を「1」だけ増加させる。
[ステップS321]i番目のジョブ制御部は、パラメータ記憶部810内のk=i用のジョブ実行数カウンタの値を「1」だけ増加させる。
[ステップS322]i番目のジョブ制御部は、k=i用のコネクションプールから1つのコネクションを獲得し、獲得したコネクションを、コネクション割り当て要求を送信したスレッドに割り当てる。その後、i番目のジョブ制御部は処理をステップS331(図29参照)に進める。
図29は、第4の実施の形態のジョブ数制御処理の手順の一例を示すフローチャートの後半である。以下、図29に示す処理をステップ番号に沿って説明する。
[ステップS331]i番目のジョブ制御部からコネクションの割り当てを受けたスレッドは、投入するジョブがあるか否かを判断する。スレッドは、投入するジョブがあれば、処理をステップS332に進める。またスレッドは、投入するジョブがなければ、処理をステップS334に進める。
[ステップS332]コネクションの割り当てを受けたスレッドは、割り当てられたコネクションを使用して、DBサーバ300に対して、i番目のジョブ種のジョブを投入する。
[ステップS333]コネクションの割り当てを受けたスレッドは、DBサーバ300から、ステップS332で投入したジョブの完了応答を受信する。その後、スレッドは、処理をステップS331に進める。
[ステップS334]コネクションの割り当てを受けたスレッドは、ジョブの投入に使用したコネクションを、コネクションプールに返却する。例えばスレッドは、i番目のジョブ制御部へ、コネクション返却通知を送信する。するとi番目のジョブ制御部は、そのスレッドに割り当てられていたコネクションを解放する。
[ステップS335]i番目のジョブ制御部は、パラメータ記憶部810内のk=i用のジョブ実行数カウンタの値を「1」だけ減少させる。
[ステップS336]i番目のジョブ制御部は、パラメータ記憶部810内の同時実行ジョブ数カウンタ814の値を「1」だけ減少させる。
[ステップS337]i番目のジョブ制御部は、待機中のスレッドの待機状態を解除する。
このように第4の実施の形態では、優先度制御がONの間は、i番目のジョブ種のジョブをDBサーバ300に投入させるかどうかについて、以下の3つの条件に基づいて判断される。
・第1の条件:すべてのジョブ種に関する同時実行ジョブ数が最大同時実行ジョブ数Nより小さいこと(ステップS312の条件)。
・第2の条件:j=1,2,・・・,i−1の値をとるすべてのjについて、1番目からj番目までの各ジョブ種の実行ジョブ数の合計が閾値αjより小さいこと(ステップS314の条件)。
・第3の条件:1番目からi−1番目のいずれかのジョブ種の処理待ちのジョブが存在しないこと(ステップS315の条件)。
第1の条件と第2の条件を共に満たした場合、または第1の条件と第3の条件を共に満たした場合に、i番目のジョブ種のジョブをDBサーバ300に投入するスレッドにコネクションが割り当てられる。そしてi番目のジョブ種のジョブがDBサーバ300に投入される。
第1の条件を満たさない場合、または第1の条件を満たすが第2の条件と第3の条件とのいずれも満たさない場合には、ジョブの投入は抑止される。
以上のように、第4の実施の形態では、3以上のジョブ制御部を用いて、処理の重さに応じたジョブの実行の優先度を、多段階に分けて管理することができる。
〔その他の実施の形態〕
第2〜第4の実施の形態では、Web3階層システムの例を用いて説明したが、他の複数階層のコンピュータにシステムにおいても、同様の処理を実行可能である。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。