シングルノードの Kubernetes* アプリケーションのプロファイル

インテル® VTune™ プロファイラー

この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® VTune™ Profiler Performance Analysis Cookbook」の「Profiling Single-Node Kubernetes* Applications」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


このレシピでは、インテル® VTune™ プロファイラーを使用して、シングルノード環境にデプロイされた Kubernetes* アプリケーションをプロファイルする方法を紹介します。

Kubernetes* アプリケーションは一般に、スケーラビリティーや耐久性などの重要な利点が得られるマルチノード環境にデプロイされます。しかし、シングルノード環境にデプロイすることで、標準的なコンテナ化機能に加えて、コンテナ化されたワークロードのデプロイと管理の面で、より優れたエクスペリエンスが期待できます。インテル® VTune™ プロファイラーは、シングルノード環境の Kubernetes* アプリケーションや、複数のコンテナが同時に実行される Kubernetes* Pod をプロファイルできます。

このレシピでは、単一の Kubernetes* ノードを構成し、インテル® VTune™ プロファイラーを使用して Docker* コンテナを実行している 1 つまたは複数の Pod を解析します。解析には、インテル® VTune™ プロファイラーの Java* コード解析機能を使用します。

使用するもの

以下は、このパフォーマンス解析シナリオで使用するハードウェアとソフトウェアのリストです。

  • アプリケーション:

    • MatrixMultiplication – デモ用の Java* アプリケーション (ダウンロードは提供していません)
    • vtunedemo_fork – デモ用のネイティブ・アプリケーション (ダウンロードは提供していません)
  • ツール: インテル®VTune™ プロファイラー 2023 以降のハードウェア・イベントベース・サンプリングのホットスポット解析 (英語)

    注:

    • バージョン 2020 から、インテル® VTune™ Amplifier の名称がインテル® VTune™ プロファイラーに変わりました。

    • インテル® VTune™ プロファイラー・パフォーマンス解析クックブックの大部分のレシピは、異なるバージョンのインテル® VTune™ プロファイラーにも適用できます。バージョンにより、調整が必要になる場合があります。

    • 最新バージョンのインテル® VTune™ プロファイラーは以下から入手できます。

  • コンテナ・オーケストレーション・システム: Kubernetes*

  • オペレーティング・システム: Ubuntu* 22.04 (Linux* カーネルバージョン 5.15 以降)

  • CPU: インテル® マイクロアーキテクチャー開発コード名 Skylake 以降。

Kubernetes* Pod の設定

必要条件: Kubernetes* Pod をインストールします。http://kubernetes.io (英語) の手順に従ってください。

Kubernetes* Pod をインストールしたら、以下の操作を行います。

  1. Pod の YAML 設定ファイルを変更します。この例では、Pod 名に pod-test、設定ファイル名に test.yaml を使用します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-test
      labels:
        app: pod-test
    spec:
      containers:
      - name: pod-test-1
    
  2. ホストマシンと Pod 間の共有パスを有効にします。

    spec:
           volumes:
      - name: shared-path
        hostPath:
          path: /tmp/shared_path
          type: Directory
          containers:
       - name: pod-test-1
         volumeMounts:
         - name: shared-path
          mountPath: /tmp/test_application
    

    説明:

    • /tmp/shared_path は、ホスト側のディレクトリーです。
    • /tmp/test_application は、Pod 内のパスです。
  3. コンテナのセキュリティー・コンテキストを設定します。実行している Pod のプロファイル時に特権モードを有効にします。以下を追加します。

    spec:
      containers:
        securityContext:
          privileged: true
    

    ポッドで実行しているシステムのワークロードをプロファイルするには、ホストの PID 名前空間へのアクセス権を付与する必要があります。

    spec:
      hostPID: true
    
  4. Kubernetes* Pod 設定ファイルを適用します。

    host> kubectl apply -f test.yaml

同じ Pod 内のインテル® VTune™ プロファイラーとターゲットを使用したハードウェア・イベントベース・ホットスポット解析の実行

この手順では、インテル® VTune™ プロファイラーとワークロードを同じ Kubernetes* Pod で実行して、収集結果をホストマシンで解析します。

必要条件: インテル® VTune™ プロファイラーの Linux* ターゲット用のサンプリング・ドライバーをインストールするか、ドライバーレス収集を有効にします。

  1. ノードと Pod 間で、インテル® VTune™ プロファイラーと結果ディレクトリーの共有パスを有効にします。

    spec:
           volumes:
      - name: vtune-path
        hostPath:
          path: /opt/intel/oneapi/vtune
          type: Directory
            - name: vtune-results-path
        hostPath:
          path: /opt/vtune_results
          type: Directory
          containers:
       - name: pod-test-1
         volumeMounts:
         - name: vtune-path
          mountPath: /vtune
         - name: vtune-results-path
          mountPath: /tmp/vtune_results
    

    説明:

    • /opt/intel/oneapi/vtune は、(ホスト上の) インテル® VTune™ プロファイラーのインストール・ディレクトリーのパスです。
    • /vtune は、Pod 内のインテル® VTune™ プロファイラーのパスです。
    • /opt/vtune_results は、ホスト上のインテル® VTune™ プロファイラーの結果を書き込み可能な場所です。
    • /tmp/vtune_results は、Pod 内のインテル® VTune™ プロファイラーの結果のパスです。
  2. [Launch Application (アプリケーションを起動)] モードでホットスポット解析を実行します。結果ディレクトリーの analyze_mod パスを使用します。

    pod> cd /vtune/latest
    pod> source vtune-vars.sh
    pod> vtune -collect hotspots -knob sampling-mode=hw -knob enable-stack-collection=true --app-working-dir=/var/local/jdk-19.0.2/bin -result-dir=/tmp/vtune_results/analyze_pod/r@@@{at} --duration 30 -- /var/local/jdk-19.0.2/bin/java -cp /tmp/test_application/java_tests/MatrixMultip_32bit/ MatrixMultiplication
    

    注: Pod 内では、ユーザーモード・サンプリングおよびハードウェア・イベント・ベース・サンプリングのホットスポット解析を [Launch Application (アプリケーションを起動)] モードと [Attach to Process (プロセスにアタッチ)] モードで実行できます。

  3. データ収集が完了したら、ホストマシンでインテル® VTune™ プロファイラーの GUI を開きます。

    host> vtune-gui
  4. 収集結果のプロジェクトを作成し、analyze_pod という名前にします。

  5. 収集結果を開いて、下図に赤枠で示す左側のアイコンをクリックします。

  6. ホットスポット解析の [Summary (サマリー)] ウィンドウで結果を確認します。

Pod ターゲットでのユーザーモード・サンプリングのホットスポット解析の実行

ホストマシン上のインテル® VTune™ プロファイラーを使用して、Kubernetes* Pod 内のターゲットのホットスポット解析を実行します。

  1. ホストマシンでインテル® VTune™ プロファイラー・サーバーを起動します。以下のコマンドを実行します。

    host> cd /opt/intel/oneapi/vtune/latest
    host> source vtune-vars.sh
    host> vtune-backend --allow-remote-access --web-port=50777 --enable-server-profiling &
    

    説明:

    • –allow-remote-access は、リモートアクセスを有効にします。
    • –web-port=50777 は、ウェブ UI とデータ API 用の HTTP/HTTPS ポートです。
    • –enable-server-profiling は、プロファイル・ターゲットとしてホスティング・サーバーを選択できるようにします。
    • & は、コマンドをバックグラウンドで実行します。

    vtune-backend コマンドは、コンテナの外部で開くことができる URL を返します。次に例を示します。

    Serving GUI at https://10.45.176.150:50777/?one-time-token=0ee4ec13b6c33fe416b49fcb273d43ac
  2. Pod でネイティブ・アプリケーションを実行します。

    pod> /tmp/test_application/native_app
    pod> ./vtunedemo_fork -nonstop -nt 80
    
  3. vtune-backend を実行し、受け取った URL を開きます。

  4. プロジェクトを作成し、kubernetes_pod などの名前を付けます。

  5. Pod 内で実行しているアプリケーションを解析するには、ユーザーモード・サンプリングまたはハードウェア・イベントベース・サンプリングのホットスポット解析を実行します。その際、プロセスにアタッチするように解析を設定し、収集データを関数レベルおよびソースレベルで解析するため、アプリケーションのバイナリーとシンボルを指定します。

    注: ファイルの場所は、ホスト上になければなりません。

    解析が完了すると、インテル® VTune™ プロファイラーは結果を [Summary (サマリー)] ウィンドウに表示します。

  6. [Top Hotspots (上位のホットスポット)] セクションから、ターゲット・アプリケーションの test_if 関数が最も CPU 時間を費やしていることが分かります。この関数をクリックして、[Bottom-Up (ボトムアップ)] ウィンドウに切り替えます。このホットスポットのスタックフローを確認します。

プロファイルの注意点

  • ネイティブ C/C++ アプリケーションのみプロファイルできます。
  • インテル® インストルメンテーションおよびトレーシング・テクノロジー (ITT) API/JIT API を使用してインストルメントされ、コンテナ内で実行しているアプリケーションはプロファイルできません。

複数のコンテナを持つ Pod でのシステムのプロファイル解析の実行

ホストマシンでインテル® VTune™ プロファイラーを実行して、複数のコンテナを含む Kubernetes* Pod を持つシステムをプロファイルします。

必要条件:

  1. ホストマシンでインテル® VTune™ プロファイラー・サーバーを起動します。

    host> cd /opt/intel/oneapi/vtune/latest
    host> source vtune-vars.sh
    host> vtune-backend --allow-remote-access --web-port=50777 --enable-server-profiling &
    

    説明:

    • –allow-remote-access は、リモートアクセスを有効にします。

    • –web-port=50777 は、ウェブ UI とデータ API 用の HTTP/HTTPS ポートを設定します。

    • –enable-server-profiling は、プロファイル・ターゲットとしてホスティング・サーバーを選択できるようにします。
    • & は、コマンドをバックグラウンドで実行します。
  2. vtune-backend を実行します。このコマンドは、コンテナの外部で開くことができる URL を返します。次に例を示します。

    Serving GUI at https://10.45.176.150:50777/?one-time-token=0ee4ec13b6c33fe416b49fcb273d43ac

    受け取った URL を開きます。

  3. ホストマシンで [Profile System (システムをプロファイル)] 解析を開始します。収集データを関数レベルおよびソースレベルで解析するため、アプリケーションのバイナリーとシンボルを指定します。

    注: ファイルの場所は、ホスト上になければなりません。

  4. コンテナ内でネイティブ・アプリケーションを実行します。

  5. 解析が完了したら、[Summary (サマリー)] ウィンドウで結果を確認します。

  6. [Top Hotspots (上位のホットスポット)] セクションで test_if 関数をクリックして、[Bottom-up (ボトムアップ)] ウィンドウに切り替えます。このホットスポットのスタックフローを確認します。

  7. 個々の Pod のコンテナのパフォーマンス・データを確認するには、プルダウンメニューから [Container Name/Process/Function/Thread/Call Stack (コンテナ名/プロセス/関数/スレッド/コールスタック)] グループを選択します。docker:k8s プリフィクスでコンテナを識別します。

  8. test_if 関数をダブルクリックして、ソースレベルの解析を行います。

プロファイルの注意点

  • ネイティブ C/C++ アプリケーションのみプロファイルできます。

  • ITT/JIT API でインストルメントされたアプリケーションはプロファイルできません。

関連情報

タイトルとURLをコピーしました