JDK Flight Recorder Support in VisualVM

原文はこちら。
https://medium.com/graalvm/jfr-support-in-visualvm-62fddd4f0795

JDK Flight Recorder サポートのプレビューが、GraalVM 19.2と同梱されているVisualVMプラグインとしてリリースされました。このプラグインがJava 7以後で作成された全てのJFRスナップショットを読み取り、VisualVMの画面に表示します。

JDK Flight Recorder (JFR、以前は Java Flight Recorder でした)は実行中のJavaアプリケーションの診断データやプロファイルデータを収集するツールです。Java Virtual Machine (JVM)に統合されているためほとんどパフォーマンスに影響しません。そのため、高負荷の本番環境でも利用できます。

Monitor tab of the VisualVM JFR viewer

現在ご利用いただける機能とビューは以下の通りです。

タブ説明
Overview例えばmainクラスや引数、JVMバージョン、構成、システムプロパティといった、記録されたプロセスに関する基本的な情報を表示。
このタブでは記録されたスレッドダンプへのアクセスも可能。
Monitorプロセスの起動時間と基本的なテレメトリ(CPU利用量、ヒープや目メタスペースの利用状況、ロードされたクラスの個数や動作中、開始済みのスレッド個数など)を表示。
Threads記録の設定をベースに、できる限り詳細にスナップショットに記録した全てのイベントに基づいてスレッドのタイムラインを再構築して表示。
Locksスレッドの同期を分析できる
File IOファイルシステムへの読み書きイベントに関する情報を表示
Socket IOネットワークへの読み書きイベントに関する情報を表示
SamplerスレッドごとのCPU利用率やメモリ割り当て、ヒープのヒストグラムを表示。記録イベントからCPUスナップショットを生成するCPU samplerという実験的な機能もある。正確なパフォーマンス分析はできないが、それでも記録されたアプリケーションで何が起こっていたのか、CPUボトルネックの可能性はどこなのかを理解する上では有用。
Browserスナップショットに記録された全てのイベントの汎用ブラウザ
Environment記録マシン構成や状況(CPUモデル、メモリサイズ、OSのバージョン、CPU利用状況、メモリ利用状況など)の概要を確認できる
Recording記録の構成と基本的なスナップショット・テレメトリ(イベントの件数、全記録時間など)をリスト表示 

JVM内部の分析(analyzing JVM internals)、イベントスタックトレースの表示や活動中のプロセスからのJFRスナップショット作成のサポートは現在のプレビュー版ではご利用いただけませんが、今後のリリースで漸次対応していく予定です。

Threads tab of the VisualVM JFR viewer

JFRサポートをインストールするには、

  • GraalVM 19.2以後のリリースをダウンロードしてインストール
    https://www.graalvm.org
  •  <GRAALVM_HOME>/bin/jvisualvm を起動してVisualVMを開始
  • Tools | Plugins | Available Pluginsを使って、利用可能な全てのプラグインを見て、 VisualVM-JFR と VisualVM-JFR-Generic モジュールをインストール

File | Load… もしくはJFRスナップショットノードをダブルクリックしてJFRスナップショットを開くことができます。スナップショットは永続的にJFRリポジトリに追加できます。

JFRスナップショットを作成するには、ご利用のJavaバージョンのドキュメントに従ってください。GraalVM Enterpriseの場合、以下のパラメータをjavaコマンドに追加すればJFRスナップショットを作成できます。

<GRAALVM_HOME>/bin/java -XX:+UnlockCommercialFeatures 
-XX:StartFlightRecording=duration=10s,filename=filename.jfr -jar ...

OpenJDK 8ではJFRをサポートしていないため(ここで言っているJFRはJDK Flight Recorder)、GraalVM 19.2 CEでJFRスナップショットを作成することができません。OpenJDK 11以後のリリースを使ってJFRスナップショットを作成してください。

<OPENJDK11_HOME>/bin/java -XX:StartFlightRecording=duration=10s,filename=filename.jfr -jar ...
Environment tab of the VisualVM JFR viewer

Trying it out

Javaアプリケーションでテストしたいものの、すぐに使えるお気に入りのアプリケーションがない場合は、たとえばSpring PetclinicというサンプルWebアプリケーションでお試し頂けます。クローンしてビルドし、準備しましょう。

A sample Spring-based application
https://github.com/spring-projects/spring-petclinic

git clone https://github.com/spring-projects/spring-petclinic.git
mvn clean package -DskipTests=true
# verify it works: 
<GRAALVM_HOME>/bin/java -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar

上記手順でサンプルアプリケーションが動作し、 localhost:8080 からアクセスできます。

やるべきことは、javaコマンドに上記のコマンドラインオプションを追加するだけです。これでFlight Recorderがプロファイル情報を収集します。

<GRAALVM_HOME>/bin/java -XX:+UnlockCommercialFeatures -XX:StartFlightRecording=dumponexit=true,filename=petclinic.jfr -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar

dumponexit=true コマンドでは、アプリケーションの実行の最後にファイルに書き出します。別のオプションでは記録の時間を指定しています。

アプリケーションを開き、クリックしていってみてください。もし、wrkのような負荷生成ツールを持っているのであれば、より意味のあるサンプルワークロードを生成できます。

A constant throughput, correct latency recording variant of wrk
https://github.com/giltene/wrk2

例えば、以下のコマンドは30秒間実行中のアプリケーションのWebページの一つに負荷をかけます。

wrk -d30s -R2000 http://localhost:8080/owners\?lastName\=

アプリケーションを停止し、petclinic.jfrファイルが存在することを確認して、先ほどの説明に従いVisualVMに読み込みます。

VisualVMからJFRがアプリケーションの記録をした日を調査できます。

JFR data for a sample run of Spring Petclinic application displayed in VisualVM

JFRはパフォーマンス分析に最適なツールの1つです。GraalVM Enterpriseでの処理を改善したいワークロードがある場合は、GitHubなどでGraalVMチームに連絡できます。最適化の機会があれば調査を試みます。

GraalVM: Run Programs Faster Anywhere 🚀
http://github.com/oracle/graal

VisualVMでのJFRサポートについてのフィードバックをお待ちしています。次のバージョンでどの機能をご覧になりたいかお知らせください。この記事(もちろん原文にお願いします)のコメント欄、http://visualvm.github.io/feedback.htmlにコメントを残す、もしくは、https://github.com/oracle/visualvm/issuesでRFE/bugを提出してください。

Feedback
http://visualvm.github.io/feedback.html
Issues
https://github.com/oracle/visualvm/issues

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中