以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図1は、残り時間問い合わせシーケンスの利用シーンの例の説明図である。例えばユーザが操作するクライアントコンピュータ101が、「http://aaa.bbb.ccc/login」というURLをアクセスアドレスとして指定して、システムにログインする。その結果、サーバコンピュータ102からクライアントコンピュータ101に、「Cookie ID=reqid12345」として例示されるパラメータにより、リクエストID「reqid12345」が返される。サーバコンピュータ102では、Webサーバのシステムが稼働している。そして、Webサーバは、クライアントコンピュータ101からリクエストを受信すると、サーバコンピュータ102と同一の(異なってもよい)アプリケーションサーバコンピュータ上で稼働するアプリケーションプログラムに受信したリクエストを発行する。この結果、アプリケーションサーバコンピュータ上では、上記リクエストID「reqid12345」に対応してスレッドが確保され、そのスレッド上でアプリケーションプログラムの一連のメソッドのシーケンスが実行される。
アプリケーションプログラムは、例えば上記サーバコンピュータ102やアプリケーションサーバコンピュータと同一または異なるデータベースサーバコンピュータ上のデータベースにアクセスする。このような処理においては、データベースに対する操作において多くの処理時間が必要となるような場合がある。図1において、クライアントコンピュータ101から例えば「http://aaa.bbb.ccc/heavy_task Cookie ID=reqid12345」というような時間がかかる処理がリクエストされた場合を考える。この場合、アプリケーションサーバコンピュータ上で該当するアプリケーションプログラムを実行するスレッドでは、処理に多くの時間を要し、クライアントコンピュータ101になかなか応答を返すことができない。
クライアントコンピュータ101を操作するユーザは、なかなか応答が返ってこないため、システムがフリーズしたと思ってしまったり、途中で諦めて操作を中止してしまったりする可能性がある。このような状況は、ユーザに対して、サービス性の低下を招く結果となる。そこで、クライアントコンピュータ101から例えば、「http://aaa.bbb.ccc/inquire_status Cookie ID=reqid12345」というような残り時間を問い合わせるリクエストを発行できたとする。これを受けて、サーバコンピュータ102がリクエストID「reqid12345」に対応するスレッドの処理の残り時間を算出し、例えば「あと10秒で終わります」というような応答をクライアントコンピュータ101に返すことができる。これにより、クライアントコンピュータ101を操作するユーザは、現在のリクエストの処理状況を適切に把握することができるようになり、操作を諦めてしまうというような事態を避けることができるようになり、サービス性が向上する。
以下に説明する各実施形態は、このような処理の残り時間の問い合せサービスを提供することができるシステムである。以下の説明では、説明の便宜上、アプリケーションサーバのシステムは、図1のサーバコンピュータ102上で動作しているものとして説明するが、別のサーバコンピュータ上で動作する場合であっても実行場所が違うだけで、同様に実施できる。
図2は、第1の実施形態のシステム構成図であり、図1のサーバコンピュータ102上で動作する。このシステムは、特には図示しないWebサーバのシステムが図1のクライアントコンピュータ101から受信したリクエストに基づいて、アプリケーションプログラムを実行するアプリケーションサーバのシステムである。「発明が解決しようとする課題」において前述したように、従来技術では、リクエストの処理種別を事前に知る必要があった。これに対して、第1の実施形態のシステムは、実行履歴の解析によって、自動的に処理種別を判断するプログラムコードをアプリケーションプログラムに挿入することができる技術である。
図2において、Webアプリコード201は、クライアントコンピュータ101からのリクエストに基づいてWebサービスを提供するアプリケーションプログラムであり、特には図示しないデータベースシステムなどにアクセスして処理を実行する。Webアプリコード201は、例えばJavaプログラミング言語により記述されるアプリケーションプログラムである。ここで、「Java」は、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標である。Webアプリコード201は、図1のサーバコンピュータ102内のハードディスク記憶装置などの外部記憶装置に記憶される。そして、実行時に、サーバコンピュータ102内のCPU(中央演算処理装置)によって、外部記憶装置からメモリ(主記憶装置)にロードされて実行される。この際、CPUによって、リクエストが受け付けられたときには、そのリクエストIDに対応するスレッドが使用するメモリ領域が、メモリ上で確保される。
実行履歴取得コード変換部202は、Webアプリコード201の実行時に、そのコードに含まれる各メソッドの実行開始時刻と実行終了時刻を実行履歴204として記録できるようにするためのプログラムコードを、Webアプリコード201に埋め込む。この結果、Webアプリコード201は、実行履歴取得Webアプリコード203に変換される。そして、Webアプリコード201の代わりに実行履歴取得Webアプリコード203が実行される毎に、実行履歴204が記録されてゆく。実行履歴取得コード変換部202の処理は、サーバコンピュータ102(図1)の内のCPUが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
以上の実行履歴204を記録する機能は、Webベースのアプリケーションプログラムのために、通常的に実装される処理である。
履歴解析部205は、リクエスト毎のメソッドの呼び出しの実行履歴204から、メソッドが含まれる処理種別を判別して、処理種別に含まれるメソッドの呼び出し回数(以下、この呼び出し回数を「メソッド呼び出し回数」と呼ぶ)と処理の残り時間との関係を見積もる。
すなわち、履歴解析部205は、実行履歴204から、リクエスト毎のメソッドの呼び出しの一連の呼び出し順序パターンを含むシーケンスを分類したメソッド呼び出しシーケンスを取得する。そして、履歴解析部205は、メソッド呼び出しシーケンス上で実行される各メソッドの呼び出しからメソッド呼び出しシーケンスの完了までの時間の平均値を計算し、その結果を、後述するメソッドシーケンス表に書き込む。なお、メソッドシーケンスが1回の場合は、各メソッド呼び出しから、シーケンス完了までの時間をメソッドシーケンス表に書き込む。このメソッドシーケンス表のデータ構造は、サーバコンピュータ102(図1)内の特には図示しないメモリ上に記憶される。
次に、履歴解析部205がプログラムから分化木を作成する。プログラムの各メソッドをノード(節点)に対応させ、各メソッドからメソッドへの遷移を枝に対応してできるグラフ(木)を分化木とする。分化木上の始点から終点までの一つのパスがプログラムのメソッドシーケンスに対応する。履歴解析部205は、各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめる。その後、履歴解析部205は、共通でないメソッドの呼び出しもノードにし、木構造データである後述する処理種別分化木を作成する。この処理種別分化木のデータ構造は、サーバコンピュータ102(図1)内の特には図示しないメモリ上に記憶される。
次に、履歴解析部205は、処理種別分化木を構成する各ノードのうち分岐したノードを処理種別を確定する重要呼び出しとしてマークする。その後、履歴解析部205は、マークした各重要呼び出しから処理種別分化木に沿って開始ノード方向に向かって各ノードをトラバースする。そして、重要呼び出しと同じメソッドの呼び出しと開始ノードのメソッドの呼び出しについても重要呼び出しとしてさらにマークする。
次に、履歴解析部205は、すべての重要呼び出しのメソッドにメソッド名とは異なるユニークな(それぞれ個別の)モデル番号を識別情報のひとつとして定義して処理種別に対応させる。さらに履歴解析部205は、メソッドシーケンス表に得られたメソッド呼び出しシーケンス毎およびメソッド呼び出し回数毎の残り時間の平均時間に基づいて、モデル番号毎にメソッド呼び出し回数と処理の残り時間との関係を計算する。これにより、処理種別に含まれるメソッドのメソッド呼び出し回数と処理の残り時間との関係を見積もる。この見積もりの結果は、上記各モデル番号が各行、各メソッド呼び出し回数が各列に配置されたモデル表206に書き込まれる。このモデル表206のデータ構造は、サーバコンピュータ102(図1)内の特には図示しないメモリ上に記憶される。
また、履歴解析部205は、上述のモデル番号間の遷移関係を取得し、その遷移関係をモデル番号遷移表207に書き込む。モデル番号遷移表207のデータ構造は、サーバコンピュータ102(図1)内の特には図示しないメモリ上に記憶される。
このように、履歴解析部205により、リクエスト毎のメソッドの呼び出しの実行履歴204から、メソッドが含まれる処理種別を判別して、メソッドの実行段階と処理種別との遷移関係を取得することができる。具体的には、実行履歴204から取得したメソッド呼び出しシーケンス同士の比較で処理種別分化木を作成し、そこで定義される重要呼び出しとしてモデル番号を定義し、モデル番号間の遷移関係をメソッドの実行段階と処理種別との遷移関係として取得できる。第1の実施形態では、このようにメソッドの実行段階と処理種別、具体的にはモデル番号との遷移関係が取得できることで、メソッドの実行段階が判別できれば、処理種別の自動判別が可能となる。
さらに、第1の実施形態では、履歴解析部205により、処理種別毎、具体的にはモデル番号毎に、そのモデル番号に対応する処理種別に含まれる各メソッドのメソッド呼び出し回数と処理の残り時間との関係を見積もることができる。これにより、処理種別を自動判別した結果から、さらにメソッド呼び出し回数を取得することにより、現在の処理の残り時間を取得することが可能となる。
以上の履歴解析部205の処理は、サーバコンピュータ102(図1)の内のCPUが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
処理種別動的判断コード挿入部208は、リクエストに基づいて実行が開始されるスレッドに対して現在のモデル番号を含む情報を記録する変数領域であるスレッドローカル変数領域をメモリ上に確保するプログラムコードを自動生成する。また、処理種別動的判断コード挿入部208は、スレッドローカル変数領域の記録内容を参照および更新しながら実行中のスレッドにおける現在の処理種別を判別するプログラムコードを自動生成する。そして、処理種別動的判断コード挿入部208は、これらの自動生成したプログラムコードを、アプリケーションプログラムであるWebアプリコード201に埋め込む。
より具体的には、処理種別動的判断コード挿入部208は、Webアプリコード201中のリクエスト時に最初に実行されるメソッドのプログラムコードに、次のようなプログラムコードを自動生成して埋め込む。このプログラムコードは、現在のMODELIDと現在のメソッド呼び出し回数を含む情報を記録するスレッドローカル変数領域を確保する。
また、処理種別動的判断コード挿入部208は、Webアプリコード201中の各モデル番号に対応する各メソッドのプログラムコードに、次のようなプログラムコードを自動生成して埋め込む。このプログラムコードは、モデル番号遷移表207に登録されているモデル番号間の遷移関係に基づいて、スレッドローカル変数領域に現在の処理種別として記憶されている現在のモデル番号に対して次に遷移するモデル番号を決定する。そして、このプログラムコードは、スレッドローカル変数領域のMODELIDの変数値に対応するモデル番号を、上述の決定したモデル番号に更新する。
このようにして、処理種別動的判断コード挿入部208によって、Webアプリコード201に自動生成されたプログラムコードが埋め込まれ、その結果が、処理種別を動的に判断するWebアプリコード209として出力される。
以上のように、処理種別動的判断コード挿入部208により生成された処理種別を動的に判断するWebアプリコード209が実行されることにより、次のような処理が実現される。まず、実行されるスレッド毎にスレッドローカル変数領域が確保されることにより、スレッドの実行状況に応じて、現在のモデル番号を保持することができるようになる。さらに、スレッド上でのメソッドの実行中に、スレッドローカル変数領域中のモデル番号と、履歴解析部205が取得したメソッドの実行段階とモデル番号との遷移関係とから、現在のメソッドの実行段階に対応するモデル番号の遷移を判別することが可能となる。そして、スレッドローカル変数領域中のモデル番号を、上記新たに判別されたモデル番号で更新することができる。このようにして、第1の実施形態では、スレッド上でのメソッドの実行中に、その実行段階に応じた処理種別を動的に判別することが可能となる。
以上の処理種別動的判断コード挿入部208の機能は、サーバコンピュータ102(図1)の内のCPUが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
以下に、上述の構成を有する第1の実施形態の動作についてより具体的に説明する。
図3は、第1の実施形態において、処理種別動的判断コード挿入部208によって、スレッド毎にメモリ上に確保されるスレッドローカル変数領域のデータ構成例を示す図である。スレッドローカル変数領域は例えば、スレッドローカル変数管理テーブル301と、スレッドローカル変数テーブル302とを備える。
スレッドローカル変数管理テーブル301には、システム上に存在するテーブルであり、リクエストIDとスレッドローカル変数テーブル302への参照ポインタ(参照アドレス値)のデータ組が、各スレッドに対応して記憶される。図3の例では、「リクエストIDメソッド呼び出し」項目にリクエストID値1とリクエストID値2が登録されていることが示されている。参照ポインタは「スレッドローカル変数テーブルへの参照」項目に登録される。前述したように、スレッドローカル変数領域は、スレッド毎に確保される。そして、各スレッドは、各リクエストIDに1対1に対応している。従って、あるリクエストID値が受信されたときに、そのリクエストID値によってスレッドローカル変数管理テーブル301を参照することにより、そのリクエストIDに対応するスレッドのスレッドローカル変数領域であるスレッドローカル変数テーブル302の記憶アドレスを知ることができる。このスレッドローカル変数テーブル302は、処理種別動的判断コード挿入部208によって、各リクエストIDに対応するスレッドの開始時にメモリ上に確保される。
スレッドローカル変数テーブル302には、スレッドにおいて、残り時間を算出するために必要なスレッドローカル変数群が記憶される。スレッドローカル変数群としては例えば、MODELID、NCALL、ENDTIME、METHOD_HISTORYの4変数が記憶される。各スレッドローカル変数は、変数インデックスによって参照される。MODELID値の参照時には変数インデックス値1が、NCALL値の参照時には変数インデックス値2が、ENDTIME値の参照時には変数インデックス値3が、METHOD_HISTORY配列値の参照時には変数インデックス値4が各々指定される。なお、残り時間の算出という処理を実現するものであれば、スレッドローカル変数群はこれらの変数群には限定されない。
スレッドローカル変数テーブル302において、変数MODELIDは、スレッドの現在のモデル番号を保持する。また、変数NCALLは、スレッドにおける現在までの延べのメソッド呼び出し回数を保持する。ENDTIME値とMETHOD_HISTORY配列値については、第4の実施形態の説明において後述する。本特許出願の発明者は、以下に説明するように、現在実行中のスレッドで、モデル番号と、現在のメソッド呼び出し回数がわかれば、スレッドが完了するまでの処理の残り時間を平均値として見積もれることを見出した。
まず、図2に示されるWebアプリコード201は、メソッドと呼ばれるプログラムコードを単位として呼び出される。いま、あるリクエストIDに対して確保されるスレッド上で、一連の複数のメソッドが呼び出されて実行されるとき、その一連のメソッド群のことを、メソッド呼び出しシーケンスと呼ぶ。メソッド呼び出しシーケンスの種類は、図2の実行履歴204から、リクエストID毎に実行されるメソッド群のシーケンスを判別することにより抽出し分類することができる。実行履歴204上では、ある1つの種類のメソッド呼び出しシーケンスを有するメソッドの呼び出し履歴は、複数組が存在する可能性がある。ここで、そのメソッド呼び出しシーケンスに含まれるノード数をN個とする。この場合、そのメソッド呼び出しシーケンス上で第n(1≦n≦N)番目に呼び出されるメソッドの、実行開始からそのシーケンスの終了までの時間(これを第n番目のメソッドに関する「残り時間」と定義する)は、次のようにして算出できる。実行履歴204から、上記ある1つの種類のメソッド呼び出しシーケンスに対する複数組の履歴のそれぞれで、第n番目のメソッドの実行開始からその履歴上のシーケンスの終了までの残り時間を計算し、複数組の履歴間でその残り時間の平均値を計算する。この計算を、第1番目から第N番目までの全てのノードについて実行する。この結果、上記ある1種類のメソッド呼び出しシーケンス上で第1番目から第N番目までに呼び出される各ノードについて、残り時間の平均値を見積もることができる。さらに、実行履歴204に基づいて分類できるメソッド呼び出しシーケンスの各種類について、各シーケンス上で順次呼び出される各ノードについて、残り時間の平均値を見積もることができる。図2の履歴解析部205は、上述のメソッド呼び出しシーケンス毎およびメソッド呼び出し回数毎の残り時間の平均値の計算を実行し、その計算結果をサーバコンピュータ102(図1)のメモリ上に記憶領域を確保したメソッドシーケンス表401に書き込む。
図4は、第1の実施形態において、履歴解析部205によって作成されるメソッドシーケンス表401の作成処理とデータ構成例を示す図である。図2の実行履歴204の解析結果から、メソッド(図中「method」と表記)A−B−B−C−Dという順で実行されるメソッド呼び出しシーケンスの履歴と、シーケンス内の各メソッドに対応する残り時間が、402(#1)として得られたとする。同様に、メソッドA−B−Eという順で実行されるメソッド呼び出しシーケンスの履歴と、シーケンス内の各メソッドに対応する残り時間が、402(#2)として得られたとする。これらのデータより、図4のメソッドシーケンス表401の1行目に、メソッドシーケンス「A−B−B−C−D」と、出現回数=1回が登録される。また、第1回目のメソッド呼び出しの残り時間として、解析結果402(#1)の「methodA」の残り時間=10秒が登録される。第2回の各残り時間として、402(#1)の「methodB」の残り時間=4秒が登録される。第3回の各残り時間として、402(#1)の「methodB」の残り時間=3秒が登録される。第4回の各残り時間として、402(#1)の「methodC」の残り時間=2秒が登録される。第5回の各残り時間として、402(#1)の「methodD」の残り時間=1秒が登録される。次に、メソッドシーケンス表401の2行目に、メソッドシーケンス「A−B−E」と、出現回数=1回が登録される。また、第1回目のメソッド呼び出しの残り時間として、解析結果402(#2)の「methodA」の残り時間=7秒が登録される。第2回の各残り時間として、402(#2)の「methodB」の残り時間=5秒が登録される。第3回の各残り時間として、402(#2)の「methodE」の残り時間=1秒が登録される。第4回と第5回の各残り時間は存在しないので、未登録である。ここで、実行履歴204から、同じメソッド呼び出しシーケンスが複数組解析された場合には、メソッドシーケンス表401の該当する行の出現回数の項目に解析された回数が登録される。そして、各回のメソッド呼び出しの残り時間の項目には、複数組の各残り時間の平均値が計算されて登録される。
上述のように、理想的には、現在実行中のスレッドにおけるメソッド呼び出しシーケンスと現在のメソッド呼び出し回数がわかれば、メソッドシーケンス表401から、現在のメソッドに関する残り時間を算出することができる。しかし、各メソッドは独立に呼び出して実行させることが可能である。このため、あるリクエストIDによってあるメソッドが実行されている時点では、そのリクエストIDにより最終的にスレッド全体として、どの種類のメソッド呼び出しシーケンスが実行されるかは確定できず、シーケンスが枝別れする可能性がある。
しかしながら、あるメソッドが、スレッドの開始から延べで何回目に呼び出されたメソッドであるかがわかれば、そのメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかは、前述のメソッド呼び出しシーケンスの分類結果から、解析可能である。そうすれば、これらの複数組のメソッド呼び出しシーケンスに関するメソッド呼び出し回数毎の残り時間の平均値として、現在のメソッド呼び出し回数に対応する残り時間を算出することが可能となる。
具体的には、図4のメソッドシーケンス表401に複数種類に分類されているメソッド呼び出しシーケンス同士で、呼び出し回数毎のメソッド呼び出しを比較する。そして、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しもノードにして、サーバコンピュータ102(図1)のメモリ上の記憶領域に、木構造のデータを作成する。
図5は、第1の実施形態における上記木構造である処理種別分化木501の作成処理とデータ構成例の説明図である。処理種別分化木501において、第1階層のノードには、1回目に呼び出されるメソッドが対応付いている。図5の例では、左端のメソッドAである。この1回目に呼び出されるメソッドAは、第2階層以下の全てのノードにつながっている。このため、1回目に呼び出されるメソッドAの実行後には、図4のメソッドシーケンス表401に得られている全ての種類(図4では2種類)のメソッド呼び出しシーケンスが実行される。一般的に、第n階層(n≧1)にあるノード(1つとは限らない)には、n回目に呼び出されるメソッドが対応付いている。そして、このノードより先に接続されている第n+1階層以上の部分が、例えば2通りの経路に分岐しているとすれば、そのn回目に呼び出されるメソッドの実行後には2通りのメソッド呼び出しシーケンスが実行されることになる。図5の例では、第2階層(左端から2番目)にあるノードには、第2回目に呼び出されるメソッドBが対応付いている。そして、このノードより先に接続されている第3階層(左端から3番目)以上の部分は、2通りの経路に分岐しているため、2回目に呼び出されるメソッドの実行後には2通りのメソッド呼び出しシーケンスが実行されることになる。図5の例では、メソッド呼び出しシーケンス「A−B−B−C−D」中の「B−C−D」という部分と、メソッド呼び出しシーケンス「A−B−E」中の「E」という部分である。また、図5の例では、第3階層(左端から3番目)にあるノードには、第3回目に呼び出されるメソッドBまたはEが対応付いている。そして、メソッドBのほうのノードより先に接続されている第4階層(左端から4番目)以上の部分は、「C−D」という1通りの経路のみである。このため、3回目に呼び出されるメソッドBの実行後には1通りのメソッド呼び出しシーケンス「A−B−B−C−D」中の「C−D」という部分のみが実行される。メソッドEのほうのノードより先には接続されているノードはないため、この経路ではメソッド呼び出しシーケンス「A−B−E」の1種類が確定する。
以上の処理種別分化木501を用いることで、例えば、現在のメソッド呼び出し回数が第1回目でノードAが実行されているということがわかった場合を考える。この場合、その後には、図4のメソッドシーケンス表401に登録されているメソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」の2種類が同じ回数実行される可能性があるということがわかる。(図4の例では1回ずつ)このため、図4のメソッドシーケンス表401のこれら2つのメソッド呼び出しシーケンス中の各第1回目のメソッド呼び出し回数に対応する残り時間「10秒」および「7秒」の出現頻度で重みづけした加重平均値8.5秒(=(10秒×1回+7秒×1回)/(2回))として、残り時間を見積もることができる。次に、現在のメソッド呼び出し回数が第2回目でノードBが実行されているということがわかった場合を考える。この場合にも、その後には、図4のメソッドシーケンス表401に登録されているメソッド呼び出しシーケンス「A−B−B−C−D」の部分「B−C−D」と「A−B−E」の部分「E」の2種類が実行される可能性があるということがわかる。このため、図4のメソッドシーケンス表401のこれら2つのメソッド呼び出しシーケンス中の各第2回目のメソッド呼び出し回数に対応する残り時間「4秒」および「5秒」の出現頻度で重みづけした加重平均値4.5秒として、残り時間を見積もることができる。さらに、現在のメソッド呼び出し回数が第3回目でノードBが実行されているということがわかった場合を考える。この場合にも、その後には、図4のメソッドシーケンス表401に登録されているメソッド呼び出しシーケンス「A−B−B−C−D」の部分「C−D」の1種類が実行される可能性があるということがわかる。このため、図4のメソッドシーケンス表401のメソッド呼び出しシーケンス「A−B−B−C−D」中の第3回目のメソッド呼び出し回数に対応する残り時間「3秒」として、残り時間を見積もることができる。一方、現在のメソッド呼び出し回数が第3回目でノードEが実行されているということがわかった場合を考える。この場合には、図4のメソッドシーケンス表401に登録されているメソッド呼び出しシーケンス「A−B−E」の最後のノード「E」が実行されたことになる。このため、図4のメソッドシーケンス表401のメソッド呼び出しシーケンス「A−B−E」中の第3回目のメソッド呼び出し回数に対応する残り時間「1秒」として、残り時間を見積もることができる。
以上のようにして、現在のメソッド呼び出し回数とメソッド名がわかれば、処理種別分化木501より、そのメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかが判定可能となる。これにより、判定された組数のメソッド呼び出しシーケンスに関する現在のメソッド呼び出し回数に対応する回数の残り時間の平均値として、現在の残り時間を算出することが可能となる。しかし、残り時間の問合せ要求が発生する毎に上記計算を実行するのでは応答性能が悪い。このため、処理種別分化木501から抽出できる全てのノードについて、そのノードに対応するメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかを判定して残り時間の平均値を計算しておき、テーブルに登録しておく。そして、残り時間の問合せ要求の発生時には、現在のメソッド呼び出し回数とメソッド名からそのテーブルを参照することにより、残り時間を高速に見積もることが可能となる。
しかしながら実際には、図1のサーバコンピュータ102上で解析される処理種別分化木501は相当複雑な構造になることが予想される。従って、その全ての階層の全てのノードについて上記残り時間を計算しておくのは、大規模なアプリケーションサーバシステムにおいては効率的でない。
そこで、本実施形態では、図2の履歴解析部205が、処理種別分化木501の経路を決定付けるノード、すなわち処理種別を確定するメソッドについてのみ「重要呼び出し」としてマークする。そして、その「重要呼び出し」に対応するメソッドと開始ノードのメソッドとについてのみ、残り時間を計算しておく。
図6は、第1の実施形態における重要呼び出しの抽出処理の説明図である。図2の履歴解析部205は、処理種別分化木501を構成する各ノードのうち分岐したノードを処理種別を確定する重要呼び出しとしてマークする。例えば図6(a)に示される処理種別分化木501において、破線の楕円で囲まれた第3階層にある分岐した2つの濃い色のノード(メソッドBとEに対応する各ノード)が、重要呼び出しとしてマークされる。その後、履歴解析部205は、マークした各重要呼び出しから処理種別分化木501に沿って開始ノード方向(図中、左方向)に向かって各ノードをトラバースする。そして、重要呼び出しと同じメソッドのノードと開始ノードについても重要呼び出しとしてさらにマークする。例えば図6(b)に示される処理種別分化木501において、第3階層でメソッドBのノードが重要呼び出しとしてマークされたため、第2階層にある濃い色のメソッドBのノードも重要呼び出しとしてマークされる。さらに、第1階層にある濃い色のメソッドAの開始ノードも重要呼び出しとしてマークされる。
次に、図2の履歴解析部205は、処理種別分化木501上でマークしたすべての重要呼び出しに、ユニークな(それぞれ個別の)モデル番号を定義する。
図7は、第1の実施形態におけるモデル番号の付与処理の説明図である。図7の例では、図6(b)のようにマークされた重要呼び出しの各ノードに、1、2、3、4というモデル番号がそれぞれ付与される。本実施形態では、このようにして重要呼び出しに付与されたモデル番号が定義される。前述したように、個別のメソッド呼び出しシーケンスを直接判別するのが理想的であるが、計算効率を考慮すると、上述のようにして代表的に決定されたモデル番号を介して間接的に処理種別を判別するのがよい。
続いて、図2の履歴解析部205は、上述のモデル番号毎にメソッド呼び出し回数と処理の残り時間との関係を計算し、モデル表206に記憶する。
図8は、第1の実施形態におけるモデル表206の作成処理とデータ構成例の説明図である。まず、履歴解析部205は、サーバコンピュータ102(図1)のメモリ上にモデル表206の記憶領域を確保する。次に、履歴解析部205は、処理種別分化木501上で付与したモデル番号毎にモデル表206にエントリ(表の行データ)を作成し、「モデル番号」項目に各モデル番号を登録する。また、モデル表206の「Method名」項目に各モデル番号に対応するメソッド名を登録する。図8の例では、モデル番号1、2、3、4にそれぞれ対応する各エントリが作成され、メソッド名としてA、B、B、Eが登録される。次に、履歴解析部205は、モデル表206の各モデル番号のエントリに対応して、図5に例示される処理種別分化木501より、そのモデル番号を含む何通りのメソッド呼び出しシーケンスが実行されるかを判定する。次に、判定された組数のメソッド呼び出しシーケンスに関する各メソッド呼び出し回数に対応する各残り時間の平均値を計算する。そして、その計算した各残り時間の平均値を、モデル表206上の各モデル番号のエントリの各メソッド呼び出し回数に対応する項目に登録する。
図8の例では、例えば、モデル番号1に関しては、図8に示される処理種別分化木501より、メソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」の2種類が実行される可能性があるということがわかる。これより、図4のメソッドシーケンス表401のこれら2つのメソッド呼び出しシーケンス中の各第1回目のメソッド呼び出し回数に対応する残り時間「10秒」および「7秒」の頻度で重みづけした加重平均値8.5秒(=(10秒×1回+7秒×1回)/(2回))として、第1回目のメソッド呼び出しの残り時間を計算できる。また、メソッドシーケンス表401の上記2つのメソッド呼び出しシーケンス中の各第2回目のメソッド呼び出し回数に対応する残り時間「4秒」および「5秒」の出現頻度で重みづけした加重平均値4.5秒として、第2回目のメソッド呼び出しの残り時間を計算できる。また、メソッドシーケンス表401の上記2つのメソッド呼び出しシーケンス中の各第3回目のメソッド呼び出し回数に対応する残り時間「3秒」および「1秒」の出現頻度で重みづけした加重平均値2秒として、第3回目のメソッド呼び出しの残り時間を計算できる。さらに、メソッドシーケンス表401の上記2つのメソッド呼び出しシーケンス中の各第4回目のメソッド呼び出し回数に対応する残り時間「2秒」および「0秒」(登録無し)の平均値1秒として、第4回目のメソッド呼び出しの残り時間を計算できる。そして、メソッドシーケンス表401の上記2つのメソッド呼び出しシーケンス中の各第5回目のメソッド呼び出し回数に対応する残り時間「1秒」および「0秒」(登録無し)の出現頻度で重みづけした加重平均値0.5秒として、第5回目のメソッド呼び出しの残り時間を計算できる。
図8において、モデル番号2に関しては、図8に示される処理種別分化木501より、モデル番号1の場合と同様に、メソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」の2種類が実行される可能性があるということがわかる。これより、モデル番号2に対応する各メソッド呼び出し回数に対応する各残り時間は、モデル番号1の場合と同様となる。
図8において、モデル番号3に関しては、図8に示される処理種別分化木501より、メソッド呼び出しシーケンス「A−B−B−C−D」の1種類のみが実行されることがわかる。これより、図4のメソッドシーケンス表401の上記メソッド呼び出しシーケンス中の各メソッド呼び出し回数に対応して登録されている各残り時間がそのまま、モデル番号3に対応する各メソッド呼び出し回数に対応する各残り時間として登録される。すなわち、第1回目、第2回目、第3回目、第4回目、第5回目の各メソッド呼び出し回数に対応する各残り時間として、10秒、4秒、3秒、2秒、1秒が登録される。
図8において、モデル番号4に関しては、図8に示される処理種別分化木501より、メソッド呼び出しシーケンス「A−B−E」の1種類のみが実行されることがわかる。これより、図4のメソッドシーケンス表401の上記メソッド呼び出しシーケンス中の各メソッド呼び出し回数に対応して登録されている各残り時間がそのまま、モデル番号4に対応する各メソッド呼び出し回数に対応する各残り時間として登録される。すなわち、第1回目、第2回目、第3回目、第4回目、第5回目の各メソッド呼び出し回数に対応する各残り時間として、7秒、5秒、1秒、0秒、0秒が登録される。なお、メソッド呼び出しシーケンス「A−B−E」に関しては、第4回目および第5回目のメソッド呼び出し回数は存在しないが、それぞれ便宜上0秒が登録される。
このようにして作成されたモデル表206を使用すれば、残り時間の問合せ要求時に、対象スレッド上でいずれかのモデル番号に対応するメソッドが実行されたことを判別でき、かつメソッド呼び出し回数を判別できれば、残り時間を取得することができる。例えば図8において、残り時間の問合せ要求時に、モデル番号=4が判別できかつメソッド呼び出し回数=3回が判別できれば、モデル表206のモデル番号=4に対応するエントリのメソッド呼び出し回数=3に対応する項目の残り時間=1秒が取得される。そして、この残り時間=1秒が、残り時間の問合せ要求時に対して応答される。
なお、処理種別分化木501の性質から、残り時間の問合せ要求が対象スレッドでの実行上後になるほど、それより後に実行される可能性のメソッド呼び出しシーケンスの候補数は少なくなる。このため、残り時間の問合せ要求時に判別できるモデル番号の値が大きくなるほど、残り時間が平均化される度合いが少なくなるため、正確な残り時間を算出できるようになる。しかし、対象スレッド上早い実行時点で残り時間の問合せ要求が発生したとしても、本実施形態では、その後に実行される可能性のある複数組のメソッド呼び出しシーケンスから求まる平均値として、適切な残り時間を応答することが可能となる。
ここで、図2の履歴解析部205は、後述するモデル番号遷移表207の作成のために、処理種別分化木501を参照して、モデル表206の各モデル番号のエントリの「直前モデル番号」項目に、各モデル番号の直前に実行されるモデル番号を登録しておく。例えば図8のモデル表206のモデル番号=2のエントリの「直前モデル番号」項目には、モデル番号=2の直前のモデル番号=1が登録される。また、モデル番号=3のエントリの「直前モデル番号」項目には、モデル番号=3の直前のモデル番号=2が登録される。モデル番号=4のエントリの「直前モデル番号」項目にも、処理種別分化木501より、モデル番号=4の直前のモデル番号=2が登録される。なお、モデル番号=1は先頭のモデル番号であるため、モデル番号=1のエントリの「直前モデル番号」項目は未登録となる。
最後に、図2の履歴解析部205は、モデル表206の「直前モデル番号」項目の登録内容に基づいて、メソッド毎に、モデル番号間の遷移関係を取得し、その遷移関係をメモリ上に記憶領域を確保したモデル番号遷移表207に書き込む。
図9は、第1の実施形態におけるモデル番号遷移表207の作成処理とデータ構成例の説明図である。履歴解析部205はまず、図8のモデル表206において、最初のモデル番号=1のエントリの「Method名」項目に登録されているメソッド名=Aを識別する。このメソッド名=Aに関して、モデル番号=1のエントリの「直前モデル番号」項目は未登録である。この結果、履歴解析部205は、モデル番号遷移表207にメソッドAに対応する第1番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドAのメソッド名(図中、「methodA」と表記)を登録する。また、このエントリの「モデル番号遷移」項目に、「*−>1」という遷移関係を登録する。この遷移関係において、「*」は未登録状態、「1」はモデル番号=1を示す。また、「−>」は、この矢印の左側に表記される項目から右側に表記される項目にモデル番号が遷移することを示している。すなわち、「*−>1」は、スレッド上で現在実行されているメソッドがAの場合に、直前のモデル番号が未登録であれば、現在のモデル番号を1に遷移させることを示している。これは、例えば図7に示される処理種別分化木501上で、現在のメソッドAが最初に実行されるモデル番号に対応するメソッドであるときには、現在のスレッドのモデル番号を1に遷移すべきであることを示している。
次に、履歴解析部205は、図8のモデル表206において、第2番目のモデル番号=2のエントリの「Method名」項目に登録されているメソッド名=Bを識別する。このメソッド名=Bは、さらにモデル表206のモデル番号=3のエントリの「Method名」項目にも登録されている。そこで、履歴解析部205は、モデル番号=2とモデル番号=3の各エントリの「直前モデル番号」項目を参照する。モデル番号=2の「直前モデル番号」項目にはモデル番号=1が登録されている。一方、モデル番号=3の「直前モデル番号」項目にはモデル番号=2が登録されている。この結果、履歴解析部205は、モデル番号遷移表207にメソッドBに対応する第2番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドBのメソッド名(図中、「methodB」と表記)を登録する。また、このエントリの「モデル番号遷移」項目に、「1−>2、2−>3」という遷移関係を登録する。遷移関係「1−>2」は、スレッド上で現在実行されているメソッドがBの場合に、直前のモデル番号が1であれば、現在のモデル番号を2に遷移させることを示している。これは、例えば図7に示される処理種別分化木501上で、今までモデル番号=1のメソッドAが実行されていた状態から、現在がメソッドBの実行状態になったときには、現在のスレッドのモデル番号を2に遷移すべきであることを示している。また、遷移関係「2−>3」は、スレッド上で現在実行されているメソッドがBの場合に、直前のモデル番号が2であれば、現在のモデル番号を3に遷移させることを示している。これは、例えば図7に示される処理種別分化木501上で、今までモデル番号=2のメソッドBが実行されていた状態から、現在も同じくメソッドBの実行状態になったときには、現在のスレッドのモデル番号を3に遷移すべきであることを示している。
次に、履歴解析部205は、図8のモデル表206において、第3番目のモデル番号=3のエントリの「Method名」項目に登録されているメソッド名=Bを識別するが、メソッドBは既に処理済みであるためスキップする。この結果、履歴解析部205は、図8のモデル表206において、第4番目のモデル番号=4のエントリの「Method名」項目に登録されているメソッド名=Eを識別する。履歴解析部205は、モデル番号=4のエントリの「直前モデル番号」項目を参照する。モデル番号=4の「直前モデル番号」項目にはモデル番号2が登録されている。この結果、履歴解析部205は、モデル番号遷移表207にメソッドEに対応する第3番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドEのメソッド名(図中、「methodE」と表記)を登録する。また、このエントリの「モデル番号遷移」項目に、「2−>4」という遷移関係を登録する。この遷移関係「2−>4」は、スレッド上で現在実行されているメソッドがEの場合に、直前のモデル番号が2であれば、現在のモデル番号を4に遷移させることを示している。これは、例えば図7に示される処理種別分化木501上で、今までモデル番号=2のメソッドBが実行されていた状態から、現在がメソッドEの実行状態になったときには、現在のスレッドのモデル番号を4に遷移すべきであることを示している。
以上のようにして、図2の履歴解析部205の処理により、残り時間の問合せ要求に対して、モデル番号とメソッド呼び出し回数とから残り時間を取得して応答するためのモデル表206を作成することができる。また、履歴解析部205の処理により、このモデル表206を参照するときの現在のモデル番号を取得するためのモデル番号遷移表207を作成することができる。
次に、図2の処理種別動的判断コード挿入部208の動作についてより具体的に説明する。
まず、処理種別動的判断コード挿入部208は、Webアプリコード201中のリクエストの受信時に最初に実行されるメソッドのプログラムコードに、図3に例示したスレッドローカル変数領域を確保するプログラムコードを埋め込む。
図10は、第1の実施形態におけるスレッドローカル変数領域を確保するプログラムコードの埋め込み処理の説明図である。いま、図2のWebアプリコード201が例えばJavaプログラミング言語により記述されるサーブレット(Servlet)と呼ばれるサーバプログラムである場合を考える。この場合に、図1のクライアントコンピュータ101からリクエストIDを有するリクエストが受信されたときに最初に実行されるメソッドは、「doGet()」または「doPost()」と呼ばれるトップレベルルーチンである。「doGet()」は、図1のクライアントコンピュータ101から、HTTP(ハイパー・テキスト・トランスファ・プロトコル)によるGetアクセスと呼ばれるリクエスト形式のデータを受信するルーチンである。「doPost()」は、クライアントコンピュータ101から、HTTP(ハイパー・テキスト・トランスファ・プロトコル)によるPostアクセスと呼ばれるリクエスト形式のデータを受信するルーチンである。HTTPの場合、図1のクライアントコンピュータ101からサーバコンピュータ102へは、リクエストはGetアクセスまたはPostアクセスのいずれかのデータ形式で送信される。doGet()メソッドを例にして説明する。なお、doPost()メソッドの場合も同様である。図10において、1001は、doGet()メソッドのプログラムコード例であり、図2のWebアプリコード201の一部である。1002は、doGet()メソッドプログラムコード1001を処理種別動的判断コード挿入部208による変換後のdoGet()メソッドのプログラムコードであり、図2の処理種別を動的に判断するWebアプリコード209の一部である。処理種別動的判断コード挿入部208は、doGet()メソッドのプログラムコード内の最初に実行される行の手前に、リクエストIDを生成するプログラムコード(リクエストIDが付与されていない場合)を埋め込む。続けて、図2または図8のモデル表206とモデル番号遷移表207がまだ生成されていない場合に、それらをメモリ上に生成するプログラムコードが埋め込まれる。さらに続けて、スレッドローカル変数領域を確保するプログラムコードが埋め込まれる。スレッドローカル変数領域は、図3のスレッドローカル変数管理テーブル301から参照されるスレッドローカル変数テーブル302に対応する。このプログラムコードによって、まず、スレッドローカル変数管理テーブル301上にリクエストIDのエントリが作成される。次に、そのエントリの「リクエストIDメソッド呼び出し」項目にリクエストID値が登録される。さらに、メモリ上でスレッドローカル変数テーブル302の記憶領域が確保された後に、その記憶領域の先頭アドレスへのポインタが、スレッドローカル変数管理テーブル301上の上記エントリの「スレッドローカル変数テーブルへの参照」項目に登録される。処理種別動的判断コード挿入部208は、doGet()メソッドのプログラムコード内の最後に実行される行の直後に、リクエストIDに対応するスレッドのスレッドローカル変数領域を解放するプログラムコードを埋め込む。このプログラムコードにより、スレッド上での全てのメソッド呼び出しシーケンスが終了してトップレベルルーチンのdoGet()メソッドが処理を終了するときに、そのスレッドに対応して確保されていたスレッドローカル変数領域が解放される。具体的には、このプログラムコードにより、図3の該当するスレッドローカル変数テーブル302の記憶領域が解放され、スレッドローカル変数管理テーブル301上の該当するリクエストIDに対応するエントリが削除される。
次に、処理種別動的判断コード挿入部208は、Webアプリコード201中の各モデル番号に対応する各メソッドのプログラムコードの先頭に、モデル番号を判別して更新するためのモデル判別コードを自動生成して埋め込む。
図11は、第1の実施形態におけるモデル番号を更新するモデル判別コードの埋め込み処理の説明図である。前述したように、メモリ上に生成されているモデル番号遷移表207において、例えばメソッドBに対応するエントリには、履歴解析部205によって、モデル番号の遷移関係として「1−>2」と「2−>3」が登録されている。これに対応して、処理種別動的判断コード挿入部208は、図11に示されるように、図2のWebアプリコード201の一部であるメソッドBのプログラムコード1101に対して、1102内に示されるようなモデル判別コードを埋め込む。この結果、処理種別動的判断コード挿入部208は、処理種別を動的に判断するWebアプリコード209の一部として、メソッドBのプログラムコード1102を生成する。
プログラムコード1102において、メソッドBにおいて実行される最初のプログラムコードの直前には、「if(MODELID==1)MODELID=2;」というモデル判別コードが埋め込まれる。このモデル判別コードは、図3のスレッドローカル変数管理テーブル301からスレッドローカル変数テーブル302中のMOEDLID変数の値であるMOEDLID値を参照する。そして、MOEDLID値が1であるときには、そのMOEDLID値に2を代入する。このモデル判別コードは、遷移関係「1−>2」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがBの場合に、スレッドローカル変数テーブル302の直前のMOEDLID値が1であれば、そのMOEDLID値を2にして現在のモデル番号を2に遷移させるモデル判別コードである。これは、例えば図7の第2階層目のモデル番号=2におけるメソッドBの実行に相当する。
プログラムコード1102において、上記1行目のモデル判別コードに続いて、「else if(MODELID==2)MODELID=3;」というモデル判別コードが埋め込まれる。このモデル判別コードは、上記スレッドローカル変数テーブル302中のMOEDLID値が2であるときには、そのMOEDLID値に3を代入する。このモデル判別コードは、遷移関係「2−>3」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがBの場合に、スレッドローカル変数テーブル302の直前のMOEDLID値が2であれば、そのMOEDLID値を3にして現在のモデル番号を3に遷移させるモデル判別コードである。これは、例えば図7の第3階層目のモデル番号=3におけるメソッドBの実行に相当する。
プログラムコード1102において、上記2行目のモデル判別コードに続いて、「else { /* Do nothing */ }」というプログラムコードが埋め込まれる。このプログラムは、上記1行目と2行目のいずれの条件も満たされなかった場合に、空処理を実行する、すなわち何も実行しないことを示している。なお、「/* Do nothing */」という記述は、プログラムコード中のコメント文であり、プログラムコードの実行には影響しない。
図11において、モデル番号遷移表207に登録されているメソッドAやメソッドEについては、特には図示しないが、メソッドBの場合と同様に、各メソッドのプログラムコードにモデル番号を更新するためのモデル判別コードが埋め込まれる。前述したように、メモリ上に生成されているモデル番号遷移表207において、例えばメソッドAに対応するエントリには、履歴解析部205によって、モデル番号の遷移関係として「*−>1」が登録されている。これに対応して、処理種別動的判断コード挿入部208は、メソッドAのプログラムコードに関して、図2のWebアプリコード201を処理種別を動的に判断するWebアプリコード209に変換する。このプログラムコードにおいて、メソッドAにおいて実行される最初のプログラムコードの直前には、例えば「unless(MODELID)MODELID=1;」というモデル判別コードが埋め込まれる。このモデル判別コードは、スレッドローカル変数テーブル302中のMOEDLID値が0または未登録であるときには、そのMOEDLID値に1を代入する。このモデル判別コードは、遷移関係「*−>1」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがAの場合に、スレッドローカル変数テーブル302の直前のMOEDLID値が0または未登録であれば、そのMOEDLID値を1にして現在のモデル番号を1に遷移させるモデル判別コードである。これは、例えば図7の第1階層目のモデル番号=1におけるメソッドAの実行に相当する。また、図11のモデル番号遷移表207において、例えばメソッドEに対応するエントリには、履歴解析部205によって、モデル番号の遷移関係として「2−>4」が登録されている。これに対応して、処理種別動的判断コード挿入部208は、メソッドEのプログラムコードに関して、図2のWebアプリコード201を処理種別を動的に判断するWebアプリコード209に変換する。このプログラムコードにおいて、メソッドEにおいて実行される最初のプログラムコードの直前には、例えば「if(MODELID==2)MODELID=4;」というモデル判別コードが埋め込まれる。このモデル判別コードは、スレッドローカル変数テーブル302中のMOEDLID値が2であるときには、そのMOEDLID値に4を代入する。このモデル判別コードは、遷移関係「2−>4」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがEの場合に、スレッドローカル変数テーブル302の直前のMOEDLID値が2であれば、そのMOEDLID値を4にして現在のモデル番号を4に遷移させるモデル判別コードである。これは、例えば図7の第3階層目のモデル番号=4におけるメソッドEの実行に相当する。
以上のようにして図2の処理種別動的判断コード挿入部208によって得られた処理種別を動的に判断するWebアプリコード209が、図1のユーザコンピュータからのリクエストの受信時に、Webアプリコード201の代わりに実行される。この結果、現在実行中のスレッドにおいて、現在のメソッドが例えば図7の処理種別分化木501中のどのモデル番号までが実行されているかを、スレッドローカル変数テーブル302(スレッドローカル変数領域)中のMOEDLID値として把握することが可能となる。
以上のようにして、第1の実施形態では、現在実行中のスレッドにおいてどのモデル番号までのメソッドが実行されているかを常に把握することが可能となる。これと共に、後述する第2の実施形態により現在実行中のスレッドにおけるメソッド呼び出し回数を把握することで、図8のように作成されたモデル表206を参照して、現在実行中のスレッドにおける処理の残り時間を取得することが可能となる。第2の実施形態で後述するように、図3のスレッドローカル変数テーブル302(スレッドローカル変数領域)のNCALL変数には、NCALL値として、現在実行中のスレッドにおけるメソッド呼び出し回数が得られる。図1のクライアントコンピュータ101からリクエストIDを指定して残り時間の問合せ要求が受信された場合に、リクエストIDで図3のスレッドローカル変数管理テーブル301がアクセスされることにより、該当するスレッドローカル変数テーブル302が参照される。この結果、スレッドローカル変数テーブル302からMOEDLID値とNCALL値が読み出される。そして、モデル表206において、MOEDLID値に対応するモデル番号のエントリ行のNCALL値に対応するメソッド呼び出し回数の項目に登録されている残り時間が取得され、クライアントコンピュータ101に応答される。例えば、スレッドローカル変数テーブル302からMOEDLID値=4、NCALL値=3が得られたとする。この場合、モデル表206上のモデル番号=4に対応するエントリ行のメソッド呼び出し回数=3の項目に対応する残り時間=1秒が取得され、クライアントコンピュータ101に応答される。
このようにして、第1の実施形態では、残り時間を応答するために処理種別を事前に知る必要がなく、現在実行中のスレッドに対応する処理種別をモデル番号として自動的に取得し、適切な残り時間を応答することが可能となる。
図12は、図2の機能ブロックによって示される第1の実施形態のシステムの制御処理を示すフローチャートである。このフローチャートは、例えば図37で後述するサーバコンピュータ102(図1)のハードウェア構成で、CPU(中央演算処理装置)3701が外部記憶装置3705に記憶された制御プログラムをメモリ3702にロードして実行する処理である。
まず、ステップS1は、図2の実行履歴取得コード変換部202の処理である。ここでは、既存プロファイル技術を使って、図2に示されるメソッドの実行履歴204が取得される。
次に、ステップS2−1からS2−8までは、図2の履歴解析部205の処理に対応する処理である。
まず、リクエスト毎すなわちスレッドID(リクエストID)毎に図2の実行履歴204が分割される(ステップS2−1)。
次に、リクエスト毎にメソッド開始からスレッドが完了するまでの残り時間が計算され、また、終了に関する情報が取り除かれる(ステップS2−2)。
次に、図4で説明しように、実行履歴204から抽出されるメソッド呼び出しシーケンス毎に、出現回数がカウントされる。そして、前述したように、シーケンス中の各メソッド呼び出し回数に対応するメソッド毎に、各メソッドの開始から完了までの時間の平均値が計算されて、図4のメソッドシーケンス表401に登録される(ステップS2−3)。
次に、図5で説明した処理種別分化木501が作成される(ステップS2−4)。
次に、図6で説明したように、処理種別を確定するメソッド呼び出しが「重要呼び出し」としてマークされる。その後、マークした各重要呼び出しから図5の処理種別分化木501のメソッド呼び出しシーケンスに沿って開始ノード方向に向かって各ノードがトラバースされる。そして、重要呼び出しと同じメソッドのノードと開始ノードについても、重要呼び出しとしてさらにマークされる(以上、ステップS2−5)。
次に、図7で説明したように、すべての「重要呼び出し」にユニークなモデル番号が付与される(ステップS2−6)。
次に、図8で説明したように、各モデル番号毎に、メソッド呼び出し回数毎のメソッド開始から完了までの平均の残り時間が計算され、モデル表206に登録される(ステップS2−7)。
最後に、図9で説明したように、メソッド毎に、モデル番号間の遷移関係が取得され、モデル番号遷移表207に書き込まれる(ステップS2−8)。
次に、ステップS3−1とS3−2は、図2の処理種別動的判断コード挿入部208の機能に対応する処理である。
まず、図11で説明したように、モデル番号遷移表207に基づいて、Webアプリコード201中の各モデル番号に対応する各メソッドのプログラムコードの先頭に、モデル番号を判別し更新するためのモデル判別コードが自動生成されて埋め込まれる(ステップS3−1)。
そして、図10で説明したように、トップレベルルーチンのスレッドの先頭に、スレッド開始時に図3のスレッドローカル変数テーブル302を確保する処理、スレッド終了時にスレッドローカル変数テーブル302を開放するプログラムコードが埋め込まれる(ステップS3−2)。
図13は、図12のステップS1の処理の説明図である。いま、オリジナルコードであるWebアプリコード201として、図13に示されるプログラムコードがあるとする。
このプログラムコードでは、例えばメソッドAのプログラムコードmethodA内で、もし変数flagの値が真(=T)が偽かで処理が別れる。変数flagの値が真(=T)ならば(「if(flag==T」)、メソッドBのプログラムコードmethodB、続いて同じくmethodB、その後、メソッドCのプログラムコードmethodCが実行される。これは、図4で前述したメソッド呼び出しシーケンス「A−B−B−C−D」のうちの「A−B−B−C」のシーケンス部分に対応する。変数flagの値が真(=T)ならば(「」else{」)、methodB、続いてメソッドEのプログラムコードmethodEが実行される。これは、図4で前述したメソッド呼び出しシーケンス「A−B−E」に対応する。更に、メソッドCのプログラムコードmethodCでは、その中でメソッドDnoプログラムコードmethodDが実行される。これは、図4で前述したメソッド呼び出しシーケンス「A−B−B−C−D」のうちの「C−D」のシーケンス部分に対応する。
図2の実行履歴取得コード変換部202は、上述のWebアプリコード201内の各メソッドのプログラムコードの先頭に、実行履歴204を取得するためのプログラムコードを埋め込み、実行履歴取得Webアプリコード203に変換する。この実行履歴取得Webアプリコード203は、例えばJavaassistなどと呼ばれるバイトコード変換プログラムを使用し、処理スレッドID、実行開始/実行終了の別、メソッド名、時刻などを実行履歴204として記録する。図13の例では、16:10:10(16時10分10秒)に、スレッドID=1のmethodAが実行を開始した。次に、16:10:16に、スレッドID=1のmethodBが実行を開始した。次に、16:10:17に、スレッドID=1のmethodBが実行を終了した。次に、16:10:17に、スレッドID=1のmethodBが実行を開始した。次に、16:10:18に、スレッドID=1のmethodBが実行を終了した。次に、16:10:18に、スレッドID=1のmethodCが実行を開始した。次に、16:10:19に、スレッドID=1のmethodDが実行を開始した。次に、16:10:19に、スレッドID=1のmethodDが実行を終了した。次に、16:10:20に、スレッドID=1のmethodCが実行を終了した。そして、16:10:20に、スレッドID=1のmethodAが実行を終了した。一方、16:20:00に、スレッドID=2のmethodAが実行を開始した。次に、16:20:02に、スレッドID=2のmethodBが実行を開始した。次に、16:20:03に、スレッドID=2のmethodBが実行を終了した。次に、16:20:05に、スレッドID=2のmethodEが実行を開始した。次に、16:20:06に、スレッドID=2のmethodEが実行を終了した。最後に、16:20:07に、スレッドID=1のmethodAが実行を終了した。
図14は、図12のステップS2−1の処理の説明図である。ここでは、リクエスト毎すなわちスレッドID(リクエストID)毎に、図13に示されるように得られた実行履歴204が、例えば図14の実行履歴1401および1402として示されるように分割される。
図15は、図12のステップS2−2の処理の説明図である。ここでは、図14のように分割された実行履歴1401および1402のそれぞれにおいて、最後のメソッドの終了時刻から各メソッドの開始時刻が減算される。この結果、各スレッドID(リクエストID)毎の各メソッドについて、各メソッドの開始からスレッドが完了するまでの残り時間が計算され、図15の残り時間リスト1501または1502に示されるように得られる。図15の残り時間リスト1501は、methodA、B、B、C、Dのそれぞれについて、残り時間10秒、4秒、3秒、2秒、1秒が算出される。図15の残り時間リスト1502は、methodA、B、Eのそれぞれについて、残り時間7秒、5秒、1秒が算出される。
図16は、図12のステップS2−2の詳細処理を示すフローチャートである。ここでは、図14のスレッドID=1の実行履歴1401から図15のスレッドID=1に対応する残り時間リスト1501を算出する処理を例にとり説明する。
まず、メモリ上の変数ENDに、同一スレッドIDの実行履歴の中で最も遅い時刻が代入される(ステップS1601)。図16に示される実行履歴1401の入力例では、16:10:20の時刻が変数ENDに代入される。
次に、同一スレッドIDの実行履歴のうち、実行開始/実行終了の別として実行開始を示す「始」が記憶されている履歴だけが選択されて、それらの選択された履歴がリストとしてメモリ上の変数Lに代入される。(ステップS1602)。図16に示される実行履歴1401の入力例では、以下の履歴群が変数Lにリストとして代入される。(methodA、16:10:10)、(methodB、16:10:16)、(methodB、16:10:17)、(methodC、16:10:18)、(methodD、16:10:19)である。
次に、変数Lの残りの内容(リスト)が空になったか否かが判定される(ステップS1603)。
変数Lの内容(リスト)が空にならない限り、ステップS1603の判定がNoとなり、変数Lから履歴が1組ずつ取り出されながら、以下のステップS1604からS1606までの処理が繰り返し実行される。
まず、変数Lからもっとも古い(時間が早い)履歴が取り出されて、メモリ上の変数Mに代入される(ステップS1604)。図16に示される実行履歴1401の入力例では、まず第1番目として(methodA、16:10:10)が変数Mに代入される。
次に、変数Mの時刻と変数ENDの時刻との差が計算され、メモリ上のdiffに代入される(ステップS1605)。上述の第1番目の例では、変数Mの時刻「16:10:10」と変数ENDの時刻16:10:20」との差=10秒が変数diffに代入される。
そして、変数Mのメソッド名と変数diffの内容が残り時間の残り時間リスト1501に出力される。上述の第1番目の例では、(methodA、10秒)が残り時間リスト1501に出力される。
次に、変数Lにはまだリストが残っているため、ステップS1603の判定がNoになる。この結果、第2番目として、ステップS1604で(methodB、16:10:16)が取り出されて変数Mに代入され、ステップ1605で時刻16:10:16と16:10:20の差=4秒が計算されて変数diffに他移入される。そして、ステップS1606で(methodB、4秒)が残り時間リスト1501に出力される。
次に、変数Lにはまだリストが残っているため、ステップS1603の判定がNoになる。この結果、第3番目として、ステップS1604で(methodB、16:10:17)が取り出されて変数Mに代入され、ステップ1605で時刻16:10:17と16:10:20の差=3秒が計算されて変数diffに他移入される。そして、ステップS1606で(methodB、3秒)が残り時間リスト1501に出力される。
次に、変数Lにはまだリストが残っているため、ステップS1603の判定がNoになる。この結果、第4番目として、ステップS1604で(methodC、16:10:18)が取り出されて変数Mに代入され、ステップ1605で時刻16:10:18と16:10:20の差=2秒が計算されて変数diffに他移入される。そして、ステップS1606で(methodC、2秒)が残り時間リスト1501に出力される。
さらに、変数Lにはまだリストが残っているため、ステップS1603の判定がNoになる。この結果、第5番目として、ステップS1604で(methodD、16:10:19)が取り出されて変数Mに代入され、ステップ1605で時刻16:10:19と16:10:20の差=1秒が計算されて変数diffに他移入される。そして、ステップS1606で(methodD、1秒)が残り時間リスト1501に出力される。
その後、変数Lにはもうリストが残っていないため、ステップS1603の判定がYesとなって、図12のステップS2−2の処理を終了する。なお、他のスレッドID(例えば図14、図15のスレッドID=2の実行履歴1402と残り時間リスト1502)についても、同様の処理が実行される。
以上のようにして得られたスレッドID毎の残り時間リスト1501、1502等を使って、図12のステップS2−3で、メソッドシーケンス表401が作成される。ここでは、まず、1つの残り時間リスト、例えば図15の1501が参照されることにより、メソッド列A−B−B−C−Dが抽出され、図4のメソッドシーケンス表401の1つのエントリの「メソッドシーケンス」項目に登録される。次に、メソッドシーケンス表401の上記エントリの「出現回数」項目に1が登録される。さらに、メソッドシーケンス表401の上記エントリの1から5までの各メソッド呼び出し回数の残り時間の項目に、例えば残り時間リスト1501中の残り時間列10秒、4秒、3秒、2秒、1秒がそれぞれ登録される。残り時間リストとして、上記メソッド呼び出しシーケンス「A−B−B−C−D」と同じ残り時間リストが得られていたら、メソッドシーケンス表401の上記エントリの「出現回数」項目の内容がインクリメントされる。また、上記エントリの1から5までの各メソッド呼び出し回数の残り時間の項目には、得られている出現回数分の各メソッド呼び出し回数毎の残り時間の平均値が計算されて登録される。他の残り時間リスト、例えば1502については、メソッドシーケンス表401に別のメソッド呼び出しシーケンス「A−B−E」のためのエントリが作成されて、上記と同様に残り時間が登録されてゆく。
図17は、図12のステップS2−4の詳細処理を示すフローチャートである。ここでは、処理種別分化木501が作成される。この処理の詳細について、図18(a)〜図18(f)の説明図を用いながら説明する。
まず、図4に示すようにしてメソッドシーケンス表401に得られている全メソッド呼び出しシーケンスが、1つのグループとされる。具体的には例えば、グループの情報を保持するメモリ上のリスト変数群にメソッド呼び出しシーケンスの文字列が格納される。図4のメソッドシーケンス表401の例では、図18(a)に示されるように、メソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」がグループとされる。また、図18(a)に示されるように、処理種別分化木501の処理階層を示すメモリ上の変数Nに値1が代入される。続いて、変数Nの最大長を保持するメモリ上の変数MAXNに、メソッドシーケンス表401に登録されているメソッド呼び出しシーケンスのうちの最大メソッド長が登録される。図4のメソッドシーケンス表401の例では、メソッド呼び出しシーケンス「A−B−B−C−D」が最も長くメソッド数は5である。従って、変数MAXN=5とされる。さらに、図18(a)に示されるように、文字列‘ROOT’がグループの木のルートノードとして登録される。この木のデータは例えば、メモリ上のリスト変数列として保持される。(以上、図17のステップS1701)。
次に、Nの値がMAXN以下であるか否かが判定される(図17のステップS1702)。
Nの値がMAXN以下でステップS1702の判定がYesならば、次の一連の処理が実行される。
まず、グループ内のメソッド呼び出しシーケンス毎に、N番目のメソッド名で、それ以下の部分シーケンスがサブグループ分けされる(図17のステップS1704)。このサブグループの情報は例えば、メモリ上のリスト変数群を使って保持される。図18(a)の初期状態の例では、メソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」のN=1番目のメソッド名「A」を先頭にして、部分シーケンス「A−B−B−C−D」と「A−B−E」を含む1つのサブグループができる。
次に、各サブグループの先頭メソッドが、それぞれのサブグループのルートノードに設定される(図17のステップS1705)。図18(b)の状態では、部分シーケンス「A−B−B−C−D」と「A−B−E」とからなるサブグループの先頭メソッド「A」が、そのサブグループのルートノードに設定される。
次に、各サブグループのルートノードが、現在のグループの木の末端ノードの子ノードとして登録される(図17のステップS1706)。図18(b)の状態では、現在のグループの木のルートノード‘ROOT’(図18(a)参照)に、上記1つのサブグループのルートノード「A」が子ノードとして登録される。この結果、図18(b)に示されるように、グループの木は「ROOT−A」となる。
次に、新たなグループとして、上記サブグループの先頭ノード以外の部分シーケンスが含まれる全てのメソッド呼び出しシーケンスが登録され、変数Nの値が+1される(図17のステップS1707)。図18(b)の状態では、先頭ノード「A」以外の部分シーケンス「B−B−C−D」と「B−E」を含むメソッド呼び出しシーケンス部分シーケンス「A−B−B−C−D」と「A−B−E」が新たなグループとされる。また、変数N=2となる。
次に、再びNの値がMAXN以下であるか否かが判定される(図17のステップS1702)。図18(b)の状態では、N=2であるため、ステップS1702の判定がYesとなり、再びステップS1704からS1707の一連の処理が実行される。図18(b)の状態から図18(c)の状態の変化は、次のようになる。まず、図18(b)の状態の例では、グループ中のメソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」のN=2番目のメソッド名「B」を先頭にして、部分シーケンス「B−B−C−D」と「B−E」を含む1つのサブグループができる。次に、図18(b)の状態で、部分シーケンス「B−B−C−D」と「B−E」とからなるサブグループの先頭メソッド「B」が、そのサブグループのルートノードに設定される。次に、図18(b)の状態で、現在のグループの木の末端ノード‘A’(図18(b)参照)に、上記1つのサブグループのルートノード「B」が子ノードとして登録される。この結果、図18(c)に示されるように、グループの木は「ROOT−A−B」となる。そして、図18(c)の状態で、先頭ノード「B」以外の部分シーケンス「B−C−D」と「E」を含むメソッド呼び出しシーケンス部分シーケンス「A−B−B−C−D」と「A−B−E」が新たなグループとされ、変数N=3となる。
処理が進み、図18(c)の状態では、N=3であるため、ステップS1702の判定がYesとなり、再びステップS1704からS1707の一連の処理が実行される。図18(c)の状態から図18(d)の状態の変化は、次のようになる。まず、図18(c)の状態の例では、グループ中のメソッド呼び出しシーケンス「A−B−B−C−D」と「A−B−E」のN=3番目のメソッド名「B」と「E」をそれぞれ先頭にして、2つのサブグループができる。それらは、部分シーケンス「B−C−D」を含むサブグループと、「E」を含むサブグループである。次に、図18(d)の状態で、部分シーケンス「B−C−D」からなるサブグループの先頭メソッド「B」が、そのサブグループのルートノードに設定される。また、部分シーケンス「E」からなるサブグループの先頭メソッド「E」が、そのサブグループのルートノードに設定される。次に、図18(d)の状態で、現在のグループの木の末端ノード‘B’(図18(c)参照)に、上記2つのサブグループの各ルートノード「B」と「E」が子ノードとして登録される。この結果、図18(d)に示されるように、グループの木は「ROOT−A−B−(BまたはE)」となる。そして、図18(d)の状態で、先頭ノード以外の部分シーケンス「C−D」を含むメソッド呼び出しシーケンス部分シーケンス「A−B−B−C−D」が新たなグループとされ、変数N=4となる。
処理が進み、図18(d)の状態では、N=4であるため、ステップS1702の判定がYesとなり、再びステップS1704からS1707の一連の処理が実行される。図18(d)の状態から図18(e)の状態の変化は、次のようになる。まず、図18(d)の状態の例では、グループ中のメソッド呼び出しシーケンス「A−B−B−C−D」のN=4番目のメソッド名「C」を先頭にして、1つのサブグループ「C−D」ができる。次に、図18(e)の状態で、部分シーケンス「C−D」からなるサブグループの先頭メソッド「C」が、そのサブグループのルートノードに設定される。次に、図18(e)の状態で、現在のグループの木の末端ノードに、上記サブグループのルートノードが子ノードとして登録される。いま、現在のグループの木の末端ノードは、図18(d)に示されるように、‘B’または‘E’の2つがある。これらのうち、上記サブグループの部分シーケンス「C−D」が含まれるグループ内のメソッド呼び出しシーケンス「A−B−B−C−D」において、そのサブグループのルートノード「C」の1つ親のノード「B」が選択される。この結果、図18(e)に示されるように、グループの木は「ROOT−A−B−(B−CまたはE)」となる。そして、図18(e)の状態で、先頭ノード以外の部分シーケンス「D」を含むメソッド呼び出しシーケンス部分シーケンス「A−B−B−C−D」が新たなグループとされ、変数N=5となる。 さらに処理が進み、図18(e)の状態では、N=5であるため、ステップS1702の判定がYesとなり、再びステップS1704からS1707の一連の処理が実行される。図18(e)の状態から図18(f)の状態の変化は、次のようになる。まず、図18(e)の状態の例では、グループ中のメソッド呼び出しシーケンス「A−B−B−C−D」のN=5番目のメソッド名「d」を先頭にして、1つのサブグループ「D」ができる。次に、図18(f)の状態で、部分シーケンス「D」からなるサブグループの先頭メソッド「D」が、そのサブグループのルートノードに設定される。次に、図18(f)の状態で、現在のグループの木の末端ノードに、上記サブグループのルートノードが子ノードとして登録される。いま、現在のグループの木の末端ノードは、図18(e)に示されるように、‘C’または‘E’の2つがある。これらのうち、上記サブグループの部分シーケンス「D」が含まれるグループ内のメソッド呼び出しシーケンス「A−B−B−C−D」において、そのサブグループのルートノード「D」の1つ親のノード「C」が選択される。この結果、図18(f)に示されるように、グループの木は「ROOT−A−B−(B−C−DまたはE)」となる。そして、図18(f)の状態で、先頭ノード以外の部分シーケンスを含むメソッド呼び出しシーケンス部分シーケンスはもうなくなり、変数N=6となる。
最後に、図18(f)の状態では、N=6>MAXN=5となるため、ステップS1702の判定がNoとなる。この結果、図18(f)で得られている‘ROOT’を始点としたグループの木「ROOT−A−B−(B−C−DまたはE)」が出力される。これは、図4のメソッドシーケンス表401に対応する図5の処理種別分化木501の構造に一致する。なお、図5の処理種別分化木501では、ルートノードは「A」の1つだけであるためその上位のルートノード‘ROOT’は省略されているが、ルートノードが複数ある場合には、根ノード‘ROOT’が残される。
以上のようにして、図12のステップS2−4において、処理種別分化木501が作成される。
次に、図12のステップS2−7の詳細処理について説明する。ここでは前述したように、図8で説明したように、各モデル番号毎に、メソッド呼び出し回数毎のメソッド開始から完了までの平均の残り時間が計算され、モデル表206に登録される。このために、メモリ上に、図19(a)に示されるようなデータ構造を有する平均時間計算用テーブル1901が作成される。この平均時間計算用テーブル1901の構造は、Method名と直前モデル番号の項目以外は、図8に示されるモデル表206のデータ構造と同じである。すなわち、平均時間計算用テーブル1901は、図12のステップS2−6で決定されたモデル番号に対応する行毎に、図4のメソッドシーケンス表401中の最長シーケンスに対応するメソッド呼び出し回数分の各項目値を保持する。これらの項目値としては、各モデル番号毎の各メソッド呼び出し回数の残り時間の累算値が登録されてゆく。それらの項目値の初期状態は、図19(a)に示されるように、全て「0」である。残り時間の累算が全て終了した状態では、平均時間計算用テーブル1901には、例えば図19(b)に示されるように、「85、45、20、10、5」「50、20、15、10、5」「35、25、5、0、0」といった残り時間の累算値が得られる。また、平均時間計算用テーブル1901の各行には、累算された回数を示す出現頻度の値が登録される。この初期値は、図19(a)に示されるように、「0」である。累算終了後の図19(b)の例では、モデル番号1、2、3、4毎の各出現頻度は、例えば「10」「10」「5」「5」となる。累算終了時に図19(b)の例のようにして得られた各モデル番号および各メソッド呼び出し時毎の残り時間の累算値が、各モデル番号毎の出現頻度で除算されることにより各残り時間の平均値が計算される。この結果、前述した図8に例示されるモデル表206が得られる。
図20は、以上のモデル表206の算出処理を示す図12のS2−7の詳細処理を示すフローチャートである。この処理について、図21および図22の説明図を用いながら説明する。
まず、メモリ上に、図19(a)に示される初期状態の平均時間計算用テーブル1901が作成される(図20のステップS2001)。
次に、メモリ上の配列変数Sに、図4のようにしてメソッドシーケンス表401に得られている各メソッド呼び出しシーケンスの文字列が格納される(図20のステップS2002)。
次に、配列変数Sが空集合になったか否かが判定される(ステップS2003)。
配列変数Sが空集合になっておらずステップS2003の判定がNoならば、配列変数Sから、1つのメソッド呼び出しシーケンスの文字列が取り出されて、その内容がメモリ上の変数Aに格納される(ステップS2004)。例えば、配列変数Sから、図21の2101で示されるメソッドシーケンス表401中のメソッド呼び出しシーケンスの文字列が読み出されて、変数Aに格納される。
次に、変数Aに格納されたメソッド呼び出しシーケンスの文字列が、図12のステップS2−6で決定された処理種別分化木501上のモデル番号に照合される。この結果、変数Aのメソッド呼び出しシーケンスに適合するモデル番号群が探索され、それらの番号列がメモリ上の配列変数Mに格納される(図20のステップS2005)。図21の例では、メソッド呼び出しシーケンス2101で処理種別分化木501が照合された結果、モデル番号1、2、3が適合する。
次に、平均時間計算用テーブル1901上で、配列変数Mに含まれている各モデル番号に対応する各行の出現頻度項目に、メソッドシーケンス表401上の変数Aのメソッド呼び出しシーケンスに対応する行の出現回数項目の値が加算される。図21の例では、平均時間計算用テーブル1901上の図21の2102として示されるモデル番号1、2、3に対応する各行の各出現頻度項目に、メソッド呼び出しシーケンス2101の出現回数=1が加算される(以上、図20のステップS2006)。
そして、平均時間計算用テーブル1901上で、配列変数Mに含まれている各モデル番号に対応する各行の各メソッド呼び出し回数項目に、次の各値が加算される。メソッドシーケンス表401上の変数Aのメソッド呼び出しシーケンスに対応する行の各メソッド呼出し回数項目の値に、同じ各行の出現回数項目の値がそれぞれ乗算され、各乗算結果が加算される。図21の例では、メソッドシーケンス表401上のメソッド呼び出しシーケンス2101に対応する行の各メソッド呼び出し回数項目の値「10」「4」「3」「2」「1」にそれぞれ出現回数=1が乗算される。そして、各乗算結果「10」「4」「3」「2」「1」が、図21の2102として示されるモデル番号1、2、3の各行の各メソッド呼び出し回数項目に加算される。
その後、ステップS2003に戻り、配列変数Sが空集合になったか否かが判定される(ステップS2003)。図4のメソッドシーケンス表401の例では、配列変数Sには、まだメソッド呼び出しシーケンス「A−B−E」が残っている。この結果、ステップS2003の判定がNoになり、ステップS2004からS2007の一連の処理が再び実行される。その例は、図22に示される。例えば、配列変数Sから、図22の2201で示されるメソッドシーケンス表401中のメソッド呼び出しシーケンスの文字列が読み出されて、変数Aに格納される。次に、メソッド呼び出しシーケンス2101で処理種別分化木501が照合された結果、モデル番号1、2、4が適合する。次に、平均時間計算用テーブル1901上の図22の2102および2103として示されるモデル番号1、2、4に対応する各行の各出現頻度項目に、メソッド呼び出しシーケンス2201の出現回数=1が加算される。次に、メソッドシーケンス表401上のメソッド呼び出しシーケンス2201に対応する行の各メソッド呼び出し回数項目の値「1」「7」「5」「1」にそれぞれ出現回数=1が乗算される。そして、各乗算結果「1」「7」「5」「1」が、図22の2202および2203として示されるモデル番号1、2、4の各行の各メソッド呼び出し回数項目に加算される。その後、ステップS2003に戻り、配列変数Sが空集合になったか否かが判定される。
図4のメソッドシーケンス表401の例では、配列変数Sには、メソッド呼び出しシーケンスは残っていないため、ステップS2003の判定は、Yesとなる。この結果、平均時間計算用テーブル1901上の全てのモデル番号に対応する行について、各メソッド呼び出し回数毎の残り時間の累算値が出現頻度で除算され残り時間の平均値が算出される(ステップS2008)。そして、各残り時間の平均値が、図8のモデル表206に反映される(ステップS2009)。図22の平均時間計算用テーブル1901から、図8のモデル表206が生成されることになる。
図23は、図12のステップS2−8の詳細処理を示すフローチャートである。ここでは、図9で説明したように、メソッド毎に、モデル番号間の遷移関係が取得され、モデル番号遷移表207に書き込まれる。 まず、モデル表206中の「Method名」項目から、全てのメソッド名が抽出され、メモリ上の配列変数Mに格納される(図23のステップS2301)。図8のモデル表206の例では、配列変数Mに、メソッド名「A」「B」「E」が格納される。
次に、配列変数Mから全てのメソッド名が取り出されてその内容が空になったか否かが判定される(図23のステップS2302)。
配列変数Mにまだメソッド名が残っておりステップS2302の判定がNoならば、配列変数Mから1つのメソッド名が取り出され、メモリ上の変数mに格納される(図23のステップS2303)。図8のモデル表206の例では、例えばメソッド名「A」が変数mに格納される。
次に、図8のモデル表206において、「Method名」項目が変数mのメソッド名に等しい各行が選択される。そして、選択された各行において、次のような遷移関係のペアが生成される(図23のステップS2304)。
(「直前モデル番号」項目の値)→(「モデル番号」項目の値)
例えば、図8のモデル表206の例では、「Method名」項目の値「A」であるモデル番号=1の行について、「*→1」というペアが生成される。なお、「*」はモデル番号が無いことを示している。
そして、メモリ上にモデル番号遷移表207が生成される。次に、変数mのメソッド名に対応する行のエントリがなければ、そのエントリが生成されて「メソッド」項目に変数mのメソッド名が格納される。そして、その行のエントリの「モデル番号遷移項目」に、ステップS2304で生成された遷移関係が格納される(以上、図23のステップS2305)。図8のモデル表206の例において、変数m=Aであるとき、図9に示される1行目の行のエントリが生成される。
その後、ステップS2302に戻り、配列変数Mが空集合か否かが判定される。図8のモデル表206の例で、メソッドAが処理された段階では、配列変数MにはまだメソッドB、Eが残っている。この結果、ステップS2302の判定がNoとなって、ステップS2303からステップS2305までの一連の処理が再び実行される。図8のモデル表206の例では、例えば2番目のメソッド名「B」が変数mに格納される。次に、「Method名」項目の値「B」であるモデル番号=2、3の各行について、「1→2」および「2→3」という各ペアが生成される。そして、モデル番号遷移表207上で、図9に示される2行目の行のエントリが生成される。
その後、ステップS2302に戻り、配列変数Mが空集合か否かが判定される。図8のモデル表206の例で、2番目のメソッドBが処理された段階では、配列変数MにはまだメソッドEが残っている。この結果、ステップS2302の判定がNoとなって、ステップS2303からステップS2305までの一連の処理が再び実行される。図8のモデル表206の例では、例えば3番目のメソッド名「E」が変数mに格納される。次に、「Method名」項目の値「E」であるモデル番号=4の行について、「2→4」というペアが生成される。そして、モデル番号遷移表207上で、図9に示される3行目の行のエントリが生成される。
図24は、第2の実施形態のシステム構成図であり、図1のサーバコンピュータ102上で動作する。図24において、図2の第1の実施形態のシステム構成の場合と同じ番号が付された部分は同じ機能を有する。図24の第2の実施形態のシステム構成が図2の第1の実施形態のシステム構成と異なる部分は、メソッド呼び出し回数カウントコード挿入部2401である。
メソッド呼び出し回数カウントコード挿入部2401は、処理種別を動的に判断するWebアプリコード209に対して、さらに現在実行中のスレッドにおいてメソッド呼び出し回数をカウントするためのコードを挿入する。この結果、残り時間算出が可能なWebアプリコード2402を出力する。
第1の実施形態において説明したように、各スレッドに対応してメモリ上に確保されるスレッドローカル変数テーブル302には、図3に示されるように、第1の実施形態において更新されるMOEDLID変数のほかに、NCALL変数も含まれる。メソッド呼び出し回数カウントコード挿入部2401は、メソッドが呼び出されるたびに、このNCALL値をインクリメントするように動作する。
具体的には、メソッド呼び出し回数カウントコード挿入部2401は、処理種別を動的に判断するWebアプリコード209中の各メソッドのプログラムコードの先頭に、NCALL値をインクリメントするためのコードを自動生成して埋め込む。
図25は、第2の実施形態におけるメソッド呼び出し回数カウントコード挿入部の説明図である。図25において、例えばメソッドAのプログラムコード2501は、第1の実施形態で生成された処理種別を動的に判断するWebアプリコード209の一部である。メソッド呼び出し回数カウントコード挿入部2401は、プログラムコード2501において、NCALL値をインクリメントするコード「NCALL++;」を埋めこむことにより、プログラムコード2502に変換する。ここで「NCALL++;」は各プログラムコードの先頭に挿入するそのメソッドが呼ばれる回数を表現するが、メソッドのローカル変数ではなく、メソッドのグローバル変数である。このプログラムコード2502が、図24の残り時間算出が可能なWebアプリコード2402として出力される。この残り時間算出が可能なWebアプリコード2402がスレッド上で実行された場合、プログラムコード「NCALL++;」により、現在のスレッドに対応する図3のスレッドローカル変数テーブル302上のNCALL値が読み出される。そして、その値が+1され、その結果がスレッドローカル変数テーブル302上のNCALL値として書き戻される。
これにより、スレッド上で、メソッドが実行される毎に、スレッドローカル変数テーブル302上のNCALL値がインクリメントされる。
つまり、図24の第2の実施形態のシステムにおいて、Webアプリコード201の代わりに残り時間算出が可能なWebアプリコード2402が実行されることにより、次のような処理が実現される。まず、第1の実施形態と同様に、スレッドローカル変数テーブル302上のMOEDLID値として、対応するスレッドにおける現在の処理種別を判別することが可能となる。さらに、スレッドローカル変数テーブル302上のNCALL値として、対応するスレッドにおいて現時点におけるメソッド呼び出し回数を判別することが可能となる。
このようにして、実行中の各スレッドに対応する図3のスレッドローカル変数テーブル302上で、第2の実施形態によりインクリメントされるNCALL値と、第1の実施形態により更新されるMOEDLID値を用いることにより、スレッドの残り時間の算出が可能となる。
図26は、第3の実施形態のシステム構成図である。このシステムは、図1のクライアントコンピュータ101からリクエストIDを指定して残り時間の問合せ要求に対して、残り時間を応答することができるシステムである。このシステムは、上述の第2の実施形態の処理(第1の実施形態の処理を含む)を利用することにより、残り時間を応答する。
第3の実施形態のシステムは、図1のサーバコンピュータ102上で動作する。
図26において、ユーザリクエスト処理スレッド2602は、ユーザからのリクエストに基づいて、リクエストID毎にメモリ上に生成されるスレッドである。このユーザリクエスト処理スレッド2602上で、図24の第の2実施形態により生成される残り時間算出が可能なWebアプリコード2402が実行され、そのアプリコードからユーザデータであるWebサービス処理データ2606が参照、更新される。また、ユーザリクエスト処理スレッド2602毎に、第1の実施形態において前述した図3のスレッドローカル変数テーブル302が確保される。このスレッドローカル変数テーブル302は、前述したように、各スレッドのリクエストIDとスレッドローカル変数テーブル302との対応関係を管理する図3のスレッドローカル変数管理テーブル301を介して参照される。このスレッドローカル変数管理テーブル301は、全ユーザリクエスト処理スレッド2602に対して、1つ設けられる。
第2の実施形態で説明したように、スレッド上で残り時間算出が可能なWebアプリコード2402が実行されることにより、スレッドローカル変数テーブル302上のMOEDLID値とNCALL値が更新されてゆく。
図26において、残り時間算出スレッド2601は、ユーザから、現在自分が実行中のユーザリクエスト処理スレッド2602に対する残り時間問合せ要求2604を受信したときにメモリ上に生成される。この残り時間算出スレッド2601は、例えばJava言語によるサーブレットプログラムとして実行される。残り時間算出スレッド2601は、残り時間問合せ要求2604に含まれるリクエストIDに基づいて、図3のスレッドローカル変数管理テーブル301にアクセスする。これにより、残り時間算出スレッド2601は、残り時間問合せ要求2604に対応するユーザリクエスト処理スレッド2602中のスレッドローカル変数テーブル302にアクセスし、残り時間を算出し残り時間応答2605としてユーザに応答する。 図27は、第3の実施形態における残り時間算出スレッドの処理を示すフローチャートである。
まず、進捗状況が特定される。残り時間問合せ要求2604が来たときに、現在進行中のリクエストIDに基づいて、ユーザ処理のリクエストが到着してからのメソッドが呼ばれた回数と現在の処理分類(モデル番号)が、スレッドローカル変数テーブル302から読み出される(図27のステップS2701)。
次に、残り時間が算出される。残っている処理に関する最近の平均処理時間から、残り処理時間が算出され、ユーザに残り時間応答2605が返される(図27のステップS2702)。
図28は、図27のステップS2701の詳細処理を示すフローチャートである。
まず、ユーザから残り時間問合せ要求2604を受ける。これには、リクエストIDが含まれている(図28のステップS2801)。
次に、リクエストIDから、図3のスレッドローカル変数管理テーブル301を参照し、リクエストIDに対応する図3のスレッドローカル変数テーブル302を探す(図28のステップS2802)。
次に、リクエストIDに対応する図3のスレッドローカル変数テーブル302から、MOEDLID値とNCALL値を取り出す(図28のステップS2803)。
図29は、上述のようにしてスレッドローカル変数テーブル302から取り出されたMOEDLID値とNCALL値に基づいて、残り時間を算出する処理の説明図である。図27のステップS2702では、第1または第2の実施形態において生成されているモデル表206(図2または図24)において、図28のステップS2803で取得されたMOEDLID値とNCALL値に基づいて次のような参照動作を行う。MOEDLID値に対応するモデル番号のエントリ行の、NCALL値に対応するメソッド呼び出し回数の項目に登録されている残り時間が取得され、図1のクライアントコンピュータ101に、残り時間応答2605として応答される。例えば、図29(図8)に例示されるモデル表206において、スレッドローカル変数テーブル302からMOEDLID値=4、NCALL値=3が得られたとする。この場合、モデル表206上のモデル番号=4に対応するエントリ行のメソッド呼び出し回数=3の項目に対応する残り時間=1秒が取得され、クライアントコンピュータ101に応答される。
以上のようにして、第3の実施形態により、現在実行中のスレッドに対応する処理種別とメソッド呼び出し回数をMOEDLID値およびNCALL値として自動的に取得し、それらに基づいて適切な残り時間を応答することが可能となる。
図30は、第4の実施形態のシステム構成図であり、図1のサーバコンピュータ102上で動作する。図30において、図24の第2の実施形態のシステム構成の場合と同じ番号が付された部分は同じ機能を有する。図30の第4の実施形態のシステム構成が図24の第2の実施形態のシステム構成と異なる部分は、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001である。
図3に示されるように、スレッドローカル変数管理テーブル301から参照される各スレッド毎のスレッドローカル変数テーブル302には、ENDTIME変数とMETHOD_HISTORY配列変数が記録される。ENDTIME変数は、それが含まれるスレッドローカル変数テーブル302に対応するスレッドの実行終了時刻をENDTIME値として記録する変数である。METHOD_HISTORY配列変数は、そのスレッド内で実行される一連のメソッドの各実行開始時刻列を記録する配列変数である。
そして、第4の実施形態におけるメソッド開始時刻/スレッド終了時刻記録コード挿入部3001は、残り時間更新のためのメソッド起動履歴の保存用コードの注入処理として、次のような処理を実行する。
まず、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001は、実行開始時刻をスレッドローカル変数テーブル302中のMETHOD_HISTORY配列変数に記録するプログラムコードを自動生成する。そして、自動生成したプログラムコードを、メソッド呼び出し回数カウントコード挿入部2401が生成した残り時間算出が可能なWebアプリコード2402中の全メソッドのプログラムコードに埋め込む。
また、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001メソッド開始時刻/スレッド終了時刻記録コード挿入部3001は、次のような2つのプログラムコードを自動生成する。第1のプログラムコードは、スレッドの実行終了時刻をスレッドローカル変数テーブル302中のENDTIME変数に記録する。第2のプログラムコードは、スレッドローカル変数テーブル302に記録されたMETHOD_HISTORY配列値とENDTIME値とから、スレッド内で実行される各メソッド毎の処理の残り時間を算出し、その算出に基づきモデル表206を更新する。そして、上記第1、第2のプログラムコードを、メソッド呼び出し回数カウントコード挿入部2401が生成した残り時間算出が可能なWebアプリコード2402中のスレッドの実行終了時に最後に実行されるメソッドのプログラムコードに、埋め込む。
図31は、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001によって実行される、メソッド開始時刻記録コードの注入処理の説明図である。図31において、例えばメソッドAのプログラムコード3101は、第2の実施形態で生成された残り時間算出が可能なWebアプリコード2402(図24、図30参照)の一部である。
メソッド開始時刻記録コードの注入処理では、プログラムコード3101において、メソッド呼び出しの先頭部分に、コード「T=get_timestamp();」と「push(METHOD_HISTORY,T);」が埋め込まれる。また、メソッドの末尾部分に、コード「T=get_timestamp();」と「ENDTIME=T;」が埋め込まれる。なお、コード「NCALL++;」は、メソッド呼び出し回数カウントコード挿入部2402(図30)によって挿入されたコードである。これについては、第2の実施形態で説明した(図25参照)。
メソッドの先頭部分に埋め込まれるコード「T=get_timestamp();」は、例えばメソッドAの開始時点での現在時刻を算出する関数get_timestamp()を実行し、その結果得られる現在時刻をメモリ上の変数Tに格納する。また、コード「push(METHOD_HISTORY,T);」は、現在のスレッドに対応するスレッドローカル変数テーブル302中のMETHOD_HISTORY配列変数(図3参照)の末尾に、変数Tの値を新たな配列要素として追加する。これらの2つのコードにより、例えばメソッドAの実行開始時刻が、METHOD_HISTORY配列変数値として記録される。
メソッドの末尾部分に埋め込まれるコード「T=get_timestamp();」は、例えばメソッドAの終了時点での現在時刻を算出する関数get_timestamp()を実行し、その結果得られる現在時刻をメモリ上の変数Tに格納する。また、コード「ENDTIME=T;」は、現在のスレッドに対応するスレッドローカル変数テーブル302中のENDTIME変数(図3参照)に、変数Tの値を格納する。これらの2つのコードにより、例えばメソッドAの終了時刻=現時点でのスレッドの終了時刻が、ENDTIME値として記録される。
以上のようにして、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001は、例えばメソッドAのプログラムコード3101をプログラムコード3102に変換する。そして、このようにして変換して得たプログラムコード3102を、新たな残り時間算出が可能なWebアプリコード3002(図30)の一部として出力する。
図32は、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001によって実行される、スレッド終了時刻記録コードの注入処理の説明図である。図32において、例えば図10と同様の「doGet()」メソッドのプログラムコード3201は、第2の実施形態で生成された残り時間算出が可能なWebアプリコード2402(図24、図30参照)の一部である。なお、図10において説明したように例えば、「doGet()」メソッドの代わりに「doPost()」メソッドであってもよい。これらのメソッドは、図10で説明しように、図1のクライアントコンピュータ101からリクエストIDを有するリクエストが受信されたときに最初に実行されるメソッドである。
メソッド開始時刻記録コードの注入処理では、プログラムコード3201の末尾部分に、スレッドローカル変数テーブル302中のENDTIME変数の値を同じくMETHOD_HISTORY配列変数の新たな要素として追加するコードが埋め込まれる。また、プログラムコード3201の末尾部分に、スレッドローカル変数テーブル302中のMETHOD_HISTORY配列変数の情報をモデル表206に反映させる処理を実行するコードが埋め込まれる。
このようにして、メソッド開始時刻/スレッド終了時刻記録コード挿入部3001は、例えば「doGet()」メソッドのプログラムコード3201をプログラムコード3202に変換する。そして、このようにして変換して得たプログラムコード3202を、新たな残り時間算出が可能なWebアプリコード3002(図30)の一部として出力する。
なお、プログラムコード3201の先頭部分に埋め込まれるリクエストIDを生成するコードと、スレッドローカル変数領域を確保するコードは、処理種別動的判断コード挿入部208(図30)によって挿入されたコードである。プログラムコード3201の末尾部分に埋め込まれるスレッドローカル変数領域を解放するコードも、処理種別動的判断コード挿入部208によって挿入されたコードである。これについては、第1の実施形態で説明した(図10参照)。
図33および図34は、図32のプログラムコード3202によって実行される、METHOD_HISTORYの情報をモデル表206へ反映させる処理の説明図である。
この処理では、図19で説明したのと同様のメモリ上に作成される平均時間計算用テーブル1901が使用される。まず、例えば図8に示されるようにメモリ上に得られているモデル表206の登録内容のうち、各モデル番号の行毎のモデル番号とMethod名と各メソッド呼び出し回数毎の平均残り時間のデータが、平均時間計算用テーブル1901にコピーされる。そして、平均時間計算用テーブル1901の各モデル番号に対応する各行の出現頻度項目の値が1にセットされる。
次に、現在のスレッドでの各メソッドの実行の結果、例えばメソッド呼び出しシーケンス「A−B−B−C−D」が実行されたとする。また、スレッドローカル変数テーブル302(図3)中のMOEDLID値は、最後(3番目)に実行された重要呼び出しのモデル番号に対応する値3となったとする。さらに、図31のプログラムコード3102により、スレッドローカル変数テーブル302中のMETHOD_HISTORY配列値として例えば、「100000」「100008」「100015」「100023」「100025」が得られたとする。「100000」は最初に実行されたメソッドAの実行開始時刻である。「100008」は2番目に実行されたメソッドBの実行開始時刻である。「100015」は3番目に実行されたメソッドBの実行開始時刻である。「100023」は4番目に実行されたメソッドCの実行開始時刻である。「100025」は最後に実行されたメソッドDの実行開始時刻である。また、図32のプログラムコード3102により、METHOD_HISTORYの最後の配列値として例えば、「100030」が得られたとする。この「100030」は、最後にメソッドDが実行された時点でスレッドローカル変数テーブル302中のENDTIME値として得られた、メソッドDの実行終了時刻、すなわちスレッドの実行終了時刻である。
次に、METHOD_HISTORY配列値として得られたスレッドの終了時刻「100030」から各メソッドの各実行開始時刻「100000」「100008」「100015」「100023」「100025」が減算される。これにより、各メソッドの実行開始時の残り時間が、「30」「22」「15」「7」「5」秒というように計算される。
次に、今回実行されたメソッド呼び出しシーケンスの各メソッド名が、例えば図7のようにして得られている処理種別分化木501上のモデル番号に照合される。この結果、今回実行されたメソッド呼び出しシーケンスに適合するモデル番号群が探索される。図34の例では、メソッド呼び出しシーケンス「A−B−B−C−D」で図7の処理種別分化木501上の各モデル番号が照合された結果、モデル番号1、2、3が適合する。
次に、平均時間計算用テーブル1901上で、上記適合した各モデル番号に対応する各行の出現頻度項目の値が+1ずつインクリメントされる。図34の例では、平均時間計算用テーブル1901上の上記適合したモデル番号1、2、3に対応する各行の各出現頻度項目の値が、全て2になる。
そして、平均時間計算用テーブル1901上で、上記適合した各モデル番号に対応する各行の各メソッド呼び出し回数項目毎の各平均残り時間に、今回計算された各メソッド毎の残り時間が加算される。例えば、モデル番号=1に対応するメソッド呼び出し回数1〜5に対応する各平均残り時間「8.5」「4.5」「2」「1」「0.5」(図30)に、今回計算された各メソッド毎の残り時間「30」「22」「15」「7」「5」(図34)が加算される。この結果、平均時間計算用テーブル1901上のモデル番号=1に対応する各メソッド呼び出し回数項目毎の残り時間加算値は、図34に例示されるように、「38.5」「26.5」「17」「8」「5.5」となる。モデル番号=2の場合も、モデル番号=1の場合と同じ計算結果となる。さらに、モデル番号=3に対応するメソッド呼び出し回数1〜5に対応する各平均残り時間「10」「4」「3」「2」「1」(図30)に、今回計算された各メソッド毎の残り時間「30」「22」「15」「7」「5」(図34)が加算される。この結果、平均時間計算用テーブル1901上のモデル番号=1に対応する各メソッド呼び出し回数項目毎の残り時間加算値は、図34に例示されるように、「40」「26」「18」「9」「6」となる。
このようにして、平均時間計算用テーブル1901の内容が更新された後、平均時間計算用テーブル1901上の全てのモデル番号に対応する行で、各メソッド呼び出し回数毎の残り時間の累算値が出現頻度で除算され残り時間の平均値が算出される。そして、平均時間計算用テーブル1901に得られた各行の各メソッド呼び出し回数毎の残り時間の平均値が、モデル表206の各行の各メソッド呼び出し回数項目に書き戻される。
以上のようにして、第4の実施形態により、新たに実行された各メソッド毎のスレッドの終了までの残り時間の情報を、モデル表206に反映させることが可能となる。
図35は、上記システムをソフトウェア処理として実現できるコンピュータのハードウェア構成の一例を示す図である。
図35に示されるコンピュータは、CPU3501、メモリ3502、入力装置3503、出力装置3504、外部記憶装置3505、可搬記録媒体3509が挿入される可搬記録媒体駆動装置3506、及び通信インタフェース3507を有し、これらがバス3508によって相互に接続された構成を有する。同図に示される構成は上記システムを実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
CPU3501は、当該コンピュータ全体の制御を行う。メモリ3502は、プログラムの実行、データ更新等の際に、外部記憶装置3505(或いは可搬記録媒体3509)に記憶されているプログラム又はデータを一時的に格納するRAM等のメモリである。CUP3501は、プログラムをメモリ3502に読み出して実行することにより、全体の制御を行う。
入出力装置3503は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をCPU3501に通知し、CPU3501の制御によって送られてくるデータを表示装置や印刷装置に出力する。
外部記憶装置3505は、例えばハードディスク記憶装置である。主に各種データやプログラムの保存に用いられる。
可搬記録媒体駆動装置3506は、光ディスクやSDRAM、コンパクトフラッシュ(登録商標)等の可搬記録媒体3509を収容するもので、外部記憶装置3505の補助の役割を有する。
通信インタフェース3507は、例えばLAN(ローカルエリアネットワーク)又はWAN(ワイドエリアネットワーク)の通信回線を接続するための装置である。
第1〜第4の実施形態によるシステムは、図12、図16、図17、図20、図23、図27、図28のフローチャート等で実現される機能を搭載したプログラムをCPU3501が実行することで実現される。そのプログラムは、例えば外部記憶装置3505や可搬記録媒体3409に記録して配布してもよく、或いはネットワーク接続装置3507によりネットワークから取得できるようにしてもよい。
以上の第1〜第4の実施形態に関して、更に以下の付記を開示する。
(付記1)
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入する、
ことを特徴とするアプリケーションコードの変換方法。
(付記2)
前記アプリケーションコードの実行履歴から前記リクエスト毎の前記メソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、
前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成し、
前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークし、
前記アプリケーションコードに前記コードを挿入することにより前記重要呼び出しに基づいて前記処理種別の判断を行う、
ことを特徴とする付記1に記載のコード変換方法。
(付記3)
現在のメソッド呼び出し回数を判別するコードを前記アプリケーションコードに挿入する、
ことを特徴とする付記1または2記載のコード変換方法。
(付記4)
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入し、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付け、
現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込み、
前記識別情報毎に前記メソッド呼び出し回数と前記メソッドの残時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する、
ことを特徴とするリクエストの残り時間応答方法。
(付記5)
前記リクエスト毎に実行履歴を取得し、
前記残時間として前記リクエスト毎にメソッド開始からそのメソッドを含むスレッドの完了するまでの時間を求め、
前記呼び出し順序パターンに対応したメソッド呼び出しシーケンスの出現回数をカウントし、前記残時間の平均時間を求め、
前記メソッド呼び出しシーケンスに基づいて処理種別分化木を作成し、
前記処理種別分化木において処理種別を確定するメソッド呼び出しを重要呼び出しとしてマークしたのち、メソッド呼び出しシーケンスを呼び出し元方向にトラバースし同じメソッドについても重要呼び出しとし、
前記処理種別分化木の重要呼び出しに前記識別情報に対応するモデル番号を付し、前記平均時間をモデル表へ登録し、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、
前記モデル番号遷移表に基づいて前記コードとして処理種別判別コードを前記アプリケーションコードに挿入し、
メソッド呼び出し回数をカウントするコードを前記アプリケーションコードに挿入し、
前記処理種別と、前記メソッド呼び出し回数とに基づいて前記モデル表の前記平均時間から各処理種別毎の残時間を求める、
ことを特徴とする付記4記載のリクエストの残り時間応答方法。
(付記6)
前記アプリケーションプログラムに、前記メソッドの実行開始時刻と実行終了時刻を更新して記録するコードを自動生成して埋め込む、
ことを特徴とする付記4または5のいずれかに記載のリクエストの残り時間応答方法。
(付記7)
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出する検出手段と、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入するコード挿入手段と、
を具備することを特徴とするコード変換装置。
(付記8)
コンピュータに、
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入する
処理を実行させることを特徴とするコード変換プログラム。
(付記9)
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出する手段と、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成する手段と、
生成した該コードを前記アプリケーションコードに挿入する手段と、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付ける手段と、
実行中のスレッドにおける現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込む埋め込み手段と、
前記識別情報毎に前記メソッド呼び出し回数と処理時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する応答手段と、
を特徴とするリクエストの残り時間応答装置。
(付記10)
コンピュータに、
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入し、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付け、
実行中のスレッドにおける現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込み、
前記識別情報毎に前記メソッド呼び出し回数と処理時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する処理を実行する、
ことを特徴とするリクエストの残り時間応答プログラム。