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. Rubyマネージャ/インストーラを使用して、TruffleRubyスタンドアロンからRubyをインストールします。バージョンをチェックして、TruffleRubyディストリビューションを実行していることを確認します:
     ruby --version
    
  3. アプリケーションを実行し、プロセスを実行中のIGVに接続します:
     ruby --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オプションを追加します。

関連ドキュメント