Evictor のチューニング

プラグイン Evictor を使用する場合、Evictor を作成してバックアップ・マップと関連付けるまで、これらはアクティブになりません。 以下のベスト・プラクティスにより、最少使用頻度 (LFU) Evictor および最長未使用時間 (LRU) Evictor に対するパフォーマンスが向上します。

LFU Evictor

LFU Evictor の概念は、頻繁に使用されないマップからエントリーを除去することです。マップのエントリーは、一定量のバイナリー・ヒープを超えて広がります。特定のキャッシュ・エントリーの使用量が増えると、それはヒープの高位に配列されます。Evictor が一連の除去を試行する場合、バイナリー・ヒープの特定のポイントよりも低い位置にあるキャッシュ・エントリーだけを除去します。この結果として、頻繁に使用されないエントリーが除去されます。

LRU Evictor

LRU Evictor は LFU Evictor と同じ概念に従いますが、2、3 の点が異なります。主な違いは、LRU ではバイナリー・ヒープのセットの代わりに先入れ先出し (FIFO) キューを使用することです。キャッシュ・エントリーにアクセスされるたびに、そのエントリーはキューの先頭に移動します。この結果、 キューの先頭には最後に使用されたマップ・エントリーが含まれ、キューの 最後は最長未使用時間のマップ・エントリーになります。 例えば、A キャッシュ・エントリーが 50 回使用され、B キャッシュ・エントリーが A キャッシュ・エントリーの直後 に 1 回だけ使用されるとします。 この場合、最後に使用された B キャッシュ・エントリーがキューの先頭になり、A キャッシュ・エントリーはキューの最後になります。 LRU Evictor は、キューの末尾にあるキャッシュ・エントリー、すなわち最も古いマップ・エントリーを除去します。

LFU および LRU プロパティーおよびパフォーマンスを向上させるためのベスト・プラクティス

ヒープ数

LFU Evictor を使用する場合は、特定のマップのすべてのキャッシュ・エントリーが指定するヒープ数を超えて配列されます。これによってパフォーマンスが劇的に上がり、また、そのマップのすべての配列を含む、1 つのバイナリー・ヒープ上ですべての除去が同期するのを防ぎます。 ヒープが多い場合も、各ヒープのエントリーが少ないので再配列に必要な時間を短縮できます。 ご使用の BaseMap でエントリー数の 10% のヒープ数を設定してください。

キューの数

LRU Evictor を使用する場合は、特定のマップのすべてのキャッシュ・エントリーは指定する LRU キューの数を超えて配列されます。これによってパフォーマンスが劇的に上がり、また、そのマップのすべての配列を含む、1 つのキュー上ですべての除去が同期するのを防ぎます。 ご使用の BaseMap でエントリー数の 10% のキューの数を設定してください。

MaxSize プロパティー

LFU または LRU Evictor がエントリーの除去を開始すると、MaxSize Evictor プロパティーを使用して、いくつのバイナリー・ヒープまたは LRU キュー・エレメントを除去するかを判別します。 例えば、各マップ・キューにおよそ 10 のマップ・エントリーを持つようにヒープまたはキューの数を設定するとします。 MaxSize プロパティーが 7 に設定されている場合は、Evictor は各ヒープまたはキュー・オブジェクトの 3 つのエントリーを除去して、各ヒープまたはキューのサイズを 7 にします。Evictor は、ヒープまたはキューに、エレメントの MaxSize プロパティーの値を超えるエレメントがある場合にのみ、マップ・エントリーをヒープまたはキューから除去します。MaxSize をヒープまたはキュー・サイズの 70% に設定してください。この例の場合、値は 7 に設定されます。ユーザーは、BaseMap エントリーの数を、使用するヒープまたはキューの数で割ることによって、各ヒープまたはキューのおおよそのサイズを得ることができます。

SleepTime プロパティー

Evictor はマップから常にエントリーを除去するわけではありません。その代わり、一定時間アイドル状態となり、 マップの検査のみが n 秒間に 1 回行われます。ここで、n は SleepTime プロパティーを示します。このプロパティーも確実にパフォーマンスに影響します。あまり頻繁に除去スイープを実行すると、それを処理するためにリソースが必要となり、パフォーマンスが低下します。 ただし、エビクターを頻繁に使用しないと、不要なエントリーがマップ内に存在するという結果となります。不要なエントリーでいっぱいのマップは、メモリー所要量にもマップに必要な処理用リソースにも悪影響を与えます。除去スイープ間隔を 15 秒に設定すると、ほとんどのマップで良好な事例が得られます。マップが頻繁に書き込まれ、高速のトランザクションで使用される場合は、この値をより低く設定することを検討してください。頻繁にマップにアクセスしない場合は、この時間をより高い値に設定することができます。

以下の例ではマップを定義し、新しい LFU Evictor を作成し、Evictor のプロパティーを設定し、Evictor を使用するようにマップを設定します。

//Use ObjectGridManager to create/get the ObjectGrid. Refer to 
// the ObjectGridManger section
ObjectGrid objGrid = ObjectGridManager.create............
BackingMap bMap = objGrid.defineMap("SomeMap");

//Set properties assuming 50,000 map entries
LFUEvictor someEvictor = new LFUEvictor();
someEvictor.setNumberOfHeaps(5000);
someEvictor.setMaxSize(7);
someEvictor.setSleepTime(15);
bMap.setEvictor(someEvictor);

LRU Evictor を使用するのは LFU Evictor を使用するのとよく似ています。次に例を挙げます。

ObjectGrid objGrid = new ObjectGrid;
BackingMap bMap = objGrid.defineMap("SomeMap");

//Set properties assuming 50,000 map entries
LRUEvictor someEvictor = new LRUEvictor();
someEvictor.setNumberOfLRUQueues(5000);
someEvictor.setMaxSize(7);
someEvictor.setSleepTime(15);
bMap.setEvictor(someEvictor);

LFU Evictor の例とは 2 行だけ異なっていることに注意してください。