Java Profilers: なぜこれら 3 つの異なるタイプが必要なのか

運用中のパフォーマンス問題をデバッグすることは、適切なツールなしでは苦痛であり、場合によっては不可能なこともありえます。 Java プロファイリングはずっと存在していますが、ほとんどの開発者が考える Java プロファイリングは 1 種類だけです: 標準 JVM プロファイリング。 実行可能な複数のプロファイリング活動があります。 一般に、標準的なプロファイラーは、メモリ プロファイリング、CPU プロファイリング、およびスレッド プロファイリングを扱います。

しかし、これだけの範囲をカバーしていても、複数のプロファイラーを組み合わせて使用すれば、よりパフォーマンスの問題を発見することができます。 これは、パフォーマンス バグを追跡するには、それぞれのプロファイラーが特定の側面で優れているからです。

Java Profiler

この投稿では、Java プロファイラーの 3 種類について、また、なぜアプリケーション開発中にそれらのすべてが必要なのかについて説明します。

  1. 標準 JVM プロファイラーは、JVM のすべての詳細 (CPU、スレッド、メモリ、ガベージ コレクションなど) を追跡します。
  2. 実稼働環境でアプリケーションを監視するために使用されるアプリケーション パフォーマンス管理 (APM) ツール。
New call-to-action

標準 JVM プロファイラー

VisualVM, JProfiler, YourKit および Java Mission Control など。

標準Javaプロファイラーは確かに最もデータを提供するが、必ずしも最も役に立つ情報というわけでもない。 これは、デバッグ タスクのタイプに依存します。

JVM プロファイラーは、すべてのメソッド呼び出しとメモリ使用量を追跡します。 これは、開発者がどのような角度でも呼び出し構造に潜り込むことを可能にします。

Pros:

  • メモリ リークを追跡するために素晴らしい、標準プロファイラーは JVM によるすべてのメモリ使用とどのクラス/オブジェクトが原因かを詳細に説明する。 手動でガベージ コレクションを実行し、メモリ消費をレビューする機能は、エラーでメモリにしがみついているクラスおよびプロセスに簡単にスポットライトを当てることができます。
  • CPU 使用率を追跡するのに適しており、Java プロファイラーは通常、クラスおよびメソッドごとに CPU 時間を追跡および集計する CPU サンプリング機能を提供し、ホットスポットに的を絞るのに役立ちます。 (注意: 一部のプロファイラーは、スレッドおよびメモリ ダンプを限定的に使用できます。)
  • アプリケーションの速度が低下する。

Lightweight Java Transaction Profilers

XRebel や Stackify Prefix など。

Lightweight Profilers は、コードに直接注入することにより、アプリケーションの追跡で異なるアプローチを取ります。

  • Aspect Profilers はアスペクト指向プログラミング (AOP) を使用して、特定のメソッドの開始と終了にコードを注入します。 注入されたコードはタイマーを開始し、メソッドが終了したときに経過時間を報告することができます。 これらのプロファイラーを設定するのは簡単ですが、何をプロファイリングすればよいかを知っておく必要があります。 例については、Spring AOP Method Profiling.
  • Java Agent プロファイラーは、Java Instrumentation API を使用して、アプリケーションにコードを注入します。 この方法は、コードがバイトコードレベルで書き直されるため、アプリケーションへのアクセスがより容易になります。 これにより、アプリケーションで実行されているすべてのコード、つまり、あなたが書いたコードやアプリケーションが依存しているサードパーティライブラリをインスツルメンテーションすることができます。

アスペクト プロファイラーはセットアップが非常に簡単ですが、監視できるものが限られており、追跡したいものすべてを詳細に記述しなければならないのが難点です。

Stackify Prefix は、舞台裏で Java Agent プロファイラー手法を使用する、開発者指向の Java プロファイラーです。 さらに、インストルメンテーションからすべての統計情報を取得し、シンプルで理解しやすい方法で表示します。

例として、Hibernate を使用してアプリケーションを実行すると、Prefix はクエリの経過時間の詳細を表示するだけでなく、生成した SQL のパラメータ値も表示します。 アプリケーションが SOAP/REST API を呼び出す場合、Prefix は要求と応答のコンテンツを提供します。

Java Profiler Prefix example
Prefix Screenshot: Tomcat Web Request Trace

Low Overhead, Java JVM Profiling in Production (APM)

これまでのすべてのプロファイラーは、開発には最適でしたが、運用時にシステムがどのようにパフォーマンスするかを追跡することは非常に重要です。

本番環境は常に異なる環境です。開発環境とステージング環境は通常、同じデータセットと負荷を持ちません。

Java APM ツールは通常 Java Agent プロファイラーの手法を使用しますが、本番環境でパフォーマンスに影響を与えずに実行できるよう異なる測定ルールを設定します。 これらのプロファイラーのトリックは、CPU サイクルを占有しないようなスマートな方法で正しい情報を提供することです。 これにより、実稼働環境で実行されているアプリケーションのコードをメソッド レベルで可視化できます。

したがって、遅い Web リクエストがある場合、それは Retrace に表示されるトレースに変換されます。 そこから、どのメソッドが原因であるかを詳細に調べることができます。 Web Request Aggregation over 4 hours

java profiling tomcat trace
Retrace Screenshot: Tomcat Web Request Trace

Why Do You Need All 3 Profilers for Your Application?

標準プロファイラーは、開発段階でのパフォーマンスの問題を見つけるのに適しています。 しかし、実稼働環境は異なるシナリオです。 アプリケーションの動作は、受信トラフィック、サーバーのリクエスト、レスポンス、およびその他多くのものに基づいて変化します。

では、運用環境に対する解決策は何でしょうか。 APM ツールがその答えです。 APM ツールは本番環境をターゲットとし、アプリのパフォーマンスに関するレポートを提供します。

つまり、標準のプロファイラーは開発時に役立ち、APM ツールは本番環境に役立ちます。 軽量トランザクション プロファイラーの必要性について疑問に思うかもしれません。

軽量プロファイラーは、コード プロファイリングに対して異なるアプローチを取ります。 コード (特にメソッドの最初と最後) に直接注入します。

また、セットアップが簡単で、消費するリソースも比較的少なくなります。 これは、ハードウェア トランザクション メモリを使用するアプリケーションにとって非常に有用です。 これらのアプリケーションでは、どのメソッドまたは関数がパフォーマンスの問題を引き起こしているかを正確に指摘する、洗練された分析ツールが必要です。 各プロファイラーのタイプは、アプリケーションのパフォーマンス問題をチェックする独自のアプローチを持っています。

RebelLab の調査では、ほとんどの企業がアプリケーションのパフォーマンス問題を見つけるために複数のコード プロファイラーを使用していることも明らかになりました。 Stackify Prefix は無料で、同じ機能の多くを提供します。

APMソリューションの最大の問題は、間違いなくその価格設定です。 従来、APM ソリューションは非常に高価であったため、大企業しか購入することができませんでした。

Azure や AWS のサーバーに月約 100 ドル、New Relic のような製品に月約 200 ドルかけるのはあまり意味がありません。

監視ツールはサーバーより高くはならない!

詳しくはこちら。 APM の価格がすべての開発者にとって手頃になり、気にかけるべき理由

Wrapping It Up

さて、Java コード プロファイラーの 3 つのタイプについて学んだので、本当にそれらすべてが必要かどうかを判断する時がきました。

宅配便施設の追跡システムのような Web アプリケーションを開発している場合、そのアプリケーションには何千人ものユーザーがアクセスする可能性があります。 その場合、本番環境用の APM ツールも必要になります。

最後に、アプリケーションが組み込みシステム用であれば、これら 3 つすべてが必要になります。

よく選択し、最適なパフォーマンスを提供するアプリケーションを楽しく開発しましょう。

コメントを残す

メールアドレスが公開されることはありません。