この記事は、インテル® デベロッパー・ゾーンに公開されている『Intel® VTune™ Profiler Performance Analysis Cookbook』の「Profiling Hardware Without Intel Sampling Drivers」日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
この一連のレシピは、インテル® VTune™ プロファイラーでドライバーを使用しない Linux* perf ベースのパフォーマンス・プロファイルを設定して、その利点と制限に対する回避策を理解するのに役立ちます。
コンテンツ・エキスパート: Alexey Budankov、Alexey Bayduraev
インテル® プロセッサーは、コードがハードウェア・リソースをどの程度有効に利用しているか解析するのに使用できるパフォーマンス・モニタリング・ユニット (PMU) イベントを提供します。インテル® VTune™ プロファイラーは、HPC パフォーマンス特性、メモリーアクセス、マイクロアーキテクチャー全般など、マイクロアーキテクチャー解析タイプで PMU を収集して解析できます。また、解析に必要なサンプリング間隔が短い場合など、必要に応じて、hotspot とスレッド解析タイプでも、デフォルトのユーザーモード・サンプリングの代わりに PMU イベントベース・サンプリングを使用するように設定できます。
PMU イベントベース解析では、インテル® VTune™ プロファイラーはインテルのサンプリング・ドライバー (英語) を使用します。このドライバーをターゲットシステムにインストールするには、管理者権限が必要です。管理者権限がない場合、またはサードパーティーのドライバーのインストールが許可されていない環境の場合、インテル® VTune™ プロファイラーはインテルのサンプリング・ドライバーを介して PMU イベントにアクセスし、ハードウェア・パフォーマンスのボトルネックを特定することができません。そのような場合、インテル® VTune™ プロファイラーは、Linux* の perf パフォーマンス・モニタリング・システムを介してハードウェア・パフォーマンス・モニタリング機能を提供します。
インテル® VTune™ プロファイラーは、次の場合にドライバーを使用しない perf によるハードウェア・イベントベース・サンプリング解析を有効にします。
- インテルのサンプリング・ドライバーがインストールできない (例: root 権限なしでインストールした場合など)
- 非ゼロのスタックサイズでスタックを含む収集が選択され、ドライバーを使用しない収集の要件が満たされている
- ドライバーを使用しない収集を使用するオプションが有効になっており、ドライバーを使用しない収集の要件が満たされている
インテル® VTune™ プロファイラーの最新バージョンは、Linux* perf (ドライバーを使用しない) サポートが拡張されており、インテルのサンプリング・ドライバーベースのソリューションに匹敵するプロファイル機能、収集オーバーヘッド、およびトレースサイズを提供します。しかし、ドライバーを使用しないモードでのインテル® VTune™ プロファイラーの機能は Linux* OS の設定に依存し、以下のレシピに示すようないくつかの制限があります。
注
- インテルのサンプリング・ドライバーで提供されるハードウェア・プロファイル機能と同等のドライバーを使用しない perf 収集を有効にするには、管理者権限で次のシステムオプションを設定する必要があります。
- 解析に使用されたコレクターの種類 (perf またはインテルのサンプリング・ドライバー (SEP)) は、[Summary (サマリー)] ウィンドウの [Collection and Platform Info (収集とプラットフォーム情報)] セクションで確認できます。
- 使用するもの:
インテル® VTune™ プロファイラー (またはインテル® VTune™ Amplifier 2019) は、次の要件を満たす場合にドライバーを使用しないモードを使用できます。
- コアとアンコアイベント。インテル® VTune™ プロファイラーのすべてのハードウェア・イベントベース収集はコア PMU イベントを使用します。メモリーアクセスや IO など一部の解析タイプは、DRAM 帯域幅、QPI/UPI 帯域幅、PCI 帯域幅などのメトリックの収集を可能にするアンコアイベントへのアクセスが必要です。
- Linux* カーネル 2.6.32 以降の perf。Linux* カーネルは、/sys/bus/event_source/devices/cpu および /sys/bus/event_source/devices/uncore_* ディレクトリーを利用して PMU イベントを認識します。ディレクトリーが空の場合、システム設定が PMU イベント収集をサポートしていない可能性があります。この場合、OS をアップデートするか、インテルのサンプリング・ドライバーをインストールしてください。
- /proc/sys/kernel/perf_event_paranoid の値が 1 以下。
- 制限のレシピ:
注
インテル® VTune™ プロファイラーに付属の vtune-self-checker.sh スクリプトを実行して、解析システムの製品機能を検証できます。このスクリプトは、安定したベンチマークで解析タイプの代表的なセットを実行して、システムでインテル® VTune™ プロファイラーが直面した制限について通知します。診断の推奨事項は、ドライバーを使用しない perf 収集向けにシステムを適切に設定したり、システムを設定できない場合はインテルのサンプリング・ドライバーをインストールするのを支援します。スクリプトを実行するには、次のコマンドを使用します。
<vtune_install_dir>/bin64/vtune-self-checker.sh
システム全体またはユーザープロセスのプロファイルを有効にする
解析タイプ: すべて。
概念: システム全体の解析は、システムサービスなどを含む、システムで実行中のすべてのプロセスに関するパフォーマンス情報を収集します。
ドライバーを使用しないモードの制限: システム全体またはユーザープロセスのプロファイルを有効にするには、追加の設定が必要です。
ドライバーを使用しないモードでシステム全体の解析を有効にする
- インテル® VTune™ プロファイラーのプロジェクトを設定します。[WHAT (何を)] ペインで [Profile System (システムをプロファイル)] ターゲットまたは [Launch Application (アプリケーションを起動)] ターゲットを選択して、[Analyze system-wide (システム全体を解析)] オプションを有効にします。
- 次のコマンドを実行して、/proc/sys/kernel/perf_event_paranoid ファイルの値を確認します。
cat /proc/sys/kernel/perf_event_paranoid
値が 1 未満の場合、インテル® VTune™ プロファイラーはシステム全体の収集を続行できます。
- perf_event_paranoid 値が 1 の場合 (収集はユーザープロセスのみに制限されます) または 1 よりも大きい場合 (インテル® VTune™ プロファイラーはドライバーを使用しない perf モードを使用できません)、システム全体の収集を行うため perf_event_paranoid 値を 0 に設定します。
echo 0 > /proc/sys/kernel/perf_event_paranoid
注
一部の環境では、perf_event_paranoid はセキュリティー・ポリシーによって規制されます。Linux* perf のセキュリティー要件の詳細は、https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html (英語) を参照してください。
インテルのサンプリング・ドライバーの制限: デフォルトでは、インテルのサンプリング・ドライバーはシステム全体の収集をサポートします。しかし、–per-user オプションを指定してビルドおよびロードされている場合、収集はユーザープロセスのみに制限されます。
コアとアンコアイベントの収集を有効にする
解析タイプ: メモリーアクセス、HPC パフォーマンス特性、その他のアンコア・イベント・ベースの解析タイプ
コアイベントは、システム全体とユーザープロセスごとのどちらでも収集できます。ドライバーを使用しない perf モードでアンコアイベントを収集するには、システム全体の解析を有効にします。
ドライバーを使用しないモードの制限:
- メモリーアクセス解析は、アンコアイベントにアクセスする必要があり、それらを収集することができない場合実行されません。HPC パフォーマンス特性など、その他の解析タイプは実行されますが、DRAM 帯域幅、OPA インターコネクト帯域幅、パケットレートなど、アンコア・イベント・ベースのメトリックは提供されません。
- ドライバーを使用しないモードでのアンコアイベントの収集は、Intel Atom® プロセッサーではサポートされていません。
ドライバーを使用しないモードでアンコアイベントを収集する
perf_event_paranoid 値を 0 に設定してシステム全体のパフォーマンス・モニタリングを有効にします。これは、アンコアイベント収集の必要条件です。
インテルのサンプリング・ドライバーの制限: なし。
マルチプロセスのプロファイルを有効にする
解析タイプ: すべて。
デフォルトでは、Linux* カーネルはパフォーマンス・データの収集に利用可能なメモリーサイズを 518KB に制限します。現在の値を確認するには、次のコマンドを使用します。
cat /proc/sys/kernel/perf_event_mlock_kb
ドライバーを使用しないモードの制限: マルチコアシステム (64 論理コアを超える) のユーザープロセス収集モードで一部の並列アプリケーション (例えば、ノードごとに複数のランクがある MPI アプリケーション) は、518KB 制限に達しデータ収集が利用できません。
マルチコアシステムでマルチプロセスの収集を有効にする
perf_event_paranoid 値を 0 に設定して、システム全体のパフォーマンス・モニタリングを有効にします。
インテルのサンプリング・ドライバーの制限: なし。デフォルトの設定で任意の数のプロセスをプロファイルできます。
マルチコアシステムで多数の PMU イベントをプロファイルする
解析タイプ: マイクロアーキテクチャー全般。
ドライバーを使用しないモードの制限: Linux* perf は、各 CPU で設定されている PMU イベントごとにファイル記述子を割り当てます。そのため、マルチコアシステムで多数のイベントを利用するマイクロアーキテクチャー全般などの解析を行う場合、制限に達しドライバーを使用しないモードでの収集が利用できません。
ドライバーを使用しないモードで多数の PMU イベントをプロファイルする
- オープンファイルの上限を確認します。
ulimit -n
- 必要に応じて、/etc/security/limits.conf ファイルに次の行を追加するか、既存の行を変更して上限を増やします。
- soft nofile 65535
- hard nofile 65535
注
管理者権限が必要です。
インテルのサンプリング・ドライバーの制限: なし。
スタックのサンプリングを有効にする
解析タイプ: hotspot (ハードウェア・イベントベース・サンプリング・モード)、スレッド (ハードウェア・イベントベース・サンプリング・モードおよびスタック・スティッチ・モード)、HPC パフォーマンス特性 ([Collect stacks (スタックを収集)] オプションがオン)、GPU 計算/メディア hotspot ([Collect stacks (スタックを収集)] オプションがオン)。
ドライバーを使用しないモードの制限:
- 関数がスタックに多くのデータを割り当てる場合、デフォルトの 1024 バイトのスタックサイズではスタックを完全にアンワインドできない場合があります。この場合、収集データに [Skipped stack frame(s)] が表示されます。
- バージョン 3.7 よりも古い Linux* カーネルは、フレームポインター (FP) ベースのスタック・アンワインドのみをサポートしています。つまり、インテル® VTune™ プロファイラーは、フレームポインターを含めない (-fomit-frame-pointer コンパイラー・オプション) でビルドされたバイナリーのスタックを提供できません。また、glibc スタックもフレームポインターを含めないでビルドされているため提供できません。
ドライバーを使用しないモードでスタック・アンワインドの問題を回避する
スタックサイズを増やします。次に例を示します。
vtune -collect hotspots -knob sampling-mode=hw -knob enable-stack-collection=true -knob stack-size=2048 <application>
そうでない場合、インテルのサンプリング・ドライバーに切り替えて、[Stack size (スタックサイズ)] オプションを 0 (無制限) に設定します。
注
インテルのサンプリング・ドライバーを使用したスタック・サンプリング収集はカーネル実装に依存するため、通常は新しいカーネルバージョンへの更新が必要であり、追加の製品保守コストが発生する可能性があります。このコストを軽減するため、インテル® VTune™ プロファイラー (およびインテル® VTune™ Amplifier 2019 Update 4 以降) では、スタック収集が有効なすべての解析タイプで、インテルのサンプリング・ドライバーがロードされている場合であっても、ドライバーを使用しないモードを使用します。スタックのサンプリング収集をインテルのサンプリング・ドライバーに切り替える必要がある場合は、カスタム解析タイプを作成して、[Enable driverless collection (ドライバーを使用しない収集を有効にする)] オプションを無効にするか、次に示す対応するコマンドライン設定を使用します。
vtune -collect-with runsa -knob enable-driverless-collection=false -knob event-config=<event-list> <application>
インテルのサンプリング・ドライバーの制限: インテルのサンプリング・ドライバーは、コールスタック収集に異なるアルゴリズムを使用するため、スタック・アンワインドの制限はありません。インテル® VTune™ プロファイラーでサポートされる最新のカーネルバージョンよりも新しいカーネルバージョンを使用している場合、ドライバーのアップデートが必要になることがあります。
コンテキスト・スイッチを収集する
解析タイプ: スレッド。
概念: コンテキスト・スイッチの収集は、同期またはスレッド・プリエンプションによるスレッドのインアクティブ待機時間に基づくメトリックの取得に役立ちます。
ドライバーを使用しないモードの制限: Linux* perf は、カーネル 4.3 以降でコンテキスト・スイッチを収集します。コンテキスト・スイッチの原因 (同期またはプリエンプション) の識別は、カーネル 4.17 以降で利用できます。古いカーネルバージョンでは、インテル® VTune™ プロファイラーは、システムで利用可能な場合インテルのサンプリング・ドライバーに切り替えます。
インテルのサンプリング・ドライバーの制限: なし。
カーネル関数のシンボルを解決する
解析タイプ: すべて。
ドライバーを使用しないモードの制限: 追加で kptr_restrict ファイルを手動で設定する必要があります。
パフォーマンス・データとカーネル関数名を関連付ける
管理者権限で kptr_restrict 設定ファイルの値を 0 に設定します。
echo 0 > /proc/sys/kernel/kptr_restrict
値を 1 に設定すると、ファイル名の解決がユーザーレベルのモジュールに制限されます。
インテルのサンプリング・ドライバーの制限: なし。/boot/System.map-<kernel_version> ファイルが読み取り可能な場合、または /proc/sys/kernel/kptr_restrict が 0 に設定されている場合、インテルのサンプリング・ドライバーはカーネルシンボルを解決します。
NMI ウォッチドックとのリソース競合を回避する
解析タイプ: すべて。
ドライバーを使用しないモードの制限: NMI ウォッチドッグ (ハード・ロックアップ検出器) は、1 つの CPU パフォーマンス・カウンター・レジスターを利用し、このレジスターは Linux* perf で利用できなくなります。これにより多重化グループの数が増えて、統計サンプリング・データの精度に影響します。
ドライバーを使用しないモードで多数のイベントを収集する解析の実行の精度を向上する
管理者権限で NMI ウォッチドッグを無効にします。
echo 0 > /proc/sys/kernel/nmi_watchdog
ドライバーを使用しない perf 収集が完了したら NMI ウォッチドッグを (管理者権限で) 再度有効にできます。
echo 1 > /proc/sys/kernel/nmi_watchdog
インテルのサンプリング・ドライバーの制限: なし。インテルのサンプリング・ドライバーは、このデータ精度の問題を回避するため、収集時に自動で NMI ウォッチドッグを停止します。
収集オーバーヘッドを軽減する
解析タイプ: すべて。
ドライバーを使用しないモードの制限: CPU 負荷の高いアプリケーションではすべての CPU に完全な負荷がかかるため、Linux* perf 収集でオーバーヘッドが発生する可能性があります。
ドライバーを使用しないモードで収集のオーバーヘッドを軽減する
- 次のように、より積極的なアフィニティーの最適化を設定します。
vtune -collect hotspots -knob sampling-mode=hw -knob enable-stack-collection=true -run-pass-thru=--perf-affinity=cpu <application>
- スタック・サンプリング収集のトレースサイズを軽減するため、インテル® VTune™ プロファイラーが使用する Linux* perf トレース圧縮は、追加のオーバーヘッドを発生する可能性があります。これを回避するには、-run-pass-thru オプションを指定してトレース圧縮を無効にします。
vtune -collect hotspots -knob sampling-mode=hw -knob enable-stack-collection=true -run-pass-thru=--perf-compression=0 -run-pass-thru=-- perf-aio=0 <application>
これにより、コレクターのオーバーヘッドを軽減できることがありますが、トレースサイズが大幅に増加します。
- Linux perf コレクターによって消費される CPU 時間の上限を設定します。例えば、10% に制限する場合、管理者権限で次のコマンドを実行します。
cat 10 > /proc/sys/kernel/perf_cpu_time_max_percent
これにより、サンプリング周波数と統計精度が低下する可能性があります。
インテルのサンプリング・ドライバーの制限: なし。
必要に応じてドライバーを使用しないモードを有効にする
インテル® VTune™ プロファイラーは、スタック・サンプリング収集を除くすべてのケースで、インテルのサンプリング・ドライバーがロードされている場合はそれを使用します。インテル® VTune™ プロファイラーがスタックを含まないサンプリングにドライバーを使用しない perf モードを使用するように切り替えるには、カスタム解析タイプを作成して、GUI で [Enable driverless collection (ドライバーを使用しない収集を有効にする)] オプションを選択するか、次のようにコマンドライン knob 値に enable-driverless-collection=true を設定します。
vtune -collect-with runsa -knob enable-driverless-collection=true -knob event-config=<event-list> <application>
このオプションは、インテル® VTune™ Amplifier 2019 Update 4 以降で利用できます。
関連情報
- サンプリング・ドライバー (英語)
- スタックを含むハードウェア・イベントベースのサンプリング収集
https://software.intel.com/en-us/vtune-amplifier-help-hardware-event-based-sampling-collection-with-stacks - Linux* カーネル解析を有効にする (英語)