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 サービス (推奨) - JFR モニタリングは、フラッグシップモデルである New Relic Java エージェント に組み込まれています。追加の設定は必要なく、 Java エージェント をインストールし、 JFR サービス が有効になっていることを確認するだけで、JFR データが Java エージェントと同じ APM アプリケーションに流れ込みます。Requires New Relic Java agent version 7.0.0+.
- スタンドアロンプロセス-
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サブシステムが追加のメモリを使用することが予想されます。
自分のデータを見る
データを見るには、 one.newrelic.com > Explorer> (select service)> More Views> Realtime Profiling Java.
時系列でのJVMクラスタの挙動を把握
JVMクラスタのタイムラインビューは、クラスタ全体のJVMの動作を表示します。このタイムラインにより、トラブルシューティングや問題の検出を迅速に行うことができます。例えば、一目で分かるようになっています。
- 最近のデプロイメントが他のJVMクラスターに与える影響
- JVMの再起動時
- 個々のインスタンスがノイズの多い隣人からどのような影響を受けたか
トラブルシューティングを容易にするためには、JVM上で実行されているコードの高忠実度のランタイム特性を確認する必要があり、そのデータはリアルタイムで必要となります。
one.newrelic.com > Explorer> (select service)> Realtime Profiling Java: JVMクラスタのタイムラインビューでは、クラスタ全体のJVMの動作を表示します。
タイムラインの各行は、特定のJVMの時間経過を表しています。各行の内側にあるボックスは、そのJVMの5分間の期間を表しています。黄色、オレンジ、赤のトラフィックライトは、JVMの異常な動作を示しており、エラーやその他のパフォーマンス問題を調査する際に、そのインスタンスと適切な期間を掘り下げることができます。
How is JVM health determined? を選択すると、JVMの健全性がどのように計算されるかについての詳細な内訳が表示されます。
JVMの詳細
各JVMの詳細パネルには、いくつかの重要なビューが表示されます。
- プロセス内でのリソースの割り当て方
- ガベージコレクションがパフォーマンスに与える影響
- ガベージコレクションをログで追跡する方法
- CPUの使われ方
one.newrelic.com > Explorer> (select service)> Realtime Profiling Java> (select JVM): 各JVMの詳細を見ることができます。
フレイムグラフを用いたリソース集約型のコードパスの特定
重要
フレームグラフ機能は、 New Relic Java エージェント JFR サービス の利用シナリオにのみ対応しています。
"炎のグラフ" は、コールツリーを視覚化する方法の一つです。グラフの各ブロックは、関数を表しています。メソッドが消費するCPU時間とメモリリソースが多いほど、そのブロックは広くなります。
フレーム・グラフを使って、アプリケーション・コード内で最も頻繁に実行されるJavaクラスやメソッドを特定します。フレイムグラフを使ってコードのホットスポットを最適化することで、リソースの消費を抑え、アプリケーションの全体的なパフォーマンスを向上させることができます。
ここでは、フレイムグラフの色についてご紹介します。
- 明るい色:Java SEパッケージのメソッド。
- ダークカラー:他のライブラリからの方法
one.newrelic.com >エクスプローラー>(サービスの選択)>リアルタイムプロファイリングJava>(JVMの選択) :フレームグラフを含む、各JVMの詳細を表示できます。