(57)【要約】【課題】      キャッシュ制御方法を提供することである。【解決手段】上記課題を解決するために第１の態様として、  キャッシュを制御する方法であって、  アプリケーションがトランザクションを処理中に生成されるメモリ・オブジェクトについて、トランザクションに対応した値を割り当てるステップと、  前記メモリ・オブジェクトがキャッシュに記憶されることに応じて、前記割り当てた値をキャッシュ・アレイのフラグ領域にトランザクション・フラグ値として付加するステップと、  前記トランザクション終了時に、対応するトランザクション・フラグ値を掃き出し候補として登録するステップと、  キャッシュの掃き出し時、前記掃き出し候補として登録されたトランザクション・フラグ値を有するキャッシュ・ラインを優先的に掃き出すステップと、を含む、方法を提供する。【選択図】図３
2011008315.tif 000002
【特許請求の範囲】
【請求項１】
キャッシュを制御する方法であって、
アプリケーションがトランザクションを処理中に生成されるメモリ・オブジェクトについて、トランザクションに対応した値を割り当てるステップと、
前記メモリ・オブジェクトがキャッシュに記憶されることに応じて、前記割り当てた値をキャッシュ・アレイのフラグ領域にトランザクション・フラグ値として付加するステップと、
前記トランザクション終了時に、対応するトランザクション・フラグ値を掃き出し候補として登録するステップと、
キャッシュの掃き出し時、前記掃き出し候補として登録されたトランザクション・フラグ値を有するキャッシュ・ラインを優先的に掃き出すステップと、
を含む、方法。
【請求項２】
前記キャッシュが、さらに、トランザクション・フラグ値が取り得る値の個数を、その長さとする１つのビットベクタを有し、
前記掃き出し候補として登録するステップが、前記トランザクション・フラグ値に対応する前記ビットベクタ内の位置のビットを１にセットするステップである、請求項１の方法。
【請求項３】
前記キャッシュが、さらに、前記ビットベクタの各ビットに対応するカウンタを有し、前記カウンタは前記キャッシュ・アレイの有効なライン数を表す、請求項２記載の方法。
【請求項４】
前記トランザクションは、クライアントからの HTTP リクエストに応じて生じ、
トランザクションに対応した値を割り当てるステップが、前記アプリケーションは、前記 HTTP リクエストのＵＲＩとそのメソッドが同じ組み合わせのトランザクションについて同じ値を割り当てる、請求項１記載の方法。
【請求項５】
キャッシュ制御装置であって、
アプリケーションがトランザクションを処理中に生成されるメモリ・オブジェクトについて、前記トランザクションに対応した値を割り当てる手段と、
前記メモリ・オブジェクトがキャッシュに記憶されることに応じて、前記割り当てた値をキャッシュ・アレイのフラグ領域にトランザクション・フラグ値として付加する手段と、
前記トランザクション終了時に、対応するトランザクション・フラグ値を掃き出し候補として登録する手段と、
キャッシュの掃き出し時、前記掃き出し候補として登録されたトランザクション・フラグ値を有するキャッシュ・ラインを優先的に掃き出す手段と、
を含む、装置。
【請求項６】
前記キャッシュが、さらに、トランザクション・フラグ値が取り得る値の個数を、その長さとする１つのビットベクタを有し、
前記掃き出し候補として登録する手段が、前記トランザクション・フラグ値に対応する前記ビットベクタ内の位置のビットを１にセットする手段である、請求項５の装置。
【請求項７】
前記キャッシュが、さらに、前記ビットベクタの各ビットに対応するカウンタを有し、前記カウンタは前記キャッシュ・アレイの有効なライン数を表す、請求項６記載の装置。
【請求項８】
前記トランザクションは、クライアントからの HTTP リクエストに応じて生じ、
前記トランザクションに対応した値を割り当てる手段が、前記アプリケーションは、前記 HTTP リクエストのＵＲＩとそのメソッドが同じ組み合わせのトランザクションについて同じ値を割り当てる手段である、請求項５記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、キャッシュ制御に関し、特にアプリケーションと連動したキャッシュ制御に関する。
【背景技術】
【０００２】
キャッシュメモリにはメイン・メモリ内に格納されている命令コードのうち、頻繁に実行されている命令コードの一部が格納されるため、動作の遅いメイン・メモリヘのアクセス回数を減らすことができ、処理の高速化が期待できる。
【０００３】
しかしながら従来のキャッシュはアプリケーションの動作に合わせた制御がなされていなかった。近年、プロセッサ周波数の向上や高い性能要求を満たすため、プロセッサのキャッシュメモリを有効に使用することの必要性が高まっている。特にウェブ・アプリケーションなどの商用アプリケーション・サーバのリクエスト処理などで多く生成されるメモリ・オブジェクトは、特定のリクエスト処理内でのみ使用され、処理が終わると使われなくなることが多い。このようなメモリアクセスパターンの場合、通常のＬＲＵアルゴリズム（最近、最も使われていないデータをメモリに退避させる）を使うと、トランザクション処理の終了時に不要なデータがキャッシュに残ることになり、キャッシュメモリを有効に使用することができない。
【０００４】
従来技術としてソフトウェアからの制御を積極的に受け入れて処理するキャシュメモリシステム（特許文献１）が知られている。この方法ではプロセッサが予め定められた命令を実行することに応じて属性制御手段がキャッシュメモリに既定の動作を行わせている。しかしこの方法ではアプリケーションの動作態様に基づくキャッシュ制御が行われていないので、メモリ・オブジェクトが生成、消滅を繰り返すようなアプリケーション・サーバにおいて効率的に対応するキャッシュ制御が行えない。
【０００５】
また、コンパイラがキャッシュ・ライン単位でメモリの再利用間隔（Reuse Distance）を推定する方法（非特許文献１）がある。再利用間隔が長いアクセスの最初のアクセス（Last Use）においてＣＰＵは、その再利用間隔の情報をキャッシュ・ラインのタグビットに書き込む。このためコンパイラはメモリアクセスを行う命令として、タグ値を書き込む特殊な Load/Store 命令を生成しておく。キャッシュからラインを掃き出す必要がある時、キャッシュはこのタグ値を使い、再利用間隔の長いものを優先的に掃き出し候補として選択する。これにより再利用前に追い出されるはずのラインを積極的に追い出し、それ以外のラインをキャッシュがなるべく保持できるようになる。この方法はコンパイラによる再利用間隔の推定に依存している。ところが現在の商用サーバは一般的に複数のタスクを並列処理し、実行時に同時に処理されるタスクの組み合わせで再利用間隔が大きく変化しているのでコンパイラによる推定は非常に困難である。その他の従来技術としてインテル・プロセッサなどで実装されているプリフェッチ命令（非特許文献２）がある。この命令を使ってプリフェッチを行うと、キャッシュ内の対応するラインにフラグが立つ。このフラグが立っていると、そのラインが掃き出されるとき下位層のキャッシュに格納されないので下位層のキャッシュの汚染を防ぐことができる。ところがこの方法は、ライフタイムの短いデータをキャッシュする場合、そのデータがキャッシュサイズを超えると主記憶からのミスフェッチが多くなる。従って、上記非特許文献は何れもアプリケーションの動作態様に基づくキャッシュ制御がなされていないのでウェブ・アプリケーションサーバ等の商用サーバのパフォーマンス向上は限定的である。
【０００６】
【特許文献１】ＷＯ２００６／１１２１１１
【非特許文献１】Zhenlin Wang , Kathryn S. McKinley , Arnold L. Rosenberg , Charles C. Weems, “Using the Compiler to Improve Cache ReplacementDecisions,” Proceedings of the 2002 International Conference on ParallelArchitectures and Compilation Techniques, p.199, September 22-25, 2002.
【非特許文献２】Sailesh Kottapalli, “METHOD AND APPARATUS FORHANDLING NON-TEMPORAL MEMORY ACCESSES IN A CACHE,” Patent ApplicationPublication, US 2006/0101208 A1, May 11, 2006.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明は上記問題点を解決すべく、新しいキャッシュ制御方法および装置を提供し、アプリケーションの動作特徴を反映したキャッシ制御を行い、引いてはアプリケーション・サーバの動作のパフォーマンスを向上させることを目的とする。
【課題を解決するための手段】
【０００８】
上記の目的を達成するため、本発明のキャッシュを制御する方法は、アプリケーションがトランザクションを処理中に生成されるメモリ・オブジェクトについて、トランザクションに対応した値を割り当てるステップと、前記メモリ・オブジェクトがキャッシュに記憶されることに応じて、前記割り当てた値をキャッシュ・アレイのフラグ領域にトランザクション・フラグ値として付加するステップと、前記トランザクション終了時に、対応するトランザクション・フラグ値を掃き出し候補として登録するステップと、キャッシュの掃き出し時、前記掃き出し候補として登録されたトランザクション・フラグ値を有するキャッシュ・ラインを優先的に掃き出すステップとを含む。
【０００９】
また、前記キャッシュが、さらに、トランザクション・フラグ値が取り得る値の個数を、その長さとする１つのビットベクタを有し、前記掃き出し候補として登録するステップが、前記トランザクション・フラグ値に対応する前記ビットベクタ内の位置のビットを１にセットするステップとする。
【００１０】
また、前記キャッシュが、さらに、前記ビットベクタの各ビットに対応するカウンタを有し、前記カウンタは前記キャッシュ・アレイの有効なライン数を表すようにする。
【００１１】
また、トランザクション・フラグ値を新しいトランザクションに割り当てに際し割り当てる値がないときのために、前記トランザクションは、クライアントからの HTTP リクエストに応じて生じ、トランザクションに対応した値を割り当てるステップが、前記アプリケーションは、前記 HTTP リクエストのＵＲＩとそのメソッドが同じ組み合わせのトランザクションについて同じ値を割り当てるステップをとする。
【００１２】
別の態様として、本発明のキャッシュ制御装置は、アプリケーションがトランザクションを処理中に生成されるメモリ・オブジェクトについて、前記トランザクションに対応した値を割り当てる手段と、前記メモリ・オブジェクトがキャッシュに記憶されることに応じて、前記割り当てた値をキャッシュ・アレイのフラグ領域にトランザクション・フラグ値として付加する手段と、前記トランザクション終了時に、対応するトランザクション・フラグ値を掃き出し候補として登録する手段と、キャッシュの掃き出し時、前記掃き出し候補として登録されたトランザクション・フラグ値を有するキャッシュ・ラインを優先的に掃き出す手段を含む。
【００１３】
また、前記キャッシュが、さらに、トランザクション・フラグ値が取り得る値の個数を、その長さとする１つのビットベクタを有し、前記掃き出し候補として登録する手段が、前記トランザクション・フラグ値に対応する前記ビットベクタ内の位置のビットを１にセットする手段とする。
【発明の効果】
【００１４】
以上のように構成された本発明によれば、アプリケーションと協働してキャッシュが効率的に動作する。これによりアプリケーション・サーバのパフォーマンスを向上させることが可能になる。
【発明を実施するための最良の形態】
【００１５】
＜動作概要＞
商用アプリケーション・サーバは、複数のＣＰＵで複数のトランザクションを時分割などで並列に処理をするが、その処理が終わるとトランザクション中に生成されたメモリ・オブジェクトの多くは使用されない。そこで本発明では、トランザクション中に生成されるメモリ・オブジェクトについて、トランザクションに対応したトランザクション・フラグ値を付加しておく。トランザクション終了時には、対応するトランザクション・フラグ値を掃き出し候補の識別子として登録する。掃き出し時、キャッシュは掃き出し候補として登録されたトランザクション・フラグ値のキャッシュ・ラインを優先的に掃き出し候補として選択する。これにより、将来再利用される確率の小さいメモリ・オブジェクトによるキャッシュの汚染の影響を小さくすることができる。以下、添付図面を参照して、本発明の実施形態について詳細に説明する。なお説明は簡便のためＣＰＵが１つの場合を説明するが実際にはマルチＣＰＵでトランザクションが処理されることに注意されたい。
【００１６】
＜システム構成＞
図１は、本実施形態のキャシュ制御の概要を説明する図である。システム１００は本発明のキャッシュを有するコンピュータを表し、好ましくは複数のトランザクションが稼動するアプリケーション・サーバである。システム１００はＣＰＵ１１０とこれに接続されたメモリ１２０、およびキャッシュ１３０を含む。メモリ１２０は主に主記憶メモリを指すが、外部記憶装置１６０を含めた仮想記憶と捉えることもできる。ＯＳ１５０およびその上で動作するアプリケーション１４０のプログラムコードも最終的には主記憶１２０に置かれＣＰＵにフェッチされ解釈、実行される。ＣＰＵ１１０とメモリ１２０、およびキャッシュ１３０はアドレス線とデータ線で接続される。
図２にキャッシュ１３０の構造を図示する。本発明は説明のために４ウェイ・セットアソシエイティブ（4-way set associative）キャッシュの構成を例示するが、それに限定されない。なお４ウェイ・セットアソシエイティブの回路構造は広く知られているので大まかな動作原理を説明する。この方式はキャッシュを分割し１つのインデックスに対して複数のタグおよびデータを持つ。まずＣＰＵからのアドレスが入力されると入力アドレスを上位、中位、下位（オフセット）の３つに分ける。上位アドレスはキャッシュのタグアレイ（以下タグと省略）に対応する。中位アドレスはキャッシュ・ラインの選択に使用される。、下位のオフセットはキャッシュ・ライン内のアクセスされるワードの位置に対応する。例えばPOWER Processorの例では、キャッシュ・ラインのデータ長（すなわちライン長）は１２８バイト（１０２４ビット）で、アドレス下位のオフセットは、ライン内のワードのオフセットになる。入力アドレスに該当するデータがキャッシュに置かれていた場合（ヒットした場合）そのデータをＣＰＵに送出する。本発明はフラグ領域、タグ、データから構成される１つのキャッシュ・ラインのうちフラグ２１０を拡張する。
【００１７】
図３に本発明のフラグの詳細を図示する。フラグ２１０の典型的なビットについて説明する。有効フラグ３１０はデータがキャッシュから読み込まれると、設定される。ダーティ・フラグ３２０は、データが削除される前にメモリに書き戻す必要がある場合に設定される。LRU管理情報330は、同一のコングルエンス・セット内でのアクセス順序、またはそれと同等の情報を有する、LRU情報を格納する。例えば、４ウェイ・セットアソシエイティブ・キャッシュの場合には、４つのメンバー内でのアクセスされた順番を格納してもよい。本発明はこのフラグ領域に、トランザクション・フラグ（ｔビット）を追加する。このトランザクション・フラグは、アプリケーションが処理するトランザクションに対応する情報を有している。すなわち２＾ｔ個のトランザクションを識別できる。トランザクション毎のキャッシュ動作を管理するために、さらに２＾ｔビット長（このサイズはトランザクション・フラグ値が取り得る値の個数に相当する）のトランザクション・ビットベクタ３５０を１個と、その各トランザクション・ビットに対応した２＾ｔビット個のカウンタ３６０を備える。カウンタ長はキャッシュサイズに依存する。最大はキャッシュ内の総ライン数までカウントできるカウンタになる。例えば２５６KBキャッシュで、ラインサイズが１２８バイトなら、2048ラインなので、11ビットカウンタとなる。本発明の実施例においてｔ＝１０の場合を例示するがこれに限定されない。
【００１８】
各トランザクション・ビットベクタの各ビットは、対応するトランザクション・フラグ値を有するキャッシュ・ラインが掃き出し候補として登録されていることを示す（１で登録、０で非登録）。カウンタは対応するトランザクション・フラグ値をもつ有効キャッシュ・ラインの個数を示す。カウンタの値がゼロか、または既定の閾値より小さくなると対応するトランザクション・フラグ値は新しいトランザクションのために使用される候補となる。ただし、トランザクション・フラグ値０は通常のデータ（LRU方式が有効なデータ）のために使用し、掃き出し候補として登録することはない。このためトランザクション・フラグ値０のトランザクション・ビットベクタとカウンタは省略してもよい。
【００１９】
＜アプリケーション・サーバの動作＞
以下、アプリケーション・サーバ１００の動作をより詳細に説明する。アプリケーション・サーバ１００において、外部記憶装置１６０に記憶されたアプリケーション１４０およびＯＳ１５０のプログラムは、メイン・メモリ１２０に読み込まれ、ＣＰＵ１１０がこれを実行する。アプリケーション・サーバ１００は、ネットワークを介して HTTP 通信を行うためのサーバであり、クライアント１７０からHTTPリクエストを受け付け、これをアプリケーション１４０のプログラムがトランザクションとして処理する。その処理において多数のメモリ・オブジェクトがメモリ管理ライブラリ１４５によりメモリ１２０中に作成される。そしてこれらのメモリ・オブジェクトに関するデータはＣＰＵ１１０、キャッシュ１３０およびメモリ１２０間でやり取りされる。そのトランザクションの処理が終了すると結果を HTTP レスポンスとしてクライアント１７０に返送する。そして不要となった多数のメモリ・オブジェクトは破棄される。
【００２０】
図４はトランザクション・フラグ値の選択フローを示す図である。ステップ４１０でトランザクションが開始される。ステップ４２０でトランザクション・フラグ値が０以外の値でカウンタの値がゼロ（キャッシュ内のラインで使われていない）のトランザクション・フラグ値を選択するか、またはカウンタの値がある決められた閾値より小さい（キャッシュ内の使用ライン数が十分に小さい）トランザクション・フラグ値を選択する。そのようなトランザクション・フラグ値がない場合、最近選択したトランザクション・フラグ値で、かつ現在実行しようとしているトランザクションと似ていると予想されるものから選ぶ。似ているとは例えば HTTP リクエストのＵＲＩとそのメソッドの組み合わせが同じということである。
【００２１】
HTTP リクエストを適用するリソースを指定するためのＵＲＩを Request-URIと呼ぶ。図７にＵＲＩの例をしめす。ＵＲＩは Uniform Resource Identifier の略でありHTTP リクエストを適用するリソースを識別する。図７の Request-URI の４つのオプションはそのリクエストの性質に依存する。メソッドとは Request-URI と組み合わせて使用されるもので、ＵＲＩの先にあるリソースに対してどのように振る舞って欲しいかを働きかけるためのもので８つのメソッドがある。図８に８つのメソッドを示す。このＵＲＩとメソッドの組み合わせが等しいものをトランザクションが似ている定義する。この場合、２つのトランザクションはタグ管理上、単一のトランザクションとして扱う。このように処理することにより、トランザクション・フラグ値の範囲を実際にキャッシュ内に同時に存在しうるトランザクション数より小さくできる。すなわちトランザクション・フラグのビット数を節約できる。選択したトランザクション・フラグ値に対応するトランザクション・ビットベクタがセットされている（掃き出し候補の識別子）場合はそれを解除する。すなわち、対応するトランザクション・ビットベクタのビットをゼロにクリアする。このようにしてアプリケーションは開始トランザクションにトランザクション・フラグ値を割り当る。
【００２２】
図５に開始トランザクションにトランザクション・フラグ値を割り当てる具体例を示す。図５ではｔ＝１０の場合（１０２４個のフラグ値）について説明する。この場合カウンタ５１０の値が０であるのでトランザクション・フラグ値３がこのトランザクションのトランザクション・フラグ値となる。同時に対応するトランザクション・ビットベクタのビットをゼロにする。
【００２３】
＜オブジェクト生成＞
オブジェクト生成時に、メモリ管理ライブラリ１４５がメモリ・オブジェクトを生成するとき、対応するメモリ領域をフェッチまたはプリフェッチする。このとき、トランザクションにアサインされたトランザクション・フラグ値<Ｔ>をキャッシュ内の対応するラインに付加する。例えば、ＣＰＵからの入力アドレスが<address>の場合、以下のようなプリフェッチ命令を使う。
Tprefetch <address>, <Ｔ>
ただし、生成されたオブジェクトがトランザクションをまたがって使われると想定できる場合は、トランザクション・フラグを付加しない（あるいはトランザクション・フラグ値を０にしておく）。すなわち、トランザクション終了時に掃き出し候補として登録されない。メモリ・オブジェクト生成以外の一般のメモリアクセスやプリフェッチはトランザクション・フラグを付加しない命令を使う。この場合、キャッシュ・ハードウェアはトランザクション・フラグ値０のアクセスとして扱う。すでにラインがキャッシュに存在する場合は（ヒット）、そのトランザクション・フラグ値は変化しない。ミスフェッチが発生した場合には、キャッシュ・ラインに０をトランザクション・フラグ値として付加する。すなわち、寿命の長いオブジェクトとみなす。ただし、一般のメモリアクセスやプリフェッチでも、トランザクションをまたがって使われないと想定できる場合は、トランザクション・フラグ付の命令を使ってアクセスまたはプリフェッチしてもよい。
【００２４】
＜トランザクション終了時＞
トランザクション終了時には、そのトランザクション・フラグ値<T>を掃き出し候補としてキャッシュメモリに登録する。例えば、以下のような命令を使う。
Transient <T>
この命令は、引数としてとるトランザクション・フラグ値に対応する掃き出し候補フラグ（対応するトランザクション・ビットベクタ内のビット）を立てる。
【００２５】
＜キャッシュの動作＞
図６にキャッシュ・ハードウェアの動作を示す。ステップ６１０でＣＰＵ１１０によるキャッシュ・アクセスがあったとする。ステップ６１５でキャッシュ・ヒットの場合、従来のキャッシュと同じ動作を行いステップ６６５へ進む。ステップ６１５でキャッシュがヒットしなかった場合、ステップ６２０で無効なラインがコングルエンス・セットにあるかどうか判断する。もしあれば処理はステップ６３５へ進み無効なラインを選択しステップ６５０へ進む。なければ処理はステップ６２５へ進む。
【００２６】
ステップ６２５ではまずコングルエンス・セットのそれぞれのトランザクション・フラグ値について対応するトランザクション・ビットベクタのビットが１のラインがあるか判断する。もしあれば処理はステップ６３０へ進む。なければ処理はステップ６４０へ進む。ステップ６３０では、トランザクション・ビットベクタのビットが１のライン（すなわち掃きだし候補として登録されたライン）から、最もLRUなラインを掃きだし候補として選択し、ステップ６４５へ進む。ステップ６４０では通常のＬＲＵアルゴリズムを適用して掃き出し候補を選択する。そしてステップ６４５へ進み、掃き出し候補のトランザクション・フラグ値がゼロでないなら対応するカウンタを１減らし、ステップ６５０へ進む。
【００２７】
ステップ６５０では選択したラインに要求されたデータをミスフェッチする。この時、必要であればライトバックを行う。処理はステップ６５５へ進み、ミスフェッチしたラインにトランザクション・フラグ値としてＴを格納する。次にステップ６６０でＴがゼロでない（トランジエントなキャッシュのアクセスまたはプリフェッチ要求）なら、対応するカウンタを１増やす。そしてステップ６６５へ進む。ステップ６６５ではコングルエンス・セットのＬＲＵ管理情報３３０を更新する。
【００２８】
以上、本発明の方法によれば、アプリケーションが処理するトランザクションの特徴に応じてキャシュが効率的に使用されるので、アプリケーション・サーバのパフォーマンスの向上に寄与する。またクライアントからの HTTP リクエストの種類に応じてトランザクションを分けることが可能になり、より効率的にトランザクション・フラグ値が使用される。
【図面の簡単な説明】
【００２９】
【図１】本実施形態のキャシュ制御の概要を説明する図である。
【図２】４ウェイ・セットアソシエイティブ・キャッシュの構造を示す図である。
【図３】本発明のフラグの詳細を表す図である。
【図４】トランザクション・フラグ値の選択フローを示す図である。
【図５】開始トランザクションにトランザクション・フラグ値を割り当てる具体例である。
【図６】キャッシュ・ハードウェアの動作例を示す図である。
【図７】ＵＲＩの例である。
【図８】HTTPプロトコルの標準的な８つのメソッドを示す図である。
【符号の説明】
【００３０】
１００  システム（アプリケーション・サーバ）
１１０  ＣＰＵ
１２０  メモリ（主記憶）
１３０  キャッシュ
１６０  外部記憶装置
１５０  ＯＳ
１４０  アプリケーション
１４５  メモリ管理ライブラリ
１７０  クライアント
２１０  フラグ
３１０  有効フラグ
３２０  ダーティ・フラグ
３４０  トランザクション・フラグ値
３３０  ＬＲＵ管理情報
３５０  トランザクション・ビットベクタ
３６０  カウンタ
【図１】
2011008315.tif 000003
【図２】
2011008315.tif 000004
【図３】
2011008315.tif 000005
【図４】
2011008315.tif 000006
【図５】
2011008315.tif 000007
【図６】
2011008315.tif 000008
【図７】
2011008315.tif 000009
【図８】
2011008315.tif 000010