説明

アプリケーションサーバ

【課題】アプリケーション実行性能の状況に応じて、動的コンパイルのタイミングを最適化するアプリケーションサーバを提供する。
【解決手段】動的コンパイルにおいて、各メソッドの実行頻度などの情報を基に、メソッドごとにコンパイルを行なうタイミングを設定し、全体のアプリケーションプログラムの実行性能に与える影響の大きいメソッドから早めにコンパイルを行なうようにする。これにより、インタプリタによる実行とネイティブコードによる実行のバランスを最適にすることで、アプリケーションプログラムの起動直後の実行性能が安定する。

【発明の詳細な説明】
【技術分野】
【0001】
以下の実施形態は、アプリケーション実行性能の状況に応じて、動的コンパイルのタイミングを最適化するアプリケーションサーバに関する。
【背景技術】
【0002】
Java(登録商標)やMicrosoft .NETのように、アプリケーションプログラムの実行環境として、あるアプリケーションを開始してから、インターネットを通してプログラムを受け取って実行したり、動的に生成されたプログラムを実行する形態のアプリケーションプログラムに対して、仮想マシンによる実行環境が多く利用されている。
【0003】
アプリケーションプログラムを仮想マシン環境で実行するのは、プログラムをアプリケーションプログラムの起動後(つまり実行時)に読み込んで実行することや、プログラムを様々なプラットフォーム(ハードウェアやOS(Operating System))で実行するのに適している(仮想マシンがプラットフォーム依存の処理を吸収する)からである。これに対して、C言語やCOBOLなどで作られたアプリーションは、アプリケーションを実行する前に、静的コンパイラによって、アプリケーションプログラムを、動作させるプラットフォームに依存した実行形式のプログラムに変換(コンパイル) しておく方式が一般的である。
【0004】
仮想マシンでアプリケーションプログラムを実行する場合の実行環境の特徴として、アプリケーションプログラムをインタプリタで(プログラムの命令を1つずつ解釈実行して)動作する手段と、ネイティブコード(機械命令)にコンパイルしてから実行する手段があり、どちらか一方の手段だけを持つ実行環境の場合や、両方の手段を持つ実行環境の場合がある。
【0005】
インタプリタによる実行は、一般的にネイティブコードによる実行より数倍から数百倍程度遅く、ネイティブコードに変換してから実行するのが一般的である。しかし、ネイティブコードへの変換(コンパイル)は、アプリケーションプログラムの実行時に行われるため、アプリケーションの実行時間には、コンパイル処理の時間が含まれる。
【0006】
特に、アプリケーションプログラムの起動直後には、多くのコンパイル処理が動作するため、アプリケーションプログラムの起動直後の実行性能が安定しないという問題がある。アプリケーションプログラムのコンパイルは、アプリケーションプログラムの起動後(実行時)に行われることから、動的コンパイラ、あるいはJust In Time (ジャストインタイム)コンパイラ と呼ばれている。
【0007】
仮想マシンでアプリケーションプログラムを実行するときに、動的コンパイルを行うことによる影響を低減させる技術には以下がある。
1つ目は、動的コンパイラの最適化処理の程度を弱めて、コンパイル処理を軽くする方式である。コンパイラの最適化処理とは、出力するするネイティブコードをより高速なコードに変換するため処理で、最適化処理を強力にすればネイティブコードは高速になるが、コンパイル処理の負担は重くなる。このため、アプリケーションプログラムの起動時の性能を求められる場合、例えば、クライアント向けの仮想マシンでは、最適化処理の軽いコンパイラを使用することで、起動時の性能を優先するように調整している。一方、多くのアプリケーションプログラムを実行する必要のあるアプリケーションサーバ向けの仮想マシンでは、最適化処理を強化したコンパイラを使用することで、最大性能を優先するように調整している。
【0008】
1つ目の従来技術などで使用されるJava仮想マシンについては、http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/vm/index.htmlのサイトの記述を参照されたい。
【0009】
2つ目は、起動時のコンパイル処理による負担を抑えつつ、最大性能も得られるように調整する方式である。この方式によるコンパイラは適用型コンパイラとよばれ、アプリケーションプログラムの起動時はインタプリタで実行を始めて、実行しながらプログラムを解析してパフォーマンスのボトルネック(頻繁に動作するメソッド)を見つける方式を使用している。性能に影響のあるメソッドはコンパイルするが、実行頻度の低いメソッドはコンパイルすることがないため、アプケーションプログラムの起動時にコンパイル処理による負担を軽減して、最大性能も得られることを狙っている。
【0010】
2つ目の従来技術等で使用されるJava仮想マシンについては、上記ウェブサイトを参照されたい。
Oracle JRockit JDK、 JIT コンパイルと最適化の概要については、http://otndnld.oracle.co.jp/document/products/jrockit/geninfo/diagnos/underst_jit.htmlのサイトの記述を参照されたい。
【0011】
また、3つ目として、アプリケーションプログラムを起動後、アプリケーションプログラムへの入力を受け付ける(業務を開始する)前に、予め(例えば前回のアプリケーションプログラムの実行時に得た)情報を元に、使用頻度の高いプログラムを事前に読み込み、コンパイルを済ませておく方式がある。
【0012】
従来技術には、実行頻度の高い手続きをネイティブコードへ変換する処理を短時間で開始することができ、かつ、この変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止することができるシステムがある。
【先行技術文献】
【特許文献】
【0013】
【特許文献1】特開2007−213490号公報
【発明の概要】
【発明が解決しようとする課題】
【0014】
前述したように、仮想マシンでアプリケーションプログラムを実行する環境では、アプリケーションプログラムの起動後に、動的コンパイラ、あるいは、ジャストインタイムコンパイラとよばれるコンパイラによって、一般的にネイティブコードに変換してから実行するのが一般的である。
【0015】
ネイティブコードへの変換(コンパイル)は、アプリケーションプログラムの実行時に行われるため、アプリケーションプログラムの実行時間には、コンパイル処理の時間が含まれるという避けられない問題がある。
特に、アプリケーションの起動直後には、多くのコンパイル処理が動作するため、起動直後のアプリケーションの実行性能が安定しないという問題がある。
【0016】
図1は、起動直後のアプリケーションの実行性能が安定しない例を示す図である。
グラフの横軸は、仮想マシンが起動してからの経過時間、右側縦軸は、アプリケーションプログラムが処理要求(リクエスト)を処理するのに要した時間(レスポンス時間)、左縦軸は、コンパイラがネイティブコードに変換したプログラム(メソッド)の総数を示す。処理要求の開始直後は、ネイティブコードがそろっていない(一部のプログラムはインタプリタで実行される)ことと、コンパイル処理が多く動作することで、処理時間が安定していない。
【0017】
この問題に対して、1つ目の従来技術では、コンパイラの最適化の程度を妥協して、コンパイル処理を軽くする方式を使用した。この方式では、クライアントマシンのような特定の実行環境では有効である。しかし、最大性能を求められるアプリケーションサーバ向けの仮想マシンを使用した環境では、コンパイラの最適化が弱いため、アプリケーションプログラムの最大性能を犠牲にすることになる。例えば、毎朝の9時に業務を開始するアプリケーションサーバで動作するアプリケーションプログラムがあり、開始直後から大量の処理をこなさなければならないような場合には不向きである(例えば、インタネートによるチケット販売)。
【0018】
2つ目の従来技術では、ボトルネックとなる実行頻度の高いメソッドだけをコンパイルする方式を使用した。この方式は、すべてのプログラムをコンパイルする方式と比べると、アプリケーション起動時の性能に効果があった。しかし、起動後、インタプリタによる実行とプログラムの実行頻度の解析をどのくらいの期間するのが適切か、また、いつコンパイル処理を実施してネイティブコードによる実行に変えたら効果が得られるかは、いろいろな要因(ハードウェアの性能、アプリケーションプログラムの特性、アプリケーションプログラムが扱う処理量など)に依存する。プログラムのボトルネック(実行頻度の高いメソッド)を見つける方式としては、プログラム(メソッド)の呼び出し回数やループ回転数によって判断する方式が知られている。しかし、インタプリタ実行とネイティブコードによる実行の最適なバランスを見つけるのは非常に難しく、従来は、プログラム(メソッド)の実行が特定の回数に到達したらコンパイルを行う方式を採用しており、バランス調整は行っていない。したがって、2つ目の従来技術による仮想マシンを使用しても、アプリケーションプログラムの起動時の性能が運用要件を満たさない例があるのが現状である。
【0019】
3つ目の従来技術では、アプリケーションを起動後、アプリケーションプログラムへの入力を受け付ける(業務を開始する)前に、予め、使用頻度の高いプログラム(メソッド)を事前に読み込み、コンパイルを済ませておく方式を使用した。しかし、この方式は、アプリケーションプログラムの実行中にインターネットを通してプログラムを読み込んだり、実行時以後にプログラムが生成されるようなアプリケーションに対しては不向きであった。
【0020】
Java言語のように、動的にプログラムを読み込む(必要になったときに読み込む)という仕様の場合、あるメソッドから別のメソッドを参照しているときに、参照されるメソッドがまだ読み込まれていような場合は、コンパイラが生成するコードには余分なコードが増える。
【0021】
これは、「プログラムが読み込まれていなかったら、プログラムを読み込んで参照を解決する」というコードをコンパイラが生成するコードの中に組み込まなければいけないためである。3つ目の従来技術では、このようなコードが増えるため、アプリケーションの実行中にインターネットを通してプログラムを読み込んだり、実行時以後にプログラムが生成されるようなアプリケーションに対しては不向きである。
【0022】
また、コンパイラの最適化処理の面で不利になる。すなわち、コンパイラはプログラムの実行を予測することで、より強力な最適化を行うことができる(例えば、if文の分岐確率、仮想関数呼び出しで頻繁に呼ばれる関数) 。動的にプログラムを読み込んで実行する場合、コンパイル前のインタプリタ実行中にプログラムの動的な情報を収集して(プロファイルして)、コンパイラの最適化に利用するのが一般的である。しかし、3つ目の従来技術のようにプログラムの実行前にコンパイルすると、このような最適化ができなくなるため不利である。
【0023】
以下の実施形態においては、アプリケーション実行性能の状況に応じて、動的コンパイルのタイミングを調整するアプリケーションサーバを提供する。
【課題を解決するための手段】
【0024】
以下の実施形態の一側面におけるアプリケーションサーバは、プログラムの実行に際して動的コンパイルを行うアプリケーションサーバであって、該プログラムをインタプリタによって実行する際、該プログラムの実行性能に関する情報を取得する実行性能情報取得部と、該実行性能に関する情報に基づいて、該プログラムに含まれる各メソッドについて、それぞれコンパイルタイミングを指定する情報を設定するコンパイルタイミング情報設定部と、該コンパイルタイミングを指定する情報に基づいて、該メソッドをネイティブコードにコンパイルする動的コンパイル部とを備える。
【発明の効果】
【0025】
以下の実施形態によれば、アプリケーション実行性能の状況に応じて、動的コンパイルのタイミングを調整するアプリケーションサーバを提供することができる。
【図面の簡単な説明】
【0026】
【図1】起動直後のアプリケーションプログラムの実行性能が安定しない例を示す図である。
【図2】アプリケーションサーバ上で仮想マシンが動作する環境で、起動直後にアプリケーションプログラムの実行性能が安定しない例を示す図である。
【図3】図2の例に示したアプリケーションプログラムの実行に対して、プログラム(メソッド)の特徴ごとに、コンパイル処理の状況(コンパイル処理量とコンパイルの発生タイミング)を示したイメージを示す図である。
【図4】本実施形態の動的コンパイルを適用した場合に、図3に示したコンパイル処理の状況がどのように変化するかを示す図である。
【図5】アプリケーションプログラムの実行性能とコンパイル処理量の傾向とその分類を説明する図(その1)である。
【図6】アプリケーションプログラムの実行性能とコンパイル処理量の傾向とその分類を説明する図(その2)である。
【図7】アプリケーションプログラムの実行性能とコンパイル処理量の傾向とその分類を説明する図(その3)である。
【図8】アプリケーションプログラムの実行性能とコンパイル処理量の傾向とその分類を説明する図(その4)である。
【図9】コンパイルタイミング調整の判断基準情報を取得する2回のタイミングを示す図である。
【図10】コンパイルタイミング調整の判断基準情報からコンパイルのタイミングを調整する方法を説明する図(その1)である。
【図11】コンパイルタイミング調整の判断基準情報からコンパイルのタイミングを調整する方法を説明する図(その2)である。
【図12】本実施形態が適用されるシステムの構成例を示す図である。
【図13】アプリケーションサーバ上で動作する各機能のブロック構成を示す図である。
【図14】仮想マシン上、および、仮想マシンの動的コンパイラでの動作を説明する図(その1)である。
【図15】仮想マシン上、および、仮想マシンの動的コンパイラでの動作を説明する図(その2)である。
【図16】仮想マシン起動部の動作フローチャートである。
【図17】アプリケーションプログラムの実行性能計測・通知部の動作フローチャートである。
【図18】アプリケーションの実行性能計測・通知部が使用するデータを示す図である。
【図19A】コンパイル集中度の計測部の動作フローチャート(その1)である。
【図19B】コンパイル集中度の計測部の動作フローチャート(その2)である。
【図20】コンパイル集中度の計測部が使用するデータを示す図である。
【図21】プログラム(メソッド)実行頻度の計測部の動作フローチャートである。
【図22】プログラム(メソッド)実行頻度の計測部が使用するデータを示す図である。
【図23A】コンパイルタイミング調整決定部の動作フローチャート(その1)である。
【図23B】コンパイルタイミング調整決定部の動作フローチャート(その2)である。
【図24】コンパイルタイミング調整決定部が扱うデータを示す図である。
【図25A】コンパイルタイミング制御情報の計算と出力部の動作フローチャート(その1)である。
【図25B】コンパイルタイミング制御情報の計算と出力部の動作フローチャート(その2)である。
【図25C】コンパイルタイミング制御情報の計算と出力部の動作フローチャート(その3)である。
【図26】コンパイルタイミング制御情報の計算と出力部が扱うデータを示す図である。
【図27】コンパイルタイミング制御情報の入力・判断部の動作フローチャートである。
【図28】コンパイルタイミング制御情報の入力・判断部が使用するデータを示す図である。
【図29】動的コンパイル部の動作フローチャートと使用するデータを示す図である。
【図30】本実施形態の効果を説明する図(その1)である。
【図31】本実施形態の効果を説明する図(その2)である。
【発明を実施するための形態】
【0027】
本実施形態では、アプリケーションプログラムの起動時に、多数のコンパイル処理が動作することで、アプリケーションプログラムの実行に使えるCPU時間が奪われる(オーバヘッド)ことを回避するように、コンパイルを行うタイミングを調整することで、インタプリタによる実行とネイティブコードによる実行のバランスを最適にする(各々のプログラムのコンパイルを行うタイミングを遅らせた方がアプリケーションプログラムの実行性能がよくなるのか、早めた方がよいのかを判断する)ことで、アプリケーションプログラムの起動直後の実行性能を安定させる。
【0028】
これは、(1)アプリケーションプログラムの起動直後の性能が安定しない期間は、コンパイルの処理量を減らす、(2)しかし、実行性能に大きく影響するプログラム(メソッド)は、起動直後の性能が安定しない期間であっても、コンパイルのタイミングを早めてインタプリタからネイティブコードの実行に早く切り替え、逆に実行性能への影響が少ないプログラム(メソッド)は起動直後のコンパイルが集中して性能が安定しない期間で行わないことで実現する。
【0029】
つまり、アプリケーションプログラムの起動直後のコンパイルの集中を分散化させ、実行性能に影響するプログラム(メソッド)は適切なタイミングでコンパイルさせる。なお、コンパイルを行うプログラムの単位は、メソッドごとに行うこともあり、以下の説明で、プログラムをコンパイルするといったときは、メソッドのコンパイルの意味を含む。
【0030】
そして、仮想マシンは、アプリケーションサーバで動作することを想定する。アプケーションサーバは、仮想マシンを起動して、仮想マシン上でアプリケーションプログラムの起動を開始する。アプリケーションプログラムによる業務を実行する準備が整った状態でアプリケーションプログラムの起動が完了する。つまり、アプリケーションプログラムの起動が完了するまでは、アプリケーションプログラムは業務を開始しない(アプリケーションサーバ上でアプリケーションプログラムの実行が可能な状態になることをアプリケーションサーバの起動が完了したという場合がある)。
【0031】
アプリケーションプログラムの起動が完了する以前に実行を開始したプログラム(メソッド)は、アプリケーションプログラムの起動が完了する前にプログラム(メソッド)のコンパイルを完了することで、業務の開始後に、これらのプログラム(メソッド)がコンパイルされることはなくなる。これにより、業務開始後にコンパイルされるメソッドの数が減るので、(1)が実現できる。
【0032】
従来技術では、アプリケーションの起動が完了する以前に実行を開始したプログラム(メソッド)が、業務を開始してからコンパイルされることがあった。また、アプリケーションプログラムの起動後に実行されるプログラム(メソッド)は、アプリケーションプログラムの実行性能への影響度と、そのときのコンパイル処理の負荷の状況に応じて、コンパイルのタイミングを早めたり遅らせたり調整することで(2)を実現できる。
【0033】
図2は、アプリケーションサーバ上で仮想マシンが動作する環境で、起動直後にアプリケーションプログラムの実行性能が安定しない例を示す図である。
アプリケーションプログラムが起動を開始すると、起動に必要なプログラム(メソッド)の実行が始まり、これらのプログラム(メソッド)に対して多数のコンパイル処理が行われるが、起動が完了するころにはコンパイルの処理量は一時的に少なくなる。業務が開始されると、業務を実行するためのプログラム(メソッド)が動作して、これらのプログラム(メソッド)に対して多数のコンパイル処理が行われる。
【0034】
このときに、アプリケーションプログラムの起動が完了するより前に、すでに実行を開始していたプログラム(メソッド)もこのタイミングでコンパイルされることがある。業務処理がある程度行われると、多くのプログラム(メソッド)がネイティブコードの実行に切り替わり、コンパイル処理数も少なくなることで、業務の処理時間(レスポンス時間)は安定してくる。
【0035】
なお、図2においては、アプリケーションプログラムの起動完了と業務開始が同一時刻となっているが、実際には、アプリケーションプログラムの動作速度によって、短い時間単位で異なることが生じうる。しかし、図2においては、図示の便宜上、これらを同一時刻としている。
【0036】
図3は、図2の例に示したアプリケーションの実行に対して、プログラム(メソッド)の特徴ごとに、コンパイル処理の状況(コンパイル処理量とコンパイルの発生タイミング)を示したイメージを示す図である。
【0037】
黒丸が1つのプログラム(メソッド)のコンパイルを示しており、プログラム(メソッド)のコンパイルの特徴によって、(a)、(b)、(c)の3つの特徴に分けて、コンパイル処理の発生状況を示している。
【0038】
(a)は「アプリケーションプログラムの起動完了時点で1度でも実行されているプログラム(メソッド)のコンパイル」を示す。(b)は「アプリケーションプログラムが業務を開始後に実行されるプログラム(メソッド)で、かつ、実行性能への影響が大きいプログラムのコンパイル」を示す。(c)は「アプリケーションプログラムの業務開始後に実行されるプログラム(メソッド)で、かつ、実行性能への影響が小さいプログラムのコンパイル」を示す。
【0039】
アプリケーションプログラムが業務を開始した直後では、コンパイル処理が集中しており、この時点では、インタプリタによる実行からネイティブコードでの実行への切り替えが徐々に行われている。
【0040】
図4は、本実施形態のコンパイルを適用した場合に、図3に示したコンパイル処理の状況がどのように変化するかを示す図である。
(a)のアプリケーションプログラムの起動完了時点で1度でも実行されているプログラム(メソッド)は、アプリケーションプログラムの起動が完了する前にコンパイルをすることで、業務を開始するより前にコンパイルが完了している。これにより、起動直後の性能が安定しない期間のコンパイル処理の集中が緩和されている。(b)のアプリケーションプログラムが業務を開始後に実行されるプログラムで、かつ、実行性能への影響が大きいプログラム(メソッド)は、従来より早いタイミングでコンパイルすることで、インタプリタによる実行からネイティブコードによる高速な実行への切り替えが速く進む。(c)のアプリケーションプログラムが業務を開始後に実行されるプログラム(メソッド)で、かつ、実行性能への影響が小さいプログラム(メソッド)は、従来より遅いタイミングでコンパイルをすることで、起動直後の性能が安定しない期間のコンパイル処理の集中が緩和されている。
【0041】
ここで、黒丸は1つのプログラム(メソッド)のコンパイルを示す。また、図3と同様に、(a)は、 アプリケーション起動完了時点で1度でも実行されているプログラム(メソッド)のコンパイル、(b)は、アプリケーションが業務を開始後に実行されるプログラム(メソッド)で、かつ実行性能への影響が大きいプログラム(メソッド)のコンパイル、(c)は、アプリケーションが業務を開始後に実行されるプログラム(メソッド)で、かつ実行性能への影響が小さいプログラム(メソッド)のコンパイルを示す。
【0042】
アプリケーション起動完了後に初めて実行されるプログラム(メソッド)(b)、(c)は、実行性能への影響の度合いに応じて、コンパイルのタイミングを早めたり遅らせたりする調整をするが、調整の決定には個々のプログラム(メソッド)の特徴だけでなく、アプリケーションプログラムの実行性能とコンパイル処理量の全体的な傾向、実際の状況に合わせて総合的に判断する必要がある。
【0043】
例えば、あるプログラム(メソッド)は、実行性能への影響がある程度大きいので早めにコンパイルしたいが、コンパイル処理量が全体的に多いアプリケーションプログラムでは、調整をすることにより、さらにコンパイル処理の負担が増え、逆に実行性能を低下させる可能性もある。
どのようなケースで、どのような総合的な判断をしたらいいのかを示すために、アプリケーションプログラムの実行性能とコンパイル処理量の傾向の主要なケースを説明する。
【0044】
図5〜図8は、アプリケーションプログラムの実行性能とコンパイル処理量の傾向とその分類を説明する図である。
図5〜図7では、横軸に時間、右縦軸に処理時間、左縦軸にコンパイル数をとっている。
【0045】
図5のケース1は、(1)アプリケーションプログラムの業務処理(運用)開始直後に急激的にコンパイル処理量が増え、(2)業務処理開始直後の実行性能(処理時間)と安定時の実行性能(処理時間)の性能差(処理時間(レスポンス時間)の差)が大きいが、(3)実行性能(処理時間)が不安定な期間が短い場合である。
【0046】
このケースは、業務処理開始直後(運用開始直後)の短期間にコンパイル処理が集中するため、この期間は、実行性能の低下が大きくなるが、全体的にインタプリタによる実行からネイティブコードによる実行へ早く切り替わるために、実行性能が安定するまでの期間が短い。
【0047】
図6のケース2は、(1)アプリケーションの運用開始後からコンパイル処理が徐々に進み、(2)運用直後の実行性能と安定時の実行性能の性能差は図5のケース1に比べると小さいが、(3)実行性能が不安定な期間が長い場合である。
【0048】
このケースは、運用開始直後のコンパイル処理が急激に増えないため、コンパイル処理による実行性能への影響は小さいが、全体的にインタプリタによる実行からネイティブコードの実行への切り替えが徐々に行われるため、実行性能が安定するまでの期間が長くかかる場合である。
【0049】
図7のケース3は、運用直後の実行性能と安定時の実行性能の性能差が大きく、かつ、安定した実行性能になるまでの期間が長い。このようなパターンは例外的であるが、原因として、インプリタによる実行とネイティブコードによる実行の性能差が大きい(図6のケース2に該当するが安定時とそうでないときの性能差が大きい)、または、多数のコンパイル処理が行われる期間が長い(図5のケース1に該当するがよりコンパイル処理が連続的に多く行われる)、あるいは、その両方が複合的に影響していることが考えられる。
【0050】
この3つのケースを現象からとらえると、図8のように、実行性能が安定する前と安定した後の性能差の大小、および、安定した性能になるまでの不安定期間の長短の表で分類できる。また、このような現象が生じる要因には、実行性能に影響度が高いプログラム(メソッド)がネイティブコードによる実行に切り替わっているかどうか、コンパイル処理の集中度、コンパイル処理の集中期間の3つがある。それぞれのケースに応じて、これらの要因を調整することで、適切なコンパイルのタイミング調整をすることができる。
【0051】
コンパイルのタイミング調整をおこなうための判断基準となる情報は、(1)実行性能の安定前と安定後の性能差、(2)実行性能が安定するまでの期間、(3)コンパイル処理の集中度、(4)コンパイル処理の集中期間、(5)プログラム(メソッド)ごとの実行頻度(重要度)になり、本実施形態では、これらに応じたコンパイルを行うタイミングの調整を行う。
この5つの情報を、コンパイルタイミング調整の判断基準情報と呼ぶ。
【0052】
図9は、コンパイルタイミング調整の判断基準情報を取得する2回のタイミングを示す図である。
プログラム(メソッド)ごとの実行頻度(重要度)は、図3、図4の特徴(a)、(b)、(c)に応じた調整を行うために、アプリケーションプログラムの起動が完了した時点と、アプリケーションプログラムの運用開始後であって性能が安定した時点の2回取得する。
【0053】
アプリケーションプログラムの運用開始後に、性能がいつ安定したか判別できない場合は、予め設定した測定期間が過ぎたときに取得するか、あるいは、コンパイル処理の集中度が変化した時点に取得してもよい。
【0054】
コンパイルタイミング調整の判断基準情報は、アプリケーションプログラムの実行を実施して初めて取得することができる(アプリケーションプログラムを実行しないと取得することができない)。このため、アプリケーションプログラムを運用する前のテスト時に運用時と同じ環境でアプリケーションを動作させて判断基準情報を取得し、各プログラム(メソッド)のコンパイルを行うタイミングを決定し、コンパイルのタイミングを調整するための情報を作成する。
【0055】
コンパイルのタイミングを調整する情報の作成は、運用前のテスト時だけでなく、アプリケーションプログラムの最初の運用や、必要になったときなどの任意の運用時に行うこともできる。1度作成すると、それ以後の運用で使用することができる。コンパイルタイミング調整の判断基準情報のうち、(1)実行性能の安定前と安定後の性能差、(2)実行性能が安定するまでの期間は、アプリケーションサーバが取得して、仮想マシンに通知する。(3)コンパイル処理の集中度、(4)コンパイル処理の集中期間、(5)プログラム(メソッド)ごとの実行頻度(重要度)は、仮想マシンが取得する。
【0056】
(1)の実行性能の安定前と安定後の性能差は、アプリケーションプログラムの起動開始時点を安定前とし、コンパイル処理するメソッドの数の揺らぎが所定値以下になった時点を安定後として、性能差(レスポンス時間の差)を取得することによって得られる(後述の図17のステップS16、S18に対応する)。(2)の安定するまでの期間は、(1)の安定前から安定後の間の時間である。(3)のコンパイルの集中度は、所定の測定時間内に行なわれるコンパイル処理の数である。(4)のコンパイル処理の集中期間は、コンパイル処理の集中度を計測した時間である。(5)のプログラム(メソッド)ごとの実行頻度(重要度)は、メソッドごとに単位時間当たりに実行された回数を計測し、その回数から、閾値を用いて、メソッドを分類したものである(後述)。
【0057】
アプリケーションサーバで実行するアプリケーションプログラムの場合は、アプリケーションプログラムの作成者(例えばSE)とアプリケーションプログラムの利用者(運用者)は同じことが多い。
【0058】
アプリケーションプログラムの作成者と利用者が同じ場合は、コンパイルタイミング調整の判断基準情報の収集時をテスト時に行うか、アプリケーションプログラムの運用時に行うかは、利用者の判断になる。
【0059】
アプリケーションプログラムを製品として第三者(利用者)に提供する場合は、テスト時に一般的な利用形態にもとづいてコンパイルタイミング調整値を決定して、製品に同梱するという形態が考えられる(製品にコンパイルタイミング調整値の決定と利用を行う仕組みを持たせるという形態も可能である)。
【0060】
図10及び図11は、コンパイルタイミング調整の判断基準情報からコンパイルのタイミングを調整する方法を説明する図である。
コンパイルを行うタイミングは、プログラム(メソッド)の実行頻度がどこまで到達したかによって決定する。本実施形態では、状況に応じてそれぞれのプログラム(メソッド)ごとに、実行頻度の到達に応じてコンパイルを行うタイミングを調整する。
【0061】
従来技術では、メソッドの実行回数をカウントして、回数が事前に設定した閾値に到達したらコンパイルする。どのメソッドも、実行回数が固定の閾値に到達したときにコンパイルする。
【0062】
本実施形態では、特徴(a)のメソッドはアプリケーションプログラムの起動が完了する前に、コンパイルが完了するように調整する。
特徴(b)、(c)のメソッドは、コンパイルタイミング調整の判断基準情報((1)実行性能の安定前と安定後の性能差、(2)実行性能が安定するまでの期間、(3)コンパイル処理の集中度、(4)コンパイル処理の集中期間、(5)プログラム(メソッド)ごとの実行頻度(重要度))から求めたコンパイルタイミング調整値によって、コンパイルするタイミングを決定する。
【0063】
特徴(a)のプログラム(メソッド)は、アプリケーションプログラムの起動が完了する前にコンパイルが完了するように調整する。アプリケーションプログラムの起動完了時点で測定したプログラム(メソッド)ごとの実行頻度を参照して、そのプログラム(メソッド)がコンパイルされるタイミングをアプリケーションプログラムの起動完了時点での実行頻度により規定されるコンパイルタイミングよりも少し早いタイミングで(予め決めた特定の割合だけ小さく見積もった実行頻度の到達で)、コンパイルが行われるようにする。これにより、アプリケーションプログラムの起動完了前に実行されたプログラム(メソッド)が、アプリケーションプログラムの運用開始後にコンパイルされることはなくなる。
【0064】
特徴(b)、(c)のプログラム(メソッド)のコンパイルタイミングの調整方法を説明する。コンパイルタイミング調整の判断基準情報の1つであるプログラム(メソッド)ごとの実行頻度(重要度)は、実行頻度が高いものほどアプリケーションプログラムの実行性能への影響が大きいと考え、実行頻度に応じて、重要度1(極めて重要)、重要度2(重要)、重要度3(通常)、重要度4(重要度は低い)に分類する。また、コンパイル処理の集中度は、集中度の程度に応じて、集中度大、集中度中、集中度小に分類する。集中度と各プログラム(メソッド)の重要度に応じてコンパイルのタイミングを早めるのか遅らせるのかの基本的な方向性を決める。これに、実際のアプリケーションプログラムの運用状況、つまり、コンパイルタイミング調整の判断基準情報の、実行性能の安定前と安定後の性能差、実行性能が安定するまでの期間、および、コンパイル処理の集中期間を加味した最適化をして、コンパイルを行うタイミングを決定する。
【0065】
特徴(b)、(c)のプログラム(メソッド)について、コンパイルタイミング調整の判断基準情報により、コンパイルのタイミングをどのように調整するのかの方針を示したものが図10である。また、実際にどの程度の調整を行うかを数値で表したものが図11である。
【0066】
図11に示した調整の係数は、コンパイルを実施する標準の実行頻度(コンパイルタイミングの標準実行頻度;予め決定された値)に、この係数を掛けた値に、プログラム(メソッド)の実行が到達したときにコンパイルを行うことを示す。この係数の値は、仮想マシン起動時点で予め決められた値を設定するか、またはプログラムの作成者あるいは、利用者が適宜設定する。
【0067】
特徴(a)のプログラム(メソッド)については、前述の調整方法でも説明したとおり、コンパイルを行うタイミングは、プログラム(メソッド)の実行頻度がどこまで到達したかによって決定する。
【0068】
図10において、各メソッドは重要度にしたがって分類される。重要度は、メソッドの実行頻度を3つの異なる閾値(閾値1>閾値2>閾値3)と比較し、決定する。重要度1は、最も実行頻度が高いメソッドで、閾値1より大きな実行頻度を持つメソッドが分類される。重要度2は、閾値1よりは小さいが閾値2より大きな実行頻度を持つメソッドが分類される。重要度3は、閾値2よりは小さいが閾値3より大きな実行頻度を持つメソッドが分類される。重要度4は、閾値3よりは小さい実行頻度を持つメソッドが分類される。集中度についても、2つの閾値を設け、コンパイル処理の集中度の値を分類する。
【0069】
重要度1のメソッドは実行頻度が大きいので、集中度が大、中、小のいずれでも、コンパイルタイミングを早める。特に、実行性能の安定前と安定後の性能差が大きいほど大きく早めるようにする。重要度2のメソッドは、集中度が大のときであって、実行性能が安定するまでの期間がコンパイル処理の集中期間と一致する場合に、コンパイルタイミングを遅らせる。集中度が中の場合には、何もしない。集中度が小のときは、コンパイルタイミングを早める。
【0070】
重要度3のメソッドは、集中度が大のときは、コンパイルタイミングを遅らせ、集中度が中のときは何もせず、集中度が小のときは、実行性能が安定するまでの期間がコンパイルの集中期間に比べて長い場合に、コンパイルタイミングを早める。重要度4のメソッドは、いずれの集中度のときも、コンパイルタイミングを遅らせる。特に、実行性能の安定前と安定後の性能差が大きいほど大きく遅らせるようにする。ただし、集中度が大のときは、実行性能が安定するまでの期間がコンパイルの集中期間に比べて長い場合には、小さく遅らせる。
【0071】
図11は、図10の定性的処理分類を、数値例を入れて具体的にしたものである。図11において、具体的な数値は一例であり、実際の数値は仮想マシン起動時点で予め決められた値、またはプログラムの作成者あるいは利用者が適宜設定する。
【0072】
ここで説明した、特徴(b)、(c)のプログラム(メソッド)に対するコンパイルタイミングの調整方法を、図8に示したアプリケーションの3つのケースに当てはめて、その作用を説明する。
【0073】
ケース1(不安定・安定時の性能差が大きく、不安定な期間(実行性能が安定するまでの期間)が短い場合)になるのは、短期間にコンパイルが集中するケース(集中度大)が通常である。コンパイルの集中が性能を不安定にしている主原因であるかは、集中期間と不安定期間がほぼ一致するかどうかで判断できる(数値で判断するには、不安定期間÷集中期間が1.0に近い場合なので、例えば、この値が1.2以下であればコンパイル集中が主原因であると判断する)。重要度1のプログラム(メソッド)に対しては、コンパイルのタイミングを早めるが、重要度2〜4のプログラム(メソッド)に対してはコンパイルのタイミングを遅らせる。このとき重要度が低い(4に近いもの)ほど、大きく遅らせる。また、不安定・安定の性能差も考慮するが、性能差が大きい場合ほどコンパイルの集中の影響を受けているので、重要度が低いプログラム(重要度4)に対しては、性能差が大きい場合はコンパイルのタイミングをより遅らせる。その分、逆に、極めて重要なプログラムは、性能差が大きい場合ほどコンパイルのタイミングを早めて、ネイティブコードへの切り替えを早く行う。
【0074】
ケース2(不安定・安定時の性能差が小さく、不安定な期間(実行性能が安定するまでの期間)が長い場合)になるのは、コンパイルが徐々に進む(集中度小で、実行からネイティブコードによる実行への切り替えが遅い)ケースが通常である。この状況は、コンパイル集中期間に対して不安定期間が長いかどうかで判断できる(数値で判断するには、不安定期間÷集中期間が大きい場合なので、例えば、この値が1.5より大きいと判断する)。重要度が通常より高い(重要度1〜3)場合は、コンパイルのタイミングを早めてネイティブコードによる実行への切り替えが早く行われるようにする。このとき、重要度が高いものほどコンパイルのタイミングを早める。また、不安定・安定の性能差も考慮するが、重要度1(極めて重要)なプログラムに対しては、性能差が大きいほどネイティブコードへの切り替えタイミングの遅れに影響するため、性能差が大きいほどコンパイルのタイミングを早める。重要度1〜3のプログラムのタイミングを早めた分、逆に、重要度4のプログラムのタイミングを遅らせることで、コンパイル時間の影響のバランスを取ることができる(重要度1のプログラムに対して、性能差大の場合はコンパイルのタイミングをより早めたので、重要度4では性能差大の場合にコンパイルのタイミングを遅らせる)。
【0075】
ケース3(不安定・安定時の性能差が大きく、不安定な期間(実行性能が安定するまでの期間)が長い場合)は特殊なケースと考えられるが、コンパイルの集中が長く続く、あるいは、インタプリタによる実行とネイティブコードによる実行の性能差が大きいこと(または、その複合)が考えられる。この場合、不安定・安定時の性能差が大きく、不安定な期間が長いことから、集中度大に判定される可能性があるが、ケース1(同じく集中度大に分類される可能性の高い)の場合と係数の決め方を変える。ケース1とケース3の識別は、ケース1は、コンパイルの短期集中が主要因であるため、集中期間と不安定期間がほぼ一致するかどうかで判断した(数値では、不安定期間÷集中期間が1.2以下)。ケース3は、コンパイルの長期集中が要因とは限らないので、不安定期間が集中期間より長くなっているかで判断する(数値では、不安定期間÷集中期間が1.2より大きい;なお、この値は後にコンパイル集中期間影響率と呼ぶ)。その場合、ケース1と比べてケース3は、ネイティブコードへの切り替えの遅れが発生しているプログラムの割合が高いため、コンパイルのタイミングを早める場合(重要度1)、遅らせる場合(重要度4)のどちらも、コンパイルのタイミングをケース1より少し早める。
【0076】
集中度が中の場合は、集中度が小と集中度が大の中間の状況に対応できるように係数を設定する。
なお、自動的に集中度に応じた調整を行う形態を説明したが、人の判断で、どのケースの調整方法を行うのかを指定できるようにしてもよい。
【0077】
図12は、本実施形態が適用されるシステムの構成例を示す図である。
本実施形態は、サーバマシン(アプリケーションサーバ)10−1、10−2に実装されるアプリケーションサーバプログラム14、アプリケーションサーバプログラムに組み込まれる仮想マシン12、仮想マシン上で動作する動的コンパイラ13において実施される。アプリケーションサーバプログラム14上では、アプリケーションプログラム15が動作する。Webサーバプログラム16は、アプリケーションプログラムやデータの受け渡しの仲介を行い、OS(Operating System)17上で動作する。
【0078】
サーバマシン10−2は、上記のようなWebサーバプログラム16とOS17を実装し、ネットワークを介して、クライアントマシン11と通信したり、他のサーバマシン10−1と通信する。サーバマシン10−2は、クライアントマシン11からの、アプリケーションプログラムの実行リクエストを受け取ったり、該リクエストに対するレスポンスをクライアントマシン11に返送したりする。また、他のサーバマシン10−1からは、ネットワークを介して、アプリケーションプログラム15aを受け取り、自サーバマシン10−2にインストールしたりする。他のサーバマシン10−1からアプリケーションプログラム15aを受信できるようにすることにより、自サーバマシン10−2には実装されていなかったアプリケーションプログラム15の実行をクライアントマシン11からリクエストされた場合にも対応することができるようになる。
【0079】
また、本実施形態のプロセスを実現するプログラムは、仮想マシン12に組み込まれて実行されるが、これは、他のサーバマシン10−1から自サーバマシン10−2に、ネットワークを介してダウンロードされ、自サーバマシン10−2にインストールされるようにしても良い。あるいは、本実施形態のプロセスを実現するプログラムは、CD−ROM,DVD、ICメモリ、フレキシブルディスク、Blu−ray等の可搬記録媒体19に格納されていてもよい。この場合、可搬記録媒体19に格納されている当該プログラムを媒体ドライバ18で読み取り、サーバマシン10−2にインストールするようにして使用する。
【0080】
図13は、アプリケーションサーバ上で動作する各機能のブロック構成を示す図である。
アプリケーションサーバ20には、仮想マシン起動部21、リクエストの送付部22、アプリケーションの実行性能(レスポンス性能)計測・通知部23を持つ。
【0081】
仮想マシン起動部21は、(1)仮想マシン12を起動して、運用対象のアプリケーションプログラム15を仮想マシン12上で実行できるように、アプリケーションプログラム15の起動を開始する。また、仮想マシン起動部21は、(2)アプリケーションプログラム15の起動が完了して、アプリケーションプログラム15の運用の(リクエストを受け付ける)準備が整ったら、アプリケーションプログラム15の起動完了通知を、仮想マシン12に送付する。次に、リクエストの送付部22は、(3)リクエストを仮想マシン12上で動作するアプリケーションプログラム15に送付する。アプリケーションの実行性能計測・通知部23は、(4)アプリケーションの実行性能(レスポンス性能)を測定して、実行性能が安定する前と安定した後の性能差、および、安定した性能になるまでの期間を計測して、性能が安定したと判断した時に、仮想マシン12に通知する。
【0082】
図14及び図15は、仮想マシン上、および、仮想マシンの動的コンパイラでの動作を説明する図である。
仮想マシン12は、動的コンパイラ13に加え、コンパイル集中度の計測部30、プログラム(メソッド)実行頻度の計測部31、コンパイルのタイミング調整決定部32、コンパイルタイミング制御情報の計算と出力部33 (以上図14)、コンパイルタイミング情報の入力・判断部34(以上図15)を持つ。
【0083】
コンパイル集中度の計測部30は、動的コンパイラ13で行われているコンパイル処理を測定して、コンパイル集中度を求めるために、定められた期間、定められた時間単位にコンパイルされるプログラム数(メソッド数)を記録する。定められた期間とは、図9で示した、2回のコンパイルタイミング調整の判断基準情報の取得タイミングの間の時間である。
【0084】
プログラム(メソッド)実行頻度の計測部31は、プログラム(メソッド)が呼び出されたときに、そのプログラム(メソッド)の実行頻度を記録する。コンパイルのタイミング調整決定部32は、コンパイル集中度の計測部30、および、プログラム(メソッド)実行頻度の計測部31を起動することで、あるいは、アプリケーションサーバ20からの通知で、コンパイルタイミング調整の判断基準情報を収集して、これらの情報から、各プログラム(メソッド)のコンパイルタイミングを決定する。
【0085】
コンパイルのタイミング調整決定部32の手順は、(1)アプリケーションサーバ20からアプリケーションプログラムの起動完了通知を受け取ったら、(2)プログラム(メソッド)実行頻度の計測部31が記録した実行頻度を参照して、その時点(アプリケーションプログラムの起動が完了した時点の)プログラム(メソッド)ごとの実行頻度を保存する。また、(3)コンパイル集中度の計測部30に、コンパイルの集中度の記録の開始を指示する。(4)アプリケーション性能が安定した時点で、アプリケーションサーバ20からアプリケーション実行性能の通知(実行性能の安定前と安定後の性能差、実行性能が安定するまでの期間) を受けたら、(5)プログラム(メソッド)実行頻度の計測部31が記録した実行頻度を参照する。そして、その時点(アプリケーション性能が安定した時点)で、プログラム(メソッド)ごとの実行頻度を保存する。 また、(6)コンパイル集中度の計測部30に、コンパイルの集中度の記録の終了を指示する。以上の(1)〜(6)のプロセスで取得した情報がコンパイルのタイミング調整の判断基準情報になる。
【0086】
コンパイルタイミング制御情報の計算と出力部33は、コンパイルのタイミング調整の判断基準情報から、各プログラム(メソッド)のコンパイルのタイミングを決定して、コンパイルタイミング制御情報を出力する。コンパイルタイミング制御情報は、コンパイルのタイミング調整を行う1つのプログラム(メソッド)に対して、プログラム(メソッド)識別情報とコンパイルタイミング調整値を持つ。コンパイルタイミング調整値は、プログラム(メソッド)が実行される回数を示し、この回数分だけ実行されたらコンパイルするように指示するためのものである。具体的な数値は、予め決められた数値に、図11で説明した係数を乗算したものを用いる。
【0087】
図15に示すように、コンパイルタイミング制御情報の入力・判断部34は、コンパイルタイミング制御情報を使用して仮想マシン12を起動する場合に動作する。アプリケーションサーバ20は、アプリケーションプログラムに対応したコンパイルタイミング制御情報があれば、仮想マシン12を起動するときに、コンパイルタイミング制御情報を通知して起動する。仮想マシン12は、コンパイルタイミング制御情報の入力・判断部34により、コンパイルタイミング制御情報を読み込む。また、プログラム(メソッド)の呼び出しがあった場合に、そのプログラム(メソッド)の実行頻度がコンパイルタイミング制御情報で指定された値に到達したら、動的コンパイラ13に、そのプログラム(メソッド)のコンパイルを依頼する。
【0088】
従来技術では、コンパイルを依頼するときの実行頻度は、どのプログラム(メソッド)でも固定の値であったが、本実施形態では、プログラム(メソッド)ごとに調整された値(コンパイルタイミング制御情報のコンパイル調整値)に実行頻度が到達していれば、動的コンパイラ13に、そのプログラム(メソッド)のコンパイルを依頼する。該当するプログラム(メソッド)がコンパイルタイミング情報にない場合は、仮想マシン12の起動時点で予め決められた標準値に到達した場合にコンパイルを依頼する。
【0089】
図16は、仮想マシン起動部の動作フローチャートである。
ステップS10において、コンパイルタイミング制御情報が存在し、かつ、この情報を使用した起動であるか否かを判断する。ステップS10の判断がYesの場合には、ステップS11に進み、Noの場合には、ステップS12に進む。ステップS11では、仮想マシンを起動すると共に、実行するアプリケーションプログラムと、コンパイルタイミング制御情報を仮想マシンに通知する。ステップS12では、仮想マシンを起動すると共に、実行するアプリケーションプログラムと、コンパイル制御情報を使用しないことを仮想マシンに通知する。ステップS13において、アプリケーションプログラムの運用が開始可能になったら、アプリケーションプログラムの起動完了通知を仮想マシンに通知して、処理を終了する。
【0090】
図17は、アプリケーションプログラムの実行性能計測・通知部の動作フローチャートである。また、図18は、アプリケーションの実行性能計測・通知部が使用するデータを示す図である。
【0091】
図18のデータ(1)(2)(4)は、アプリケーションサーバが使用するメモリ上に置かれ、データ(3)は仮想マシンが使用するメモリ上に置かれる。(1)の平均実行性能の記録では、アプリケーションプログラムについて、平均実行性能の測定を行なうたびに記録番号をつけ、平均実行性能、すなわち、平均レスポンス時間をミリ秒の単位で記録する。(2)の平均実行性能の記録回数は、(1)の平均実行性能の記録番号の最大値であり、予め設定される。(3)のアプリケーションサーバから通知された実行性能情報は、実行性能の安定前と安定後の性能差と、実行性能が安定するまでの時間からなる。(4)のデータの平均実行性能の最大記録回数、実行性能の安定判断の変動率、実行性能決定のサンプリング数は、仮想マシン起動時点で予め決められた値を使用する。
【0092】
図17において、ステップS15では、アプリケーションプログラムの実行性能(レスポンス時間)を実行性能決定のサンプリング数だけ測定して、その平均実行性能を求め、平均実行性能の記録に設定する。このサンプリング数は、予め決定しておく。ステップS16において、平均実行性能の変動の割合が、前回記録した平均実行性能に比べて、実行性能の安定判断の変動率より小さいか否かを判断する。ステップS16の判断がYesの場合には、ステップS18に進む。ステップS16の判断がNoの場合には、ステップS17に進む。ステップS17では、平均の実行性能の記録回数が、平均実行性能の最大記録回数より大きいか否かを判断する。ステップS17の判断がYesの場合には、ステップS18に進む。ステップS17の判断がNoの場合には、ステップS15に戻る。ステップS18では、最初に記録した平均の実行性能と最後に記録した平均の実行性能の割合から、実行性能の安定前と安定後の性能差((実行性能の安定前と安定後の性能比)=(安定前に記録した平均実行性能)÷(安定後に記録した平均実行性能))を求め、仮想マシンに通知する。また、平均実行性能を最初に記録した時刻と最後に記録した時刻の差から、実行性能が安定するまでの期間を求め、仮想マシンに通知する。
【0093】
図19A、Bは、コンパイル集中度の計測部の動作フローチャートである。また、図20は、コンパイル集中度の計測部が使用するデータを示す図である。
図20のデータは、仮想マシンが使用するメモリ上に置かれる。(1)のコンパイル集中度の記録は、測定ごとに付けられる、コンパイル集中度の記録番号と、各測定が行なわれた時刻である、コンパイル集中度の測定時期(例えば、単位は秒)と、測定時に検出された実行中のコンパイル処理の数である、コンパイル集中度(例えば、単位は、個/秒)とからなる。(2)のデータは、コンパイル集中度の記録回数と、前回の計測時までに完了したコンパイルの総数とからなる。(3)のデータは、コンパイル処理の集中期間と、コンパイル処理の集中度(例えば、単位は、個/秒)とからなる。(4)のデータは、コンパイル集中度測定のサンプリング間隔、コンパイル集中度測定の最小サンプリング期間、コンパイル集中度測定の最大サンプリング期間、コンパイル集中度判定の変動率からなり、これらは、仮想マシン起動時点で予め決められた値を使用する。
【0094】
図19A、Bにおいて、コンパイル集中度の計測部は、ステップS20で、コンパイル集中度測定の測定終了の指示をコンパイルのタイミング調整決定部から受けているか否かを判断する。ステップS20の判断がYesの場合には、ステップS28に進む。ステップS20の判断がNoの場合には、ステップS21において、コンパイル集中度測定の総期間が、コンパイル集中測定の最大サンプリング期間を超えているか否かを判断する。ステップS21の判断がYesの場合には、ステップS28に進む。ステップS21の判断がNoの場合には、ステップS22において、コンパイル集中度測定の測定開始の指示をコンパイルのタイミング調整決定部から受けているか否かを判断する。
【0095】
ステップS22の判断がNoの場合には、ステップS27に進む。ステップS22の判断がYesの場合には、ステップS23において、コンパイル集中情報のコンパイル処理の集中度を設定済みか否かを判断する。ステップS23の判断がYesの場合には、ステップS27に進む。ステップS23の判断がNoの場合には、ステップS24において、動的コンパイル部(後述)から、プログラム(メソッド)のコンパイル総数を受け取る。そして、(コンパイル処理の集中度)=((今回計測時のコンパイル総数)−(前回計測時のコンパイル総数))÷(コンパイル集中度測定のサンプリング間隔(秒))により、コンパイル処理の集中度を求めて、コンパイル集中度の記録に設定する。また、今回測定時のコンパイル総数を前回測定時のコンパイル総数に保存する。
【0096】
ステップS25では、前回記録したコンパイル処理の集中度と今回記録したコンパイル処理の集中度を比べて、変動の割合が、コンパイル集中判定の変動率より小さい、かつ、コンパイル集中度測定の総期間がコンパイル集中度測定の最小サンプリング期間以上か否かを判断する。ステップS25の判断がNoの場合には、ステップS27に進む。ステップS25の判断がYesの場合には、ステップS26に進む。
【0097】
ステップS26では、これまで測定・記録した期間をコンパイル処理の集中期間に設定し、これまでに記録したコンパイル処理の集中度の平均を求め、コンパイル処理集中度に設定する。そして、ステップS27において、コンパイル集中度測定のサンプリング間隔(秒)の間、スリープし、ステップS20に戻る。
【0098】
ステップS28では、コンパイル集中度情報のコンパイル集中度が設定済みか否かを判断する。ステップS28の判断がNoのときは、ステップS29に進む。ステップS28の判断がYesのときは、処理を終了する。ステップS29では、これまで測定・記録した期間をコンパイル処理の集中期間に設定し、これまでに記録したコンパイル処理の集中度の平均を求め、コンパイル処理の集中度に設定して、処理を終了する。
【0099】
図21は、プログラム(メソッド)実行頻度の計測部の動作フローチャートである。図22は、プログラム(メソッド)実行頻度の計測部が使用するデータを示す図である。
図22のデータは、仮想マシンが使用するメモリ上に置かれる。図22のプログラム(メソッド)実行頻度の記録は、プログラム(メソッド)の識別情報として、メソッド名とそのシグネチャが格納される。そして、この識別情報に対応して、プログラム(メソッド)の実行頻度、コンパイル状態が格納される。実行頻度は、実行頻度の計測を始めてから現在の記録時点までのメソッドの実行回数を記録する。プログラム実行頻度の記録には、プログラム(メソッド)がコンパイルされたかどうかの状態を記録する項目があり、この項目の初期値はfalseで、動的コンパイラがプログラム(メソッド)をコンパイルしたときに、対象のプログラム(メソッド)のコンパイル状態をtrueにする。
【0100】
図21において、プログラム(メソッド)実行頻度の計測部の処理は、仮想マシンによって、プログラム(メソッド)の呼び出しが行われたときに実行される。ステップS35において、測定対象のプログラム(メソッド)が、プログラム(メソッド)実行頻度の記録に登録されているか否かを判断する。ステップS35の判断がNoの場合には、ステップS36において、プログラム(メソッド)実行頻度の記録に、測定対象のプログラム(メソッド)を追加し、追加したプログラム(メソッド)の記録に、そのプログラム(メソッド)の識別情報を設定し、実行頻度を「1」に設定して、処理を終了する。ステップS35の判断がYesの場合には、ステップS37において、プログラム(メソッド)実行頻度の記録から、測定対象のプログラム(メソッド)の記録を検索し、実行頻度に値を加算する。加算する値は、1でもよいし、プログラム(メソッド)の内容に応じて、重み付けをした値を使っても良い。内容に応じて重み付けするとは、プログラム(メソッド)の大きさやループ処理のありなしなどから、当該プログラム(メソッド)の実行負荷の大きさに従い重み付けするものである。ステップS37の処理が終わったら、処理を終了する。
【0101】
図23A、Bは、コンパイルタイミング調整決定部の動作フローチャートである。また、図24は、コンパイルタイミング調整決定部が扱うデータを示す図である。
図24のデータは、仮想マシンが使用するメモリ上に置かれる。(1)のプログラム(メソッド)実行頻度の重要度決定の基準値は、計測された実行頻度を4つの重要度の段階に分類するための実行頻度の区間が指定されている。プログラム(メソッド)実行頻度の重要度決定の基準値は、仮想マシン起動時点で予め決められた値を使用する。(2)〜(5)は、コンパイルタイミング調整の判断基準情報である。(2)は、アプリケーション起動完了時のプログラム(メソッド)実行頻度情報である。これは、プログラム(メソッド)の識別情報に対応して、プログラム(メソッド)の実行頻度とコンパイル情報が格納される。(3)は、アプリケーション性能安定時のプログラム(メソッド)実行頻度情報である。これは、プログラム(メソッド)の識別情報に対応して、プログラム(メソッド)の実行頻度と、コンパイル情報と、(1)のデータから得られた重要度が格納される。(2)と(3)のデータは、それぞれ、アプリケーション起動完了時と性能安定時に測定された図22のデータから生成される。(4)は、コンパイル集中情報であり、コンパイル集中度の計測部が作成するものである。これは、コンパイル処理の集中期間と、コンパイル処理の集中度(個/秒)のデータからなる。(5)は、アプリケーションサーバから通知された実行性能情報であり、実行性能の安定前と安定後の性能差と、実行性能が安定するまでの期間からなる。
【0102】
図23A、Bにおいて、ステップS40では、コンパイルタイミング調整決定部は、仮想マシン起動部から、アプリケーションプログラムの起動完了の通知が届いているか否かを判断する。ステップS40の判断がYesの場合には、ステップS42に進む。ステップS40の判断がNoの場合には、ステップS41に進む。
【0103】
ステップS41では、仮想マシン起動部からアプリケーションプログラムの起動完了の通知が届くまで待ち合わせる。ステップS42では、プログラム(メソッド)実行頻度計測部が集計しているプログラム(メソッド)実行頻度の記録を複写して、アプリケーションプログラム起動完了時のプログラム(メソッド)の実行頻度情報を作成する。ステップS43では、コンパイル集中度の計測部を実行して、コンパイル集中度の計測を開始する。
【0104】
ステップS44において、アプリケーションの実行性能計測・通知部からアプリケーションプログラムの実行性能の通知が届いているか否かを判断する。ステップS44の判断がYesの場合には、ステップS46に進む。ステップS44の判断がNoの場合には、ステップS45において、アプリケーションの実行性能計測・通知部からプリケーション実行性能の通知が届くまで待ち合わせる。
【0105】
ステップS46では、アプリケーションサーバから通知された実行性能情報を仮想マシンのメモリに格納する。ここで、実行性能情報は、実行性能の安定前と安定後の性能差、及び、実行性能が安定するまでの期間からなる。
【0106】
ステップS47では、プログラム(メソッド)実行頻度計測部が集計しているプログラム(メソッド)実行頻度の記録を複写して、アプリケーション性能安定時のプログラム(メソッド)実行頻度情報を作成する。また、アプリケーション性能安定時のプログラム(メソッド)実行頻度情報には、実行頻度に応じた重要度を格納する項目を設ける。そして、アプリケーション性能安定時のプログラム(メソッド)実行頻度情報に設定されている各プログラム(メソッド)の実行頻度と重要度基準値(閾値)とを比較して、重要度を設定する。
【0107】
ステップS48では、コンパイル集中度の計測部を実行して計測処理を実行し、計測処理が終わったらコンパイル集中度の計測を終了する。ここで、コンパイル集中度の計測部が作成したコンパイル集中度の記録は、コンパイルのタイミング調整決定部から参照でき、これをコンパイル集中情報とする。ステップS49において、コンパイルタイミング制御情報の計算と出力部を実行して、コンパイルタイミング制御情報を出力する。
【0108】
図25A、B、Cは、コンパイルタイミング制御情報の計算と出力手部の動作フローチャートである。また、図26は、コンパイルタイミング制御情報の計算と出力部が扱うデータを示す図である。
【0109】
図26のデータは、仮想マシンが使用するメモリ上に置かれる。また、コンパイルタイミング制御情報の計算と出力部は、図24に示したコンパイルタイミング調整の判断基準情報も使用する。コンパイルタイミング調整係数、コンパイルタイミングの標準実行頻度、コンパイル集中度決定の基準値、コンパイルタイミング調整係数の決定基準テーブルの内容は、仮想マシン起動時点で予め決められた値を使用する。(1)のデータは、コンパイルタイミング調整係数と、コンパイルタイミングの標準実行頻度とからなる。コンパイルタイミングの標準実行頻度は、プログラム(メソッド)がコンパイル処理されるまでに、インタプリタで実行される回数の基準値であり、予め決められた値である。コンパイルタイミング調整係数は、コンパイルタイミングの標準実行頻度に乗算して、コンパイル処理が行なわれるまでにプログラム(メソッド)が実行される回数を可変するための値であり、コンパイルタイミング調整係数の決定基準テーブルに基づいて決定される。
【0110】
(2)のコンパイル集中度決定の基準値は、単位時間当たりのコンパイル処理されたプログラム(メソッド)数を、3つの段階に分類するための基準値(閾値)を示すもので、これに従い、コンパイルの集中度が、大、中、小のいずれかに設定される。(3)の性能差大小決定の基準値は、実行性能の安定前と安定後の性能差を2つの段階(大・小)に分類するための基準値(閾値)を示す。(4)のコンパイルタイミング調整係数の決定基準テーブルは予め設定されたもので、アプリケーションプログラムのインタプリタによる実行結果から各プログラム(メソッド)を重要度と集中度で分類した結果を用いて、コンパイルタイミング調整係数を設定するためのものである。コンパイルタイミング調整係数の値が1.0の場合には、コンパイルタイミングは変更されず、1.0より大きければ、コンパイルタイミングは遅くなり、1.0より小さければ、コンパイルタイミングは早くなる。
【0111】
(5)のコンパイルタイミング制御情報は、プログラム(メソッド)ごとにコンパイルタイミング調整値を格納するもので、プログラム(メソッド)の識別情報(メソッド名とシグネチャ)と、コンパイルタイミング調整値が対応付けられて、コンパイルタイミング制御情報の計算と出力部によって生成され、出力される。コンパイルタイミング調整値は、コンパイルタイミングの標準実行頻度に、(4)のデータから得られたコンパイルタイミング調整係数を乗算して得られる。
【0112】
図25A、B、Cにおいて、コンパイルタイミング制御情報の計算と出力部は、ステップS55において、アプリケーションプログラムの起動完了時のプログラム(メソッド)実行頻度情報を読み込み、1つ目に登録されているプログラム(メソッド)の実行頻度情報を取り出す。ステップS56において、プログラム(メソッド)の実行頻度情報があるか否かを判断する。
【0113】
ステップS56の判断がNoの場合には、ステップS63に進む。ステップS56の判断がYesの場合には、ステップS57において、実行頻度情報から、プログラム(メソッド)識別情報、コンパイル状態、プログラム(メソッド)の実行頻度を取り出す。ステップS58において、取り出した実行頻度情報のコンパイル状態はtrueか否かを判断する。ステップS58の判断がYesの場合には、ステップS59に、Noの場合には、ステップS60に進む。
【0114】
ステップS59においては、コンパイルタイミング調整値に、プログラム(メソッド)の実行頻度を設定し、ステップS61に進む。ステップS60においては、コンパイルタイミング調整値に、(プログラム(メソッド)の実行頻度)×(コンパイルタイミング調整係数)を設定する。ステップS61では、コンパイルタイミング制御情報に、プログラム(メソッド)識別情報とコンパイルタイミング調整値を出力する。ステップS62においては、次に登録されているプログラム(メソッド)の実行頻度情報を取り出し、ステップS56に戻る。ここで、コンパイル状態がtrueでない(falseの)ものだけコンパイルタイミング調整値を可変するのは、trueとなっているものは、既にコンパイルされており、改めてコンパイルするタイミングを設定する必要が無いからである。
【0115】
ステップS63では、アプリケーションプログラムの安定時のプログラム(メソッド)の実行頻度情報を読み込み、1つ目に登録されているプログラム(メソッド)の実行頻度情報を取り出す。ステップS64において、プログラム(メソッド)の実行頻度情報があるか否かを判断する。ステップS64の判断がNoの場合には、処理を終了する。ステップS64の判断がYesの場合には、ステップS65に進む。
【0116】
ステップS65では、実行頻度情報から、プログラム(メソッド)識別情報、プログラム(メソッド)の実行頻度、重要度を取り出す。ステップS66において、取り出したプログラム(メソッド)識別情報は、アプリケーションプログラム起動完了時のプログラム(メソッド)の実行頻度情報に含まれているか否かを判断する。ステップS66の判断がYesの場合には、ステップS74に進む。ステップS66の判断がNoの場合には、ステップS67に進む。
【0117】
ステップS67では、アプリケーションサーバから通知された実行性能情報から、実行性能の安定前と安定後の性能差、実行性能が安定するまでの期間を取り出す。ステップS68において、コンパイル集中情報から、コンパイル処理の集中期間、コンパイル処理の集中度を取り出す。ステップS69において、コンパイル処理の集中度とコンパイル集中度判定の基準値を比較して、コンパイル処理の集中度(大/中/小)を求める。
【0118】
ステップS70において、(コンパイル集中期間影響率)=(実行性能が安定するまでの期間)÷(コンパイル処理の集中期間)を求める。ステップS71において、コンパイルタイミング調整係数の決定基準テーブルから、コンパイル処理の集中度、プログラム(メソッド)の重要度、コンパイル集中度、コンパイル集中期間影響率、実行性能の安定前と安定後の性能差の条件に当てはまるコンパイルタイミング調整係数を求める(図26(3)参照)。ステップS72において、コンパイルタイミング調整値に、(コンパイルタイミングの標準実行頻度)×(コンパイルタイミング調整係数)を設定する。ステップS73において、コンパイルタイミング制御情報に、プログラム(メソッド)識別情報とコンパイルタイミング調整値を出力する。ステップS74において、次に登録されているプログラム(メソッド)の実行頻度情報を取り出し、ステップS65に戻る。
【0119】
図27は、コンパイルタイミング制御情報の入力・判断部の動作フローチャートである。また、図28は、コンパイルタイミング制御情報の入力・判断部が使用するデータを示す図である。
【0120】
図28において、(2)のコンパイルタイミング制御情報は、仮想マシンが使用するメモリから読み込んで使用する。(1)のコンパイルタイミングの標準実行頻度は、仮想マシン起動時点で予め決められた値を使用する。
【0121】
図27において、コンパイルタイミング制御情報の入力・判断部は、メソッドの呼び出しがある前に起動される。ステップS80で、コンパイルタイミング制御情報が読み込まれているか否かを判断する。ステップS80の判断がNoの場合には、ステップS84に進む。ステップS80の判断がYesの場合には、ステップS81において、プログラム(メソッド)の呼び出しがあった場合のそのプログラム(メソッド)が、コンパイルタイミング情報のプログラム(メソッド)識別情報に存在するか否かを判断する。ステップS81の判断がNoの場合には、ステップS84に進む。ステップS81の判断がYesの場合には、ステップS82に進む。
【0122】
ステップS82においては、コンパイルタイミング制御情報から、プログラム(メソッド)の呼び出しがあったプログラム(メソッド)のコンパイルタイミング調整値を取り出す。ステップS83において、プログラム(メソッド)の呼び出しがあった場合のそのプログラム(メソッド)の実行頻度が、コンパイルタイミング情報から取り出したコンパイルタイミング調整値以上か否かを判断する。ステップS83の判断がNoの場合には、処理を終了する。ステップS83の判断がYesの場合には、ステップS85に進む。
【0123】
ステップS84では、プログラム(メソッド)の呼び出しがあった場合のそのプログラム(メソッド)の実行頻度が、コンパイルタイミングの標準実行頻度以上か否かを判断する。ステップS84の判断がNoの場合には、処理を終了する。ステップS84の判断がYesの場合には、ステップS85に進む。ステップS85では、呼び出しがあったプログラム(メソッド)のコンパイルをコンパイラに依頼し、処理を終了する。
【0124】
図29は、動的コンパイル部の動作フローチャートと使用するデータを示す図である。
コンパイルタイミング情報に基づいてどのようにコンパイルするかは、コンパイル制御情報の入力・判断部で制御しており、動的コンパイル部(動的コンパイラを含む)は、コンパイルの依頼があった時にコンパイル処理を実行する。
【0125】
図19A、Bおよび図20のコンパイル集中度の計測部が、コンパイル総数を記録するために、動的コンパイル部は、動的コンパイラにコンパイル処理をさせると共に、コンパイル総数(図29(b))をカウントする処理を行う。
【0126】
図29(a)において、動的コンパイル部は、ステップS90で、プログラム(メソッド)のコンパイル依頼があるか否かを判断する。ステップS90の判断がNoの場合には、ステップS93に進む。ステップS90の判断がYesの場合には、ステップS91において、依頼のあったプログラム(メソッド)を動的コンパイラにコンパイルさせ、ステップS92において、コンパイル総数(図29(b))を1増加する。そして、ステップS93において、動的コンパイラを終了するか否かを判断する。これは、利用者からの指示で、動的コンパイラを終了するか否か決定するようにして良い。ステップS93の判断がNoの場合には、ステップS90に戻り、Yesの場合には、処理を終了する。
【0127】
図30及び図31は、本実施形態の効果を説明する図である。
コンパイルを行うタイミングを調整して、インタプリタによる実行とネイティブコードによる実行のバランスを最適にすることで、アプリケーションプログラムの起動直後の実行性能が安定する。安定時のアプリケーション実行性能と比較して、アプリケーション起動直後の実行性能が低下する割合を図30のように軽減することができる。図30によれば、アプリケーションプログラムの起動開始後、起動完了と業務の開始前に行なわれる動的コンパイルの増加数が多くなり、アプリケーションプログラムの起動完了と業務の開始後の動的コンパイル数が減って、処理時間が短くなっている。また、アプリケーションの実行性能が安定した状態になるまでの期間を図31のように早めることができる。すなわち、重要度の高いアプリケーションがインタプリタ実行からネイティブコードの実行へ早く切り替わり、アプリケーションプログラムの動作の安定化が早くなる。
【符号の説明】
【0128】
10−1、10−2 サーバマシン
11 クライアントマシン
12 仮想マシン
13 動的コンパイラ
14 アプリケーションサーバプログラム
15、15a アプリケーションプログラム
16 Webサーバプログラム
17 OS
18 媒体ドライバ
19 可搬記録媒体
20 アプリケーションサーバ
21 仮想マシン起動部
22 リクエストの送付部
23 アプリケーションの実行性能計測・通知部
30 コンパイル集中度の計測部
31 プログラム(メソッド)実行頻度の計測部
32 コンパイルのタイミング調整決定部
33 コンパイルタイミング制御情報の計算と出力部
34 コンパイルタイミング制御情報の入力・判断部

【特許請求の範囲】
【請求項1】
プログラムの実行に際して動的コンパイルを行うアプリケーションサーバであって、
該プログラムをインタプリタによって実行する際、該プログラムの実行性能に関する情報を取得する実行性能情報取得部と、
該実行性能に関する情報に基づいて、該プログラムに含まれる各メソッドについて、それぞれコンパイルタイミングを指定する情報を設定するコンパイルタイミング情報設定部と、
該コンパイルタイミングを指定する情報に基づいて、該メソッドをネイティブコードにコンパイルする動的コンパイル部と、
を備えることを特徴とするアプリケーションサーバ。
【請求項2】
前記実行性能情報取得部は、
前記プログラムの実行性能の安定前と実行性能の安定後の性能差、および、実行性能が安定するまでの期間についての情報を取得する安定前後情報取得部と、
コンパイル処理の集中期間、および、コンパイル処理の集中度についての情報を取得する集中情報取得部と、
各メソッドの実行頻度、および、各メソッドの重要度の情報を取得するメソッド情報取得部と、
を備えることを特徴とする請求項1に記載のアプリケーションサーバ。
【請求項3】
前記実行性能の安定前の時点は、前記プログラムの起動完了時点であり、前記実行性能の安定後の時点は、動的コンパイルによるコンパイル数の揺らぎが所定値以下となる時点であることを特徴とする請求項2に記載のアプリケーションサーバ。
【請求項4】
前記実行性能の安定前と実行性能の安定後の性能差は、前記プログラムの平均レスポンス時間の差であることを特徴とする請求項2に記載のアプリケーションサーバ。
【請求項5】
前記コンパイル処理の集中度は、単位時間当たりに行なわれたコンパイル処理の数に基づいたメソッドの分類を示すことを特徴とする請求項2に記載のアプリケーションサーバ。
【請求項6】
前記コンパイル処理の集中期間は、コンパイル処理数の計測の開始から、前記単位時間当たりに行なわれたコンパイル処理の数の変動の割合が所定値以下となるまでの期間であることを特徴とする請求項5に記載のアプリケーションサーバ。
【請求項7】
前記各メソッドの実行頻度は、単位時間当たりにそれぞれのメソッドを実行した回数であり、前記各メソッドの重要度は、該メソッドを実行した回数に基づいた各メソッドの分類を示すことを特徴とする請求項2に記載のアプリケーションサーバ。
【請求項8】
前記コンパイルタイミング情報設定部は、実行性能の安定前と実行性能の安定後の性能差、コンパイル処理の集中度、各メソッドの重要度、(実行性能が安定するまでの期間)÷(コンパイル処理の集中期間)によって求められるコンパイル集中期間影響率を基に、メソッドごとにコンパイルタイミング調整係数を決定し、所定値に該コンパイルタイミング調整係数を乗算して、前記コンパイルタイミングを指定する情報を設定することを特徴とする請求項2に記載のアプリケーションサーバ。
【請求項9】
前記実行性能の安定前と実行性能の安定後の性能差が大きいほど、前記コンパイルタイミング調整係数を小さくすることを特徴とする請求項8に記載のアプリケーションサーバ。
【請求項10】
前記コンパイル処理の集中度が小さいほど、前記コンパイルタイミング調整係数を小さくすることを特徴とする請求項8に記載のアプリケーションサーバ。
【請求項11】
前記各メソッドの重要度が重要なほど、前記コンパイルタイミング調整係数を小さくすることを特徴とする請求項8に記載のアプリケーションサーバ。
【請求項12】
前記コンパイル集中期間影響率が大きいほど、前記コンパイルタイミング調整係数を小さくすることを特徴とする請求項8に記載のアプリケーションサーバ。
【請求項13】
プログラムの実行に際して動的コンパイルを行うアプリケーションサーバの処理方法であって、
該アプリケーションサーバは、
該プログラムをインタプリタによって実行する際、該プログラムの実行性能に関する情報を取得し、
該実行性能に関する情報に基づいて、該プログラムに含まれる各メソッドについて、それぞれコンパイルタイミングを指定する情報を設定し、
該コンパイルタイミングを指定する情報に基づいて、該メソッドをネイティブコードにコンパイルする、
ことを特徴とする処理方法。
【請求項14】
アプリケーションプログラムの実行に際して動的コンパイルをコンピュータに行わせるプログラムであって、
該コンピュータに、
該アプリケーションプログラムをインタプリタによって実行する際、該アプリケーションプログラムの実行性能に関する情報を取得させ、
該実行性能に関する情報に基づいて、該アプリケーションプログラムに含まれる各メソッドについて、それぞれコンパイルタイミングを指定する情報を設定させ、
該コンパイルタイミングを指定する情報に基づいて、該メソッドをネイティブコードにコンパイルさせる、
ことを特徴とするプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19A】
image rotate

【図19B】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23A】
image rotate

【図23B】
image rotate

【図24】
image rotate

【図25A】
image rotate

【図25B】
image rotate

【図25C】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate


【公開番号】特開2013−105464(P2013−105464A)
【公開日】平成25年5月30日(2013.5.30)
【国際特許分類】
【出願番号】特願2011−251127(P2011−251127)
【出願日】平成23年11月16日(2011.11.16)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】