オフヒープ・キャッシュの管理

オフヒープ・キャッシュの構成

ストアの各レプリケーション・ノードは、使用可能なメモリーを、ストア・オブジェクトを含むメモリー、ホスト・オペレーティング・システムによって使用されるメモリー(ファイル・システム・キャッシュを含む)、および頻繁にアクセスされるストア・データの格納に使用されるインメモリー・キャッシュに分割します。キャッシュによって使用されるメモリー容量は、rnHeapPercentパラメータを使用して構成できます。これは、レプリケーション・ノードで使用可能な合計メモリーのパーセンテージとして表されます(つまり、Java VMで使用可能として設定されたメモリー容量によって決まります)。デフォルトでは、レプリケーション・ノードで使用可能なメモリーの70%がインメモリー・キャッシュのために確保されます。

ただし、これがいっぱいになる可能性はあります。その場合は、Least-Recently-Used (LRU)アルゴリズムに基づいてオブジェクトがキャッシュから削除され、よくアクセスされるオブジェクトがキャッシュに残ります。

オーバーフローしないようにインメモリー・キャッシュに特に大きな容量を設定してレプリケーション・ノードを構成することは可能です。ただし、キャッシュが大きくなりすぎると、いくつかのデメリットが発生します。この中で最も重要なものは、Javaガベージ・コレクションのパフォーマンスが低下する可能性があることです。これによって、レプリケーション・ノード全体のパフォーマンスが悪影響を受けます。このため、一般的にはヒープ・サイズを32GB未満にしておくことをお薦めします。これによりキャッシュ・サイズは約27.2GBに制限されます。

注意

Oracle NoSQL Databaseでは最大ヒープ・サイズをデフォルト値の32GBに制限して、大きすぎるキャッシュを誤って作成しないように防いでいることに注意してください。この値はrnHeapMaxMBを使用して管理されます。これについてはこの項の後半で詳しく説明します。

レプリケーション・ノードのヒープのサイズを小さくすると、デフォルトでは、ヒープで使用されないメモリーはオペレーティング・システムとファイル・システム・キャッシュで使用されます。大きなファイル・システム・キャッシュにはパフォーマンスのメリットがありますが、デメリットもあります。

  1. メイン・キャッシュとファイル・システム・キャッシュの間の冗長性が高くなります。すべてのデータと、レプリケーション・ノードによってロギング(書込み)が行われるBツリー情報は、ファイル・システムにもメイン・キャッシュにも含まれるためです。

  2. ダーティBツリー情報をロギングせずにファイル・システム・キャッシュに配置することはできません。これを除けば、このロギングは不要です。ロギングによって内部クリーナ・スレッドの追加処理が発生します。

インメモリー・キャッシュとファイル・システム・キャッシュが大きすぎるせいで発生する問題を回避するには、レプリケーション・ノードがオフヒープ・キャッシュを使用するように構成することもできます。オフヒープ・キャッシュを使用して、オーバーフローした場合にメイン・キャッシュから削除されるレコード・データとBツリー・ノードを格納します。オフヒープ・キャッシュがオーバーフローした場合は、メイン・キャッシュで使用されるのと同じLRUアルゴリズムに基づいて削除が行われます。

注意

本番のストアにオフヒープ・キャッシュを構成する前に、パフォーマンス・テストを行う必要があります。

オフヒープ・キャッシュの構成

オフヒープ・キャッシュで使用可能なメモリー容量を直接制御することはできません。このメモリーを設定するには、主としてオペレーティング・システムで使用可能なメモリー容量を制限します。また、場合によってはJavaヒープのサイズを制御する必要もあります。これによって、インメモリー・キャッシュのサイズが制御されます。ヒープとオペレーティング・システムの要件が満たされた後で残ったレプリケーション・ノードのメモリーが、オフヒープ・キャッシュに使用されます。メモリーが残らない場合、オフヒープ・キャッシュは使用されません。

オフヒープ・キャッシュの(間接的な)構成に使用するパラメータについて次で説明します。

  1. systemPercent

    これは、ストレージ・ノードで使用可能なメモリーのパーセンテージを定義します。これからヒープ要件を除いたのメモリーをオペレーティング・システムが使用できます。デフォルトではこの値は100%です。この値を100%未満の数に構成すると、オフヒープ・キャッシュ用のメモリーが残る可能性があります(ストレージ・ノードのメモリーとこのパラメータで選択する値によって異なります)。残りのメモリーがオフヒープ・キャッシュで使用できる場合は、オフヒープ・キャッシュが有効になります。

    ほとんどの本番システムでは、オフヒープ・キャッシュを構成する場合にこのパラメータの値を10%にすれば十分です。

  2. rnHeapMaxMB

    これは、Javaヒープで使用可能な最大メモリー容量です。(ヒープはインメモリー・キャッシュが含まれるところです。)ヒープのサイズはこの数よりも小さくなります。または、次のようにrnHeapPercentパラメータ値を使用した結果のサイズになります。

     total SN memory * rnHeapPercent = Heap Size  

    rnHeapPercentのデフォルト値は85%です。つまり、ストレージ・ノードのメモリーが32GBの場合、ヒープ・サイズは32 * 0.85 = 27.2GBになります。ただし、rnHeapMaxMB25,600 (25*1024)に設定すると、ヒープ・サイズは25GBになります。

    ヒープ・サイズはインメモリー・キャッシュ・サイズと同じではないことに注意してください。インメモリー・キャッシュ・サイズはヒープ・サイズのパーセンテージとして表されます。デフォルトではこれは70%です(rnCachePercentパラメータを使用して構成可能)。したがって、ヒープ・サイズが27.2GBの場合、インメモリー・キャッシュ・サイズは19.04GB (27.2 * 0.7)になります。

    注意

    ここで説明するパラメータに指定された値や、ヒープで使用可能な実際のメモリーにかかわらず、ヒープ・サイズは最大32GBに制限されます。

たとえば、ストレージ・ノードのメモリーが64GBで、レプリケーション・ノードが1つのみの場合、デフォルトでは次のようになります。

  • ヒープ・サイズは32GBです。(64 * .85 = 54.4ですが、これは最大サイズ32GBを超えているため。)

  • インメモリー・キャッシュ・サイズは22.4GB (32 * 0.7)です。

  • システム・メモリーは32GBです。システム・メモリーは、ヒープが取り除かれた残りの100%です。64GB (使用可能な合計容量) - 32GB (ヒープ・サイズ) = 32GBが、オペレーティング・システムおよびファイル・システム・キャッシュ用になります。

オフヒープ・キャッシュを構成する場合は、システム・メモリーを10%に設定します。(パーセンテージをこれよりも増やすことができますが、オフヒープ・キャッシュは小さくなります。)ストア内の各ストレージ・ノードでこのようにします。これによってストレージ・ノードが再起動することに注意してください。

kv-> change-policy -params systemPercent=10n change-parameters \
-service sn1 -wait -params systemPercent=10
Executed plan 5, waiting for completion...
Plan 5 ended successfully
kv-> 

これによって次のように設定されます。

  • ヒープ・サイズ32GB、インメモリー・キャッシュ・サイズ22.4GB。デフォルト構成は変更されていません。

  • システム・メモリー・サイズ3.2GB。((64 - 32) * .1)

  • オフヒープ・キャッシュ・サイズ28.8GB。これは、ヒープとシステムの要件が満たされた後に残ったメモリーの容量です。

注意

オフヒープ・キャッシュによってストアのパフォーマンスが向上するか低下するかは、ストアのワークロードによって決まります。オフヒープ構成を本番に配置する前にパフォーマンスのテストが必要です。