Ideal Graph Visualizer
Ideal Graph Visualizer (IGV)は、コンパイル・グラフを分析し、パフォーマンスの問題を調査する開発者ツールです。IGVは、中間表現グラフ(ソース言語とコンパイラによって生成されたマシン・コードの間の言語に依存しない中間表現(IR))を表示および検査するために開発されました。これは、GraalVM上に構築するすべての言語実装者にとって不可欠です。
IGVツールは、GraalVM言語実装者が、Truffleフレームワークでアセンブルされた言語を最適化できるようにするために開発されました。開発ツールであるため、本番環境にはインストールしないでください。
前提条件
スタート・ガイド
IGVは自由に使用でき、mx
ツール(コードのビルド、テスト、実行、更新、およびGraalVMのアーティファクトのビルドを行うためのコマンドライン・ツール)を使用してユーザーのマシン上に構築する必要があります。
mx
リポジトリを作業ディレクトリにクローニングします:git clone https://github.com/graalvm/mx.git
- Graalリポジトリをクローニングします:
git clone https://github.com/oracle/graal.git
mx
をPATH
環境変数に追加します:export PATH="/path/to/mx:$PATH"
インストールが成功したかどうかを確認するには、次のコマンドを実行します:
mx --version
mx
を使用してIGVを起動します:mx -p graal/compiler igv
Rubyを使用したグラフのダンプの例
Javaを埋め込むホストRubyアプリケーションを使用して、ネットワーク経由でコンパイラ・グラフをダンプします。
-
次のコード・スニペットを
Test.rb
という名前のファイルに保存します:require 'json' obj = { time: Time.now, msg: 'Hello World', payload: (1..10).to_a } encoded = JSON.dump(obj) js_obj = Polyglot.eval('js', 'JSON.parse').call(encoded) puts js_obj[:time] puts js_obj[:msg] puts js_obj[:payload].join(' ')
- 別のコンソール・ウィンドウから、GraalVMのRubyランタイムをインストールし(まだインストールしていない場合)、そのバージョンを確認します:
gu install ruby
ruby --version
- アプリケーションを実行し、プロセスを実行中のIGVに接続します:
ruby --jvm --polyglot --vm.Dgraal.Dump=:1 --vm.Dgraal.PrintGraph=Network Test.rb
これにより、IGV形式のコンパイラ・グラフが127.0.0.1:4445でリスニングしているIGVプロセスにネットワーク経由でダンプされます。接続が確立されると、「アウトライン」ビューにグラフが表示されます。たとえば、java.lang.String.char(int)
フォルダを検索し、ダブルクリックしてその解析後グラフを開きます。ノードにsourceNodePosition
プロパティがある場合、「処理中」ウィンドウでは、その場所とスタック・トレース全体の表示が試行されます。
グラフの参照
特定のグラフを開くと、名前、IDまたはproperty=value
データでノードを検索でき、一致するすべての結果が表示されます。このツールのもう1つの優れた機能は、元のゲスト言語のソース・コードに移動できることです。グラフのノードを選択して、スタック・ビュー・ウィンドウの「ソースに移動」ボタンをクリックします。
グラフ・ナビゲーションは、コンテキスト・メニューからも使用でき、特定のグラフ・ノードをフォーカスして右クリックすることで有効になります。ノードの抽出オプションでは、グラフが再度レンダリングされ、選択したノードとその近隣ノードのみが表示されます。
グラフが画面より大きい場合は、メイン・ツールバーの「衛星」ビュー・ボタンを使用して操作し、ビューポートの矩形を移動します。
着色フィルタ(デフォルトでは左側のサイドバーで有効になっています)を編集することで、ユーザー・プリファレンスに応じてグラフの色スキームを調整できます。
ソース・コードの表示
ソース・コード・ビューは、手動モードおよび支援モードで開くことができます。グラフ・ビューでノードを選択すると、「処理中」ビューが開きます。IGVで現在のフレームのソース・コードの場所が認識されている場合は、緑色の「ソースに移動」矢印が有効になります。IGVでソースの場所が認識されていない場合、線はグレー表示され、虫眼鏡ボタンが表示されます。
これを押し、Javaプロジェクト内で検索を選択して、ダイアログ内の正しいプロジェクトを検索します。IGVでは、必要なソース・ファイルが含まれていないプロジェクトは非表示になります。ソース・コレクションには、ソースのルートを追加する一般アクションによって追加された、スタンドアロン・ルートが表示されます。ソースが(たとえばJavaプロジェクトから)推奨される方法を使用して配置されると、そのプロジェクトは、後で「プロジェクト」タブで管理できます。これは最初は非表示になっていますが、「ウィンドウ」→「プロジェクト」を使用して、開いているプロジェクトのリストを表示できます。
埋込みJavaからのグラフのダンプ
GraalVMコンパイラ・グラフを埋込みJavaアプリケーションからIGVにダンプするには、GraalVMベースのプロセスにオプションを追加する必要があります。使用している言語またはVMによっては、オプションの前に接頭辞--vm
を付けることが必要な場合があります。詳細は、特定の言語のドキュメントを参照してください。追加する主なオプションは、-Dgraal.Dump=:1
です。これにより、IGVで読取り可能な形式のグラフが、ローカル・ファイル・システムにダンプされます。ネットワーク経由でダンプをIGVに直接送信するには、GraalVMインスタンスの起動時に-Dgraal.PrintGraph=Network
を追加します。オプションで、ポートを指定できます。次に、localhostで実行中のGraalVMからIGVにダンプが送信されます。IGVがlocalhostでリスニングしない場合は、「オプション」を選択してからIdeal Graph設定またはネットワークからのデータを受け入れるを選択できます。127.0.0.1
,でリスニングしているIGVインスタンスがない場合、またはこのようなインスタンスに接続できない場合、ダンプはローカル・ファイル・システムにリダイレクトされます。ファイル・システムの場所は、プロセスの現在の作業ディレクトリの下のgraal_dumps/
で、-Dgraal.DumpPath
オプションを使用して変更できます。
古いGraalVMバージョンが使用されている場合は、ダンプにnodeSourcePosition
プロパティを含めるよう明示的に要求することが必要になる可能性があります。これを行うには、-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
オプションを追加します。