この記事は、インテル® デベロッパー・ゾーンに公開されている「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 をインストールしたら、以下の操作を行います。
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
ホストマシンと 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 内のパスです。
コンテナのセキュリティー・コンテキストを設定します。実行している Pod のプロファイル時に特権モードを有効にします。以下を追加します。
spec: containers: securityContext: privileged: true
ポッドで実行しているシステムのワークロードをプロファイルするには、ホストの PID 名前空間へのアクセス権を付与する必要があります。
spec: hostPID: true
Kubernetes* Pod 設定ファイルを適用します。
host> kubectl apply -f test.yaml
同じ Pod 内のインテル® VTune™ プロファイラーとターゲットを使用したハードウェア・イベントベース・ホットスポット解析の実行
この手順では、インテル® VTune™ プロファイラーとワークロードを同じ Kubernetes* Pod で実行して、収集結果をホストマシンで解析します。
必要条件: インテル® VTune™ プロファイラーの Linux* ターゲット用のサンプリング・ドライバーをインストールするか、ドライバーレス収集を有効にします。
ノードと 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™ プロファイラーの結果のパスです。
[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 (プロセスにアタッチ)] モードで実行できます。
データ収集が完了したら、ホストマシンでインテル® VTune™ プロファイラーの GUI を開きます。
host> vtune-gui
収集結果のプロジェクトを作成し、analyze_pod という名前にします。
収集結果を開いて、下図に赤枠で示す左側のアイコンをクリックします。
ホットスポット解析の [Summary (サマリー)] ウィンドウで結果を確認します。
Pod ターゲットでのユーザーモード・サンプリングのホットスポット解析の実行
ホストマシン上のインテル® VTune™ プロファイラーを使用して、Kubernetes* Pod 内のターゲットのホットスポット解析を実行します。
ホストマシンでインテル® 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
Pod でネイティブ・アプリケーションを実行します。
pod> /tmp/test_application/native_app pod> ./vtunedemo_fork -nonstop -nt 80
vtune-backend を実行し、受け取った URL を開きます。
プロジェクトを作成し、kubernetes_pod などの名前を付けます。
Pod 内で実行しているアプリケーションを解析するには、ユーザーモード・サンプリングまたはハードウェア・イベントベース・サンプリングのホットスポット解析を実行します。その際、プロセスにアタッチするように解析を設定し、収集データを関数レベルおよびソースレベルで解析するため、アプリケーションのバイナリーとシンボルを指定します。
注: ファイルの場所は、ホスト上になければなりません。
解析が完了すると、インテル® VTune™ プロファイラーは結果を [Summary (サマリー)] ウィンドウに表示します。
[Top Hotspots (上位のホットスポット)] セクションから、ターゲット・アプリケーションの test_if 関数が最も CPU 時間を費やしていることが分かります。この関数をクリックして、[Bottom-Up (ボトムアップ)] ウィンドウに切り替えます。このホットスポットのスタックフローを確認します。
プロファイルの注意点
- ネイティブ C/C++ アプリケーションのみプロファイルできます。
- インテル® インストルメンテーションおよびトレーシング・テクノロジー (ITT) API/JIT API を使用してインストルメントされ、コンテナ内で実行しているアプリケーションはプロファイルできません。
複数のコンテナを持つ Pod でのシステムのプロファイル解析の実行
ホストマシンでインテル® VTune™ プロファイラーを実行して、複数のコンテナを含む Kubernetes* Pod を持つシステムをプロファイルします。
必要条件:
インテル® VTune™ プロファイラーの Linux* ターゲット用のサンプリング・ドライバーをインストールするか、ドライバーレス収集を有効にします。
Pod 内の複数のコンテナをプロファイルするには、各コンテナの securityContext セクションに privileged:true を追加する必要があります。
ホストマシンでインテル® 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
受け取った URL を開きます。
ホストマシンで [Profile System (システムをプロファイル)] 解析を開始します。収集データを関数レベルおよびソースレベルで解析するため、アプリケーションのバイナリーとシンボルを指定します。
注: ファイルの場所は、ホスト上になければなりません。
コンテナ内でネイティブ・アプリケーションを実行します。
解析が完了したら、[Summary (サマリー)] ウィンドウで結果を確認します。
[Top Hotspots (上位のホットスポット)] セクションで test_if 関数をクリックして、[Bottom-up (ボトムアップ)] ウィンドウに切り替えます。このホットスポットのスタックフローを確認します。
個々の Pod のコンテナのパフォーマンス・データを確認するには、プルダウンメニューから [Container Name/Process/Function/Thread/Call Stack (コンテナ名/プロセス/関数/スレッド/コールスタック)] グループを選択します。docker:k8s プリフィクスでコンテナを識別します。
test_if 関数をダブルクリックして、ソースレベルの解析を行います。
プロファイルの注意点
ネイティブ C/C++ アプリケーションのみプロファイルできます。
ITT/JIT API でインストルメントされたアプリケーションはプロファイルできません。