Javaリソースの調整

Java Virtual Machine(JVM)を調整すると、パフォーマンスが向上したり、メモリーの消費量を抑えられる可能性があります。

Java Virtual Machine(JVM)を調整すると、パフォーマンスが向上したり、メモリーの消費量を抑えられる可能性があります。

ガーベージ・コレクションについて

ガーベージ・コレクション(GC)とは、Javaがメモリーで不要になったデータを削除するプロセスです。最適なパフォーマンスを実現するには、適切なガーベージ・コレクターとヒープ・サイズ設定を選択することが重要です。

間違いなく最小限に抑えたいのは、ガーベージ・コレクションの一時停止で、ストップ・ザ・ワールド・イベントとも呼ばれます。メモリー領域が満杯で、継続するには、JVMが空き領域を作成する必要がある場合、一時停止が発生します。一時停止中は、すべての操作が一時中断します。一時停止はネットワーキングに影響するため、クラスター内の他のノードに対して、そのノードはダウンしていると表示される場合があります。さらに、SELECT文およびINSERT文は待機するため、読み取りと書き込みのレイテンシーが増します。1秒を超える一時停止、その秒の大部分に追加される1秒以内の複数の一時停止を避けます。問題の根本的原因は、メモリー内に格納されたデータ率がデータを削除する速度を上回ることです。特定の症状と原因については、「ガーベージ・コレクションの一時停止」を参照してください。

memtable_heap_space_in_mb

Javaガーベージ・コレクターを選択する

DataStax Enterpriseでは、デフォルトでガーベージ・ファースト・コレクター(G1)を使用しています。以下の理由で、G1を推奨しています。
  • 16 GB~64 GBのヒープ・サイズ。

    G1は最初に、最も大きいガーベージ・オブジェクトを含むヒープの範囲をスキャンし常にヒープのコンパクションを行うため、大型のヒープの場合、CMS(コンカレント・マーク・スイープ)よりもパフォーマンスが優れています。一方で、ガーベージ・コレクションを実行する際、CMSはアプリケーションを停止します。

  • ワークロードは変数で、クラスターは常に別のプロセスを実行しています。
  • 将来のプルーフィングに備えて、CMSはJava 9で廃止予定です。
  • G1は構成が簡単です。
  • G1は自己調整します。
  • MAX_HEAP_SIZEのみ、設定する必要があります。
ただし、G1にはプロファイリングにより、ある程度のレイテンシーが伴います。
CMSは、以下の環境でのみ、推奨します。
  • ガーベージ・コレクションを手動で調整し、テストする時間と専門知識があります。

    ヒープにさらにメモリーを割り当てると、ガーベージ・コレクション機能により、ヒープ・メモリー内のデータベース・メタデータ量が増すため、パフォーマンスが低下する場合がありますのでご注意ください。

  • ヒープ・サイズは、16 GB以下です。
  • ワークロードは固定で、クラスターは常に同じプロセスを実行しています。
  • この環境では、可能な限り最小のレイテンシーが要求されます。
注: CMSの構成についてご不明な点がある場合、DataStaxサービス・チームにお問い合わせください。

Javaガーベージ・コレクターとして、CMSを構成する

  1. jvm.optionsを開きます。
  2. すべての行を、### GI Settingsセクションにコメントアウトします。
  3. すべての### CMS Settingsセクションをコメント解除します。

ヒープ・サイズを特定する

Javaヒープを大きく設定しがちですが、そうするとコンピューターのRAMのほとんどを消費することになります。ただし、この設定はOSのページ・キャッシュ操作を妨げる可能性があります。頻繁にアクセスするデータのOSのページ・キャッシュを保持するオペレーティング・システムは、このデータをメモリーを維持するのに長けています。OSのページ・キャッシュを調整するプロパティは通常、行キャッシュを大きくするよりも優れたパフォーマンスを発揮します。

データベースは、この数式に基づいて最大ヒープ・サイズ(MAX_HEAP_SIZE)を自動的に計算します。
max(min(1/2 ram, 1024 megabytes), min(1/4 ram, 32765 megabytes))
実稼働環境で使用する場合、以下のガイドラインに従って環境に応じてヒープ・サイズを調整します。
  • ヒープ・サイズは通常、システム・メモリーの¼から½になります。
  • オフヒープ・キャッシュおよびファイル・システム・キャッシュでも使用するため、すべてのメモリーをヒープに費やさないでください。
  • GCを調整する場合、GCロギングを常に有効にしてください。
  • 設定は徐々に調整し、各インクリメンタルの変更をテストします。
  • 特にDSE Searchを使用する際は、GCの並列処理を有効にします。
  • GCInspectorクラスは、ガーベージ・コレクションに要する時間が200ミリ秒を超えるガーベージ・コレクションに関する情報をログに記録します。ガーベージ・コレクションが頻繁に発生し、完了までにある程度の時間(秒)を要する場合、JVMに対するガーベージ・コレクションの圧力が大きいことを示します。ガーベージ・コレクション・オプションの調整に加え、その他の解決策にはノードの追加やキャッシュ・サイズの縮小があります。
  • G1を使用するノードの場合、DataStaxではMAX_HEAP_SIZEを可能な限り大きく(最大で64 GB)することを推奨しています。
注: 調整のヒントについては、「大型のヒープでGCの一時停止を改善するシークレットHotSpotオプション」を参照してください。

MAX_HEAP_SIZE

推奨される最大ヒープ・サイズは、使用するGCによって異なります。
ハードウェアのセットアップ 推奨のMAX_HEAP_SIZE
G1は最新のコンピューター用(8コア以上)で、最大256 GB RAM 16 GB~32765 MB。

Javaパフォーマンス調整」を参照してください。

CMSは最新のコンピューター用(8コア以上)で、最大256 GB RAM 16 GB以下。
従来のコンピューター 通常、8 GB。
以下の方法で、環境に応じた最適なヒープ・サイズを特定します。
  1. 1つのノードでjvm.optionsファイルの最大ヒープ・サイズを任意の高い値に設定します。たとえば、G1を使用する場合:
    -Xms48G
    -Xmx48G

    ストップ・ザ・ワールドGCの一時停止を避けるために、サイズ変更時は最小値(-Xms)および最大値(-Xmx)のヒープ・サイズを同じ値に設定し、起動時にヒープをメモリー内にロックすることで、スワップアウトを防げます。

  2. GCロギングを有効にします。
  3. ログを確認して、そのノードが使用しているヒープを表示し、クラスターのヒープ・サイズを設定する上でこの値を使用します。
注: この方法により、テスト・ノードのパフォーマンスが低下しますが、通常、クラスター・パフォーマンスが大幅に低下することはありません。

パフォーマンスの改善が見られない場合は、DataStaxサービス・チームまでご相談ください。

HEAP_NEWSIZE

CMSの場合、HEAP_NEWSIZEも調整する必要があります。この設定により、新しいオブジェクトまたはyoung generationに割り当てられるヒープ・メモリーの量が決まります。データベースは、以下の2つの少ない方でこのプロパティのデフォルト値をメガバイト単位(MB)で計算します。
  • コア数の100倍
  • MAX_HEAP_SIZEの¼
開始点として、物理的CPUコアごとにHEAP_NEWSIZEを100 MBに設定します。たとえば、最新の8コア+マシンの場合:
-Xmn800M

大規模なHEAP_NEWSIZEは、GCの一時停止時間が長くなります。小規模なHEAP_NEWSIZEの場合、GCの一時停止は短くなりますが、通常、負荷が大きくなります。

DataStax Enterpriseによるメモリーの使用方法

データベースは、JVM内で以下のメジャー・コンパクションを実行します。
  • 読み取りを実行するために、データベースはヒープ・メモリー内で以下のコンポーネントを維持します。
    • ブルーム・フィルター
    • パーティション・サマリー
    • パーティション・キー・キャッシュ
    • 圧縮オフセット
    • SSTableインデックス・サマリー

    このメタデータは、メモリーに常駐し、データの合計に比例します。一部のコンポーネントは、メモリーの合計サイズに比例して大きくなります

  • データベースは読み取りまたはアンチエントロピー・リペア用のレプリカを収集し、ヒープ・メモリー内でレプリカを比較します。
  • データベースに書き込まれたデータは、最初にヒープ・メモリー内のmemtableに格納されます。memtableは、ディスクのSSTableにフラッシュされます。
パフォーマンスを改善するには、次のようにデータベースはオフヒープ・メモリーを使用します。
  • ページのキャッシュ。データベースは、ディスク上のファイルを読み取ったときに、追加メモリーをページのキャッシュとして利用します。
  • ブルーム・フィルターと圧縮オフセット・マップはオフヒープに置かれます。
  • データベースは、キャッシュされた行をネイティブのメモリー、Javaヒープ外に格納します。これにより、JVMヒープに対する要求がともに小さくなります。これは、JVMガーベージ・コレクションのパフォーマンスにとって最適なヒープ・サイズを保つのに役立ちます。

その他のDataStax EnterpriseサービスのJVMパラメーターを調整する

  • DSE Search:一部のユーザーの報告によると、スタック・サイズを大きくすると、Tomcatのパフォーマンスが向上します。
    スタックのサイズを大きくするには、cassandra-env.shファイルで、デフォルトの設定をコメント解除して変更します。
    # Per-thread stack size.
    JVM_OPTS="$JVM_OPTS -Xss256k"
    また、memtable空間を小さくして検索キャッシュに空き領域を与えると、パフォーマンスが向上する可能性があります。cassandra.yamlファイル内のmemtable_heap_space_in_mbプロパティとmemtable_offheap_space_in_mbプロパティを変更して、memtable領域を変更します。
  • MapReduce:MapReduceはJVMの外で実行するため、JVMの変更はAnalytics/Hadoopの動作に直接影響しません。

その他のJMXのオプション

DataStax Enterpriseは、Java Management Extensions(JMX)を介して、その他の統計と管理操作を公開しています。JConsolenodetoolのユーティリティは、JMX対応管理ツールです。

cassandra-env.sh内の以下のプロパティを編集し、JMX管理のデータベースを構成します。

  • com.sun.management.jmxremote.port:データベースがJMX接続をリッスンするポートを設定します。
  • com.sun.management.jmxremote.ssl:JMXのSSLを有効または無効にします。
  • com.sun.management.jmxremote.ssl:JMXのリモート認証を有効または無効にします。
  • -Djava.rmi.server.hostname:JMXが接続に使用するインターフェイスのホスト名またはIPアドレスを設定します。接続に問題がある場合は、コメント解除して設定します。
注: デフォルトでは、ポート7199のJMXを使用して、認証なしで、DataStax Enterpriseと対話できます。

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml

cassandra-env.sh

cassandra-env.shファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra-env.sh
tarボール・インストール installation_location/resources/cassandra/conf/cassandra-env.sh

jvm.options

jvm.optionsファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/jvm.options
tarボール・インストール installation_location/resources/cassandra/conf/jvm.options