Realtime Compute for Apache Flink は、JVM レベルで実行中のデプロイメントにおけるパフォーマンスボトルネックを診断するための組み込みプロファイリングツールを提供します。フレームグラフを使用して CPU のホットスポットを特定し、JVM の各領域におけるメモリ割り当てを確認し、サンプリングおよびスレッドダンプを通じてスレッドの動作を分析します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーに、Realtime Compute for Apache Flink の名前空間レベルの権限が付与されていること。詳細については、「名前空間権限の付与」をご参照ください。
制限事項
デプロイメントのパフォーマンス監視は、Ververica Runtime (VVR) 4.0.11 以降でのみサポートされます。
パフォーマンスデータは、実行中のデプロイメントのみで利用可能です。過去のデプロイメントデータは保持されません。
ツールの選択
調査対象の症状に最も適したツールから始めます。
| 症状 | ツール | 表示内容 |
|---|---|---|
| CPU 使用率が高い、またはスループットが遅い | フレームグラフ | CPU 消費量の多いメソッドとその呼び出しスタック |
| メモリ圧迫が疑われる | フレームグラフ(Alloc モード)または メモリ | 関数単位のメモリ割り当て、または JVM の各領域(ヒープ/ノンヒープ/メタスペースなど)におけるメモリ使用量 |
| スレッド競合またはデッドロックが疑われる | フレームグラフ(Lock モード)または スレッド | ロック競合のパターン、またはサンプリングによるスレッド単位のスタックトレース |
| すべてのスレッド状態の完全スナップショットが必要 | スレッドダンプ | 単一時点におけるすべてのスレッドのスタック |
フレームグラフ
フレームグラフは、呼び出しスタックを層状の水平バーで可視化します。各バーはスタックフレームを表し、最下層はアプリケーションのエントリポイント、上層はより深い関数呼び出しに対応します。バーの幅が広いほど、その関数が消費した CPU 時間が多く、パフォーマンスボトルネックの主な指標となります。
フレームグラフの概念に関する背景情報は、Apache Flink ドキュメントの「フレームグラフ」をご参照ください。
フレームグラフのモード
| モード | 収集対象 |
|---|---|
| CPU | アクティブに実行中のスレッドからのスタックトレース。幅の広いフレームは、高い CPU 使用率を示します。 |
| Alloc | 各関数によって割り当てられたメモリ。ヒープ圧迫を最も引き起こす関数を特定します。 |
| Lock | ロック競合およびデッドロックのパターン。ロックの取得待ちとなっている関数を強調表示します。 |
| ITimer | サンプリング間隔内の全スレッドにおける CPU 消費量。CPU モードと類似していますが、perf_events のサポートを必要としません。 |
フレームグラフによるボトルネックの特定

幅の広いフレームを確認します。 幅の広いフレームは、他の関数と比較してその関数が占める CPU 時間の割合が大きいことを意味します。これはホットスポットを示す最も一般的な指標です。
フレームの出現頻度を確認します。 サンプル全体で繰り返し現れるスタックフレームは、頻繁に呼び出される関数を示しており、累積的なパフォーマンス劣化を引き起こす可能性があります。
縦方向の位置を解釈します。 グラフの下部近くに幅の広いフレームがある場合、メインアプリケーションパスまたはエントリポイントコードに問題がある可能性があります。上部近くにある場合は、呼び出しスタックの深部にある特定の関数に問題がある可能性があります。
ホットスポットの最適化を行います。 問題のある関数を特定した後、該当するコードをレビューします。一般的な最適化には、ループ反復回数の削減、データ構造の改善、同期処理の最小化などが含まれます。
変更前後の比較を行います。 最適化を適用した後、新しいフレームグラフを生成し、以前のものと比較してボトルネックが解消されたかを確認します。
フレームグラフはサンプルデータから生成されるため、実行コンテキストの全体像を捉えることはできません。より正確な診断を行うには、本トピックで説明する他のパフォーマンスツールと併用することを推奨します。Java 以外の関数は、フレームグラフ上で「unknown」と表示されます。詳細については、「async-profiler のディスカッション」をご参照ください。
メモリ
メモリ タブでは、JVM の各領域(ヒープ、ノンヒープ、メタスペースなど)におけるメモリ使用量を確認できます。このビューを使用して、メモリリーク、過剰な GC、または JVM 領域の上限に近づいている状態を特定します。
スレッド
スレッドのサンプリングは、一定のタイムウィンドウ内で個々のスレッドからスタックトレースを収集し、パフォーマンス問題発生時の各スレッドの動作を把握するのに役立ちます。
スレッドのサンプリング
調査対象のコンポーネントの デバッグ タブにアクセスします。
JobManager: ログ タブで JobManager タブをクリックし、デバッグ をクリックします。
TaskManager: ログ タブで 実行中のタスクマネージャー タブをクリックし、パス、ID 列の値をクリックした後、デバッグ をクリックします。
スレッド タブで調査対象のオペレーターを検索し、操作 列の サンプリング をクリックします。サンプリング完了まで待機した後、スレッドのスタックを確認します。

この例では、Gemini State によってアクセスされたスレッドスタックを示しています。
スレッドダンプ
スレッドダンプは、単一時点におけるすべてのスレッドの状態をキャプチャします。スレッドダンプを使用して、デッドロックの検出、ブロックされたスレッドの特定、またはステートバックエンドとの相互作用の確認を行います。
スレッドダンプの取得
ログ タブで 実行中のタスクマネージャー タブをクリックし、パス、ID 列の値をクリックします。
スレッドダンプ タブをクリックします。
ステートデータを処理するオペレーター名を検索します。オペレーターの下に、GeminiStateBackend または RocksDBStateBackend の相互作用を含むスレッドスタックが表示されているかを確認します。

オペレーター名は、ステータス タブで確認できます。

参考資料
インテリジェントなデプロイメント診断の実行:デプロイメントの健全性を自動的にモニターし、安定性の問題を特定します。
Flink SQL の最適化:構成のチューニングおよび Flink SQL の最適化を通じて、デプロイメントのパフォーマンスを向上させます。