New Relic の Java Flight Recorder (JFR) メトリクスを使用した Java 用リアルタイムプロファイリングを使用すると、本番環境の Java コードのプロファイリングを継続的かつ常時実行することができます。また、JVMクラスタのタイムライン表示により、クラスタ全体のパフォーマンス問題を迅速かつ直感的に診断することができます。例えば、アプリケーションのデプロイメントがクラスターの全体的な健全性にどのような影響を与えるかを素早く確認することができます。
パフォーマンスのボトルネックを見つける
Javaアプリケーションやサービスにおけるパフォーマンスのボトルネックをトラブルシューティングすることは、以下のような理解を深めるのに役立ちます。
- リソースを無駄にしている箇所
- インシデント発生時
- インシデントで起きたこと
- インシデントに至るまでのパフォーマンスの問題点
トラブルシューティングを迅速かつ容易にするためには、JVM上で実行されているコードのハイフィデリティなランタイム特性を確認する必要があり、そのデータはリアルタイムで必要となります。
JFRデーモン
JFRデーモンはJFRイベントのエクスポーターであり、JVMの動作を視覚化するためにNewRelicプラットフォームの機能を利用できます。基盤となる実装としてNewRelicJavaテレメトリSDKを使用して、JFRデーモンはJFRイベントをNew Relicテレメトリタイプに変換し、NewRelicのメトリックおよびイベント取り込みAPIに報告します。
JFRデーモンには3つの使用方法があります。
New Relic Javaエージェント JFR サービス(推奨) - 主力のNew Relic Javaエージェントに組み込まれた JFR 監視。 追加の設定は必要ありません。Javaagentをインストールし、 JFR サービスが有効になっていることを確認するだけで、JFR データは Javaagent と同じ
アプリケーションに流れ込みます。 New Relic Javaエージェント バージョン 7.0.0 以降が必要です。
Note
: JFR リアルタイム プロファイリングは、エージェント サーバーサイド コンフィギュレーションを介して切り替えることができます。 これにより、ターゲット アプリケーションを再起動せずにプロファイリングを切り替えることができます。
スタンドアロンプロセス-
jfr-daemon
をスタンドアロンプロセスとして実行し、リモートJMXを使用して既存のJavaプロセスを監視するように設定します。スタンドアロンJavaエージェント-
jfr-daemon
をJavaエージェントとしてJavaプロセスに接続します。 NewRelicJavaエージェントの軽量な代替品。
対応するJavaのバージョン
JFRデーモンはJava 11以上のバージョンをサポートしていますが、LTS以外のバージョンのJavaを本番環境で使用することはお勧めしません。
一部のベンダーは、JFRをJava 8バイナリにバックポートしています。例えば、OpenJDKではバージョン8u262でJFRをバックポートしています。JFRデーモンはこれらのJavaバージョンと互換性があります。
要件と使用方法
必要な条件や手順は、それぞれの利用シーンによって異なります。詳細については、それぞれの使用方法のリンクを参照してください。
- New Relic Java エージェント JFR サービス - 要件, 設定, 使用方法
- スタンドアロンプロセス - 要件, 構成, 使用説明書
- スタンドアロン Java エージェント - 要件, 構成, 使用説明書
重要
JFRデーモンを使用するアプリケーションでは、JFRサブシステムが追加のメモリを使用することが予想されます。
ヒント
Javaagent リリース 8.0.0 以降では、JVM を再起動せずに JFR プロファイリング設定を動的に変更できます。 これを行うには、 Settings > Application > Java Flight Recorderの設定を切り替えるか、 jfr.enabled
設定を変更してください。
自分のデータを見る
データを表示するには、 one.newrelic.com > All capabilities > APM & Services > (select service) > More views > Realtime Profiling Javaにアクセスしてください。
時系列でのJVMクラスタの挙動を把握
JVMクラスタのタイムラインビューは、クラスタ全体のJVMの動作を表示します。このタイムラインにより、トラブルシューティングや問題の検出を迅速に行うことができます。例えば、一目で分かるようになっています。
- 最近のデプロイメントが他のJVMクラスターに与える影響
- JVMの再起動時
- 個々のインスタンスがノイズの多い隣人からどのような影響を受けたか
トラブルシューティングを容易にするためには、JVM上で実行されているコードの高忠実度のランタイム特性を確認する必要があり、そのデータはリアルタイムで必要となります。
one.newrelic.com > All capabilities > APM & Services > (select service) > Realtime Profiling Java: JVM クラスターのタイムライン ビューには、クラスター全体の JVM の動作が表示されます。
タイムラインの各行は、特定の JVM を時系列で表します。各行内のボックスは、その JVM の存続期間のうちの 5 分間を表します。最も深刻なものから最も深刻なものまで、黄色、オレンジ、赤の信号は JVM の異常な動作を示しているため、エラーやその他のパフォーマンスの問題を調査するときに、そのインスタンスと適切な期間をドリルダウンできます。
JVM の健全性の計算方法の詳細な内訳については、 How is JVM health determined?を選択してください。
JVMの詳細
JVM の詳細ページを見つけるには、 one.newrelic.com > All capabilities > APM & Services > (select service) > Realtime Profiling Java > (select JVM)にアクセスしてください。
各JVMの詳細パネルには、いくつかの重要なビューが表示されます。
- ユーザーの CPU 使用率
- マシンの CPU 使用率
- ヒープ サイズ
- ガベージ コレクション期間
- ガベージ コレクションの最長休止時間
- ユーザー スレッドの CPU 使用率
- システム スレッドの CPU 使用率
- スレッドごとの小さなオブジェクトの割り当て
- スレッドごとの大きなオブジェクトの割り当て
- スレッドごとのネットワーク読み取り
- スレッドごとのネットワーク書き込み
- スレッドあたりのバッファ割り当てサイズ
- 合計スレッド割り当て
- スレッドあたりの合計オブジェクト割り当て
- メタスペース
フレイムグラフを用いたリソース集約型のコードパスの特定
重要
フレームグラフ機能は、 New Relic Java エージェント JFR サービス の利用シナリオにのみ対応しています。
"炎のグラフ" は、コールツリーを視覚化する方法の一つです。グラフの各ブロックは、関数を表しています。メソッドが消費するCPU時間とメモリリソースが多いほど、そのブロックは広くなります。
フレーム・グラフを使って、アプリケーション・コード内で最も頻繁に実行されるJavaクラスやメソッドを特定します。フレイムグラフを使ってコードのホットスポットを最適化することで、リソースの消費を抑え、アプリケーションの全体的なパフォーマンスを向上させることができます。
ここでは、フレイムグラフの色についてご紹介します。
- 灰色のグラデーション: Java SE パッケージのメソッドに灰色のグラデーションを適用します。呼び出し数が少ないほど明るい色合いになり、呼び出し数が増加するにつれて徐々に暗い色合いに移行します。
- 黄-オレンジ色のグラデーション: 黄-オレンジ色のグラデーションを他のライブラリのメソッドに適用します。呼び出し数が少ないほど黄色が多くなり、呼び出し数が増加するにつれて徐々にオレンジ色が多くなります。
one.newrelic.com > APM & Services > (select service) > Realtime Profiling Java > (select JVM): フレームグラフを含む各 JVM の詳細を確認できます。