JRockit JVMの最適化チェックリスト/チューニングガイド
Pages: 1, 2, 3

まとめ

この記事に記載された情報は完全なものではありません。しかし、JRockit JVM層の最適なチューニングと十分な理解への第1歩となるはずです。

パフォーマンステスト中のJRCMD/JRA

JRA記録を作成するには、コマンドラインを使用するか、EclipseベースのJRockit Mission Control(JRMC)ツールを使用します。JRMCを使用すると、複数のJRockit JVMに接続してJRA記録を収集したり、JVMのリアルタイムデータを参照したり、メモリリークを検出してトラブルシューティングを行ったり、アプリ ケーション内のレイテンシ(実行が遅い部分)を確認したりすることができます。JRockit Mission Controlの実行方法については、この後のセクションを参照してください。

  1. 開発ライセンスをダウンロードします。
  2. この「license.bea」を<JROCKIT_HOME>/jreディレクトリに追加し、フルパスが<JROCKIT_HOME>/jre/license.beaになるようにします。
  3. 次のように入力してJRCMDを実行します。jrcmd.sh <PID> jrarecording filename=myrecording.xml time=600(ファイルはローカルディレクトリまたはフルパスとファイル名を指定して記述)あるいはjrcmd.sh <PID> print_threads。
  4. オフラインのJRAツールを使用して、作成されたmyrecording.xml.zipファイルを分析します。JRAツールは、<JROCKIT_HOME>/binでJRAのバイナリを実行すれば、このディレクトリに現れます。
  5. JRCMDに関するドキュメントを参照してください。

JRockit Mission Control

  1. JRockitを使用するWebLogicインスタンスの開始行に、次のように追加します。
    java -Xmanagement:autodiscovery=true,ssl=false,authenticate=false,port=7091
  2. 次のように入力してJRockit Mission Controlを起動します。<jrockit-install-directory>/bin/jrmc.exe(sh)
  3. 必要な場合は、JR Mission Controlのlicense.beaファイルを<JROCKIT_HOME>/jre/license.beaに追加します。
  4. Mission Controlを使用すると、JRA記録、メモリリーク、レイテンシの確認、および監視をすべて1か所で行うことができます。

テスト中のヒープ/スレッドのスナップショット

  1. ctrhandler.actという名前の簡単なテキストファイルを作成し、<JROCKIT_HOME>/jre/bin/jrockitディレクトリに置きます。
  2. スレッドダンプのコマンド(kill -3)など)を実行すると、JRockitによってこのファイルが確認され、コマンドのリストが実行されます。
  3. ctrlhandler.actファイルには次の情報を含める必要があります。
#ctrlhander.act file located in the <jrockit_home>/jre/bin/jrockit directory

set_filename filename=./jrocket_control_breakoutput.txt append=true

timestamp

print_threads

timestamp

version

print_class_summary

print_object_summary increaseonly=true

print_threads

print_threads nativestack=true

print_utf8pool

timestamp

print_memusage

timestamp

heap_diagnostics

timestamp

# The following is optional and is another way to generate a JRA

recording

jrarecording filename=./myjra.xml time=600

Linuxでの-XXlargePagesの設定

質問:なぜlargePagesを使用するのですか。

回答:largePagesを使用すると、ヒープメモリがロックされ、スワップのページアウトの対象にならないというメリットが あります(IOWaitとGCを低減できる場合もあります)。物理メモリのヒープ内にあるオブジェクトにアクセスした方が明らかに高速で処理できます。し たがって、largePages オプションは、パフォーマンスの目標を達成するには効果的なオプションです。

  1. マシンでラージページがサポートされている場合、 cat /proc/meminfoの出力は次のようになります。
    HugePages_Total: xxx
    
    HugePages_Free:  yyy
    
    Hugepagesize:    zzz KB
    
    xxxが0の場合、ラージページは割り当てられていません。
  2. マシンでラージページがサポートされていない場合、CONFIG_HUGETLBFS(「File systems」の下)およびCONFIG_HUGETLB_PAGE(CONFIG_HUGETLBFSを選択すると自動的に選択)の各設定オプション を指定してLinuxのカーネルを構築する必要があります。
  3. 次に、Linuxでラージページを割り当てます。メモ:ラージページを割り当てることができるのはrootだけです。
    1. ファイルシステムをマウントします。JRockitでhugepagesファイルシステムが使用されます。これはメモリ内のファイルシステムで す。ファイルシステムのマウントは次の手順で行います。実際のmountコマンドおよびchmodコマンドは、マシンを再起動するたびに実行する必要があ ります。または、このコマンドを/etc/rc.d/rc.localなどのファイルに追加することもできます。
            mkdir -p  /mnt/hugepages
      
              mount -t hugetlbfs nodev /mnt/hugepages
      
              chmod 777 /mnt/hugepages
      
    2. ヒュージページを割り当てます。割り当てるメモリ容量を指定すると、この作業は動的に実行されます。割り当て時にページは予約され、通常のページとして使用できなくなります。割り当て、または割り当ての解除は、次のように行います。

      echo 20 > /proc/sys/vm/nr_hugepages
      

ここで、20という数字は予約するページ数を表します。割り当てを解除するには、0ページを割り当てます ( メモ:適切な数値を決定する方法については、この後の質問を参照してください)。

要求したページ数がすべて予約されない場合、メモリの空き容量が不足しています。十分な空き容量があるはずの場合は、メモリが過度に断片化されてい る可能性があります。この場合、マシンを再起動することをお勧めします。ラージページはスワップできないため、すべてが物理メモリに維持される必要があり ます。

RHEL3では、このファイルは/proc/sys/vm/hugetlb_poolという名前のようなので、コマンドは次のようになります。

echo 500 > /proc/sys/vm/hugetlb_pool

ここでは、500という数字はページ数ではなく、要求しているMBを表します。JRockitで一時的なヒュージページのファイルを直接削除できな かった場合、実行後に削除する必要があります。削除しないと、これらのページは解放されるまで使用できません。これはRedHatカーネルのビルド 2.4.18-e.25.smpでは使用できますが、2.4.18-e.12.smpでは使用できません。

質問:/proc/sys/vm/nr_hugepagesに送信するのに適切な数値は、どのように決定すればいいでしょうか。

回答:Javaヒープ全体をlargePagesに入れることが目的なので、ヒープの大きさとページサイズによって答えは異なり ます。/proc/sys/vm/nr_hugepagesに適した数値を決定する方法は、次の例に示すように簡単です。例えば、所定の数値が以下のとお りだとします。

JVM Max Heap = 1536MB (1572864 KB approx)

HPAGE_SIZE = 2 MB

この場合、/proc/sys/vm/nr_hugepagesに送信する値は、およそ7.7となります(1572864MB/2MB)。

メモ:

ラージページの数を動的に設定するのは理論上は可能ですが、実際にはそれほど動的にはなりません。ラージページの数を減らすのは難しくないのです が、数を増やすのが困難です。これは、ラージページを作成するためには、Linuxで十分に大きい連続するメモリ領域を見つける必要があるためです。この ような領域が見つからなかった場合、ラージページは作成できません。

起動直後は、メモリの断片化がそれほど進んでいないので十分に大きい領域を見つけるのは難しくありません。しかし、マシンの実行時間が長くなると、 メモリの断片化が進みます。このため、十分な数のラージページを割り当てるには、起動スクリプトを使用するか手動で起動し、その直後にページを設定する必 要があります。

Steven Pozaryckiは、BEA Systemsの主席システムエンジニアとして、お客様がBEA製品で運用するミッションクリティカルアプリケーション向けのソリューションの構築、および複雑な問題のトラブルシューティングと解決に取り組んでいます。