Ideal Graph Visualizer

Ideal Graph Visualizer (IGV)は、コンパイル・グラフを分析し、パフォーマンスの問題を調査する開発者ツールです。IGVは、中間表現グラフ(ソース言語とコンパイラによって生成されたマシン・コードの間の言語に依存しない中間表現(IR))を表示および検査するために開発されました。これは、GraalVM上に構築するすべての言語実装者にとって不可欠です。

IGVツールは、GraalVM言語実装者が、Truffleフレームワークでアセンブルされた言語を最適化できるようにするために開発されました。開発ツールであるため、本番環境にはインストールしないでください。

前提条件

スタート・ガイド

IGVは自由に使用でき、mxツール(コードのビルド、テスト、実行、更新、およびGraalVMのアーティファクトのビルドを行うためのコマンドライン・ツール)を使用してユーザーのマシン上に構築する必要があります。

  1. mxリポジトリを作業ディレクトリにクローニングします:
     git clone https://github.com/graalvm/mx.git
    
  2. Graalリポジトリをクローニングします:
     git clone https://github.com/oracle/graal.git
    
  3. mxPATH環境変数に追加します:
     export PATH="/path/to/mx:$PATH"
    

    インストールが成功したかどうかを確認するには、次のコマンドを実行します:

     mx --version 
    
  4. mxを使用してIGVを起動します:
     mx -p graal/compiler igv
    

Rubyを使用したグラフのダンプの例

Javaを埋め込むホストRubyアプリケーションを使用して、ネットワーク経由でコンパイラ・グラフをダンプします。

  1. 次のコード・スニペットを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(' ')
    
  2. 別のコンソール・ウィンドウから、GraalVMのRubyランタイムをインストールし(まだインストールしていない場合)、そのバージョンを確認します:
     gu install ruby
    
     ruby --version
    
  3. アプリケーションを実行し、プロセスを実行中の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コンテキスト・メニュー

グラフが画面より大きい場合は、メイン・ツールバーの「衛星」ビュー・ボタンを使用して操作し、ビューポートの矩形を移動します。

IGV衛星ビュー・ボタン

着色フィルタ(デフォルトでは左側のサイドバーで有効になっています)を編集することで、ユーザー・プリファレンスに応じてグラフの色スキームを調整できます。

ソース・コードの表示

ソース・コード・ビューは、手動モードおよび支援モードで開くことができます。グラフ・ビューでノードを選択すると、「処理中」ビューが開きます。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オプションを追加します。

関連ドキュメント