この記事は、インテル® デベロッパー・ゾーンに公開されている『Intel® VTune™ Profiler Performance Analysis Cookbook』の「Profiling Linux*, Android*, and QNX* System Boot Time」日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
このレシピは、インテル® VTune™ Amplifier のパフォーマンス解析を Linux*、Android*、および QNX* オペレーティング・システムのブートフローと統合する方法を示します。この解析は、OS ブート時に CPU コアで予想外に長く実行されるアクティビティーを識別するのに役立ちます。これにより、ブート順序のさらに詳しい調査が可能になります。
コンテンツ・エキスパート: Vitaly Slobodskoy、Kirill Uhanov、Dmitry Obrezchikov、Artem Shcherbak
ブート時のプロファイルでは、インテル® VTune™ Amplifier のパフォーマンス・データ収集コマンドを (初期化スクリプトで設定するか、特定のサービスを使用して) OS ブートの初期段階に挿入します。最良の結果を得るため、次の要件を満たしていることを確認してください。
- インテル® VTune™ Amplifier データコレクターのバイナリーファイルを利用可能な最も早くロードされるファイル・ディレクトリーに配置します。
- Linux* と Android* では、データコレクターはファイルシステムに書き込むため、出力ファイル名は利用可能な最も早くロードされる書き込み可能ディレクトリーを使用する必要があります。
- Linux* と Android* では、インテル® VTune™ Amplifier のデータ収集コマンドはファイルシステムの可用性に依存すべきです。QNX* では、コマンドはネットワークの可用性に依存すべきです。
注
このアプローチは、OS ブート時のいくつかの問題に対処するのに適していますが、ブートプロセス全体をカバーすることはできません。例えば、カーネルの展開とファイルシステムのマウントはカバーされません。
- 使用するもの
- 手順:
- ターゲットシステムのブート時をプロファイルする
- 結果をインテル® VTune™ Amplifier プロジェクトへインポートする
- プロセスの実行を解析する
使用するもの
以下は、パフォーマンス解析シナリオで使用するソフトウェアのリストです。
- オペレーティング・システム:
- systemd によりシステムを初期化する Linux* (root アクセスが有効)
- QNX*
- ツール:
- QNX* Momentics* ツールスイート
- QNX* 7.0 SDK
- インテル® VTune™ Amplifier 2019 以降
注
- インテル® VTune™ プロファイラー評価版のダウンロードと製品サポートについては、https://www.isus.jp/intel-vtune-amplifier-xe/ を参照してください。
- このクックブックのレシピはすべてスケーラブルであり、インテル® VTune™ Amplifier 2018 以降に適用できます。バージョンにより設定がわずかに異なることがあります。
- ベータ版インテル® oneAPI ベース・ツールキット向けのバージョンから、インテル® VTune™ Amplifier の名称がインテル® VTune™ プロファイラーに変わりました。引き続き、インテル® Parallel Studio XE またはインテル® System Studio のコンポーネントとして、あるいはスタンドアロン版のインテル® VTune™ プロファイラーをご利用いただけます。
Linux* ターゲットシステムのブート時をプロファイルする
必要条件:
- ターゲット Linux* システムにインテル® VTune™ Amplifier をインストール (英語) します。
- システムの初期化方法をチェックします。システムが systemd を使用していることを確認するには、次のコマンドを実行します。
systemctl | grep "\-\.mount"
systemd が使用されている場合、次の出力になります。
-.mount loaded active mounted /
Linux* システムのブート時をプロファイルする
- /boot_profile ファイルを作成して、インテル® VTune™ Amplifier のハードウェア解析 (hotspot、I/O、ほか) を実行するように設定します。
例えば、高精度のデータが得られるように短いサンプリング間隔でシステム全体の hotspot 解析を 30 秒間実行するには、次のコマンドを使用します。
#!/bin/bash /opt/intel/vtune_amplifier/bin64/amplxe-cl -c hotspots -knob sampling-mode=hw -knob sampling-interval=0.1 -d 30 -finalization-mode=none -r /tmp/boot_profile &
注
- ファイル内のパスがインテル® VTune™ Amplifier のインストール・ディレクトリーを正しく指定していることを確認してください。デフォルトでは、Linux* のインストール・ディレクトリーは、/opt/intel/vtune_amplifier です。
- boot_profile スクリプトのパスは、/tmp など、初期ブート段階で利用可能な任意のローカルパスにすることができます。
- データ収集起動スクリプトの権限を変更します。
chmod 755 /boot_profile
- 次の内容で /etc/systemd/system/vtune_boot.service ファイルを作成します。
[Unit] Description=VTune Amplifier boot profile service [Service] Type=forking ExecStart=/boot_profile [Install] WantedBy=multi-user.target
- サービスを有効にします。
systemctl enable vtune_boot
- システムを再起動して、OS ブートプロセス中にインテル® VTune™ Amplifier のデータ収集を開始します。
データ収集が完了すると、/tmp/boot_profile に結果ディレクトリーが生成されます。このディレクトリーは root ユーザー以下にあります。通常のユーザーで結果を開く必要がある場合、フォルダーのアクセス権限を変更してください。
sudo chmod -R a+w /tmp/boot_profile
追加のコマンド
- サービスを無効にします。
systemctl disable vtune_boot
- 障害が発生した場合、OS ブートプロセス中にインテル® VTune™ Amplifier コレクター の出力を解析します。
sudo journalctl -u vtune_boot
Android*ターゲットシステムのブート時をプロファイルする
必要条件:
- ホストシステムにインテル® VTune™ Amplifier をインストールします。
- Android* ターゲットシステムで lsmod コマンドを実行して、インテルのサンプリング・ドライバーが利用できることを確認します。
ドライバー (pax.ko、sep5.ko、socperf3.ko) が見つからない場合、以降のステップをスキップしてドライバーを使用しないモードで続行するか、以降のステップに従ってドライバーをビルドして署名します。
- ホストシステムで次のコマンドを実行します。
<vtune-install-dir>/target/<android-version-arch>/sepdk/build-driver
- 入力を求められたら、ターゲットシステムのビルドに使用する GCC* コンパイラーと Android* カーネル・ソース・ディレクトリーのパスを指定します。
例えば、カーネル・ソース・ディレクトリーは <android-source-dir>/out/target/
product/<name>/obj/kernel で、コンパイラー・ディレクトリーは <android-source-dir>/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-<version>/bin/x86_64-linux-android-gcc です。 - ビルドしたドライバーは次のディレクトリーにあります。
- <vtune-install-dir>/target/<android-version-arch>/sepdk
/pax/pax.ko - <vtune-install-dir>/target/<android-version-arch>/sepdk/
sep5.ko - <vtune-install-dir>/target/<android-version-arch>/sepdk/
src/socperf/src/socperf.ko
- <vtune-install-dir>/target/<android-version-arch>/sepdk
- 次のように、ドライバーに署名します。
$KERNEL_DIR/scripts/sign-file $(CONFIG_MODULE_SIG_HASH) $KERNEL_DIR/$(CONFIG_MODULE_SIG_KEY) $KERNEL_DIR/certs/signing_key.x509 <driver_file_name.ko>
ここで、<driver_file_name.ko> は署名するドライバーの名前です。各ドライバーは個別に署名する必要があります。
KERNEL_DIR にあるカーネルの config ファイルを使用して、CONFIG_MODULE_SIG_HASH と CONFIG_MODULE_SIG_KEY パラメーターの値を取得します。
- ホストシステムで次のコマンドを実行します。
Android* システムのブート時をプロファイルする
- インテル® VTune™ Amplifier のターゲットコレクターをインストールします。
- 通常の方法でターゲットシステムをブートします。
- インテル® VTune™ Amplifier GUI を実行して新しいプロジェクトを作成します。
- 新しい解析を設定します。[WHERE (どこを)] ペインで、[Android Device (ADB) (Android* デバイス (ADB))] 接続タイプを選択します。[ADB destination (ADB の対象)] フィールドでターゲットデバイスを選択します。これ以降、インテル® VTune™ Amplifier は自動的にターゲットコレクターをターゲットシステムへアップロードします。
- ターゲットコレクターを利用可能な最も早くロードされるファイルシステムの場所 (例: /vendor) へコピーします。
adb shell cp -rf /data/data/com.intel.vtune/perfrun /vendor/vtune
- インテルのサンプリング・ドライバーが利用可能な場合、pax.ko、sep5.ko、および socperf3.ko ドライバーを /vendor/vtune へコピーします。
- 収集トレースの出力先として、利用可能な最も早くロードされる書き込み可能な場所を選択します。例えば、/data/vtune を選択して、次のインテルのサンプリング・ドライバー・モードまたはドライバーを使用しないモードのいずれかで実行スクリプト (/vendor/vtune/vtune.sh) を作成します。
インテルのサンプリング・ドライバー・モード ドライバーを使用しないモード #!/bin/sh rm -rf /data/vtune mkdir /data/vtune 0777 /system/bin/insmod /vendor/vtune/pax.ko /system/bin/insmod /vendor/vtune/socperf3.ko /system/bin/insmod /vendor/vtune/sep5.ko LD_LIBRARY_PATH=/vendor/vtune/perfrun/lib64 SEP_BASE_DIR=/vendor/vtune/perfrun/lib64/
vendor/vtune/perfrun/bin64/sep -start -d 10
-out /data/vtune/android_boot.tb7#!/bin/sh rm -rf /data/vtune mkdir /data/vtune 0777 echo 0 > /proc/sys/kernel/perf_event_paranoid echo 0 > /proc/sys/kernel/kptr_restrict /vendor/vtune/perfrun/bin64/amplxe-perf record -a -o /data/vtune/android_boot.data -- sleep 10
- このスクリプトは、hotspot 収集を開始して 10 秒間実行します。
- このスクリプトをターゲットの init.rc に追加します。実際のブートフローに応じて、post-fs やほかのトリガーの使用を検討してください。
on fs start vtune service vtune /vendor/vtune/vtune.sh user root group root seclabel u:r:init:s0 oneshot disabled
注
読み取り専用のファイルシステムでは、ホストでこれらのファイルを変更して、ソースコートから Android* システムをビルドすることを検討してください。 - オプションで、OS の設定に応じて、次の行を /system/sepolicy/private/file_contexts ファイルに追加します。
/system/bin/toolbox u:object_r:toolbox_exec:s0 + /system/bin/insmod u:object_r:toolbox_exec:s0 + /system/bin/sep u:object_r:toolbox_exec:s0 + /system/bin/sh u:object_r:toolbox_exec:s0
注
Android* デバイスが permissive モードでブートされていることを確認します。 - Android* ターゲットシステムを再起動して、データが収集されるのを待ちます。
- 詳しく解析するため、/data/vtune/android_boot.tb7 ファイルをホストシステムへコピーします。
QNX* システムのブート時をプロファイルする
必要条件:
- QNX* Momentics* Tool Suite をホストにインストールします。
- QNX* 7.0 SDK をインストールします。
- [File] > [Import] > [QNX] > [QNX Source Package and BSP] を選択して BSP を QNX* Momentics* ワークスペースにインポートします。
- ホストシステムにインテル® VTune™ Amplifier をインストール (英語) します。
QNX* システムのブート時をプロファイルする
- <vtune-install-dir>/target/qnx_x86_64 から <qnx-sdk-path>\qnx700\target\qnx7\x86_64\usr\bin へターゲット・プロファイル・エージェント (sep バイナリー) をコピーします。
- QNX* イメージの *.build ファイルを変更します。
- 文字列 /usr/bin/gzip=gzip を検索して、その後に /usr/bin/sep=sep を追加します。
- 起動スクリプトセクションに sep -p1 & を追加します。
[+script] startup-script = { ... # NOTE: Temporary enable for UART devices on OCP bridge # will be able to removed once ABL is fixed ocp_init -d 0:24:0 0x200=0xffff04b5 0x204=7 ocp_init -d 0:24:1 0x200=0xffff04b5 0x204=7 ocp_init -d 0:24:2 0x200=0xffff04b5 0x204=7 # console ocp_init -d 0:24:3 0x200=0xffff04b5 0x204=7 # the sep run before this could move system to unstable # state and crash it sep -p1 -d 10 &
sep ターゲット・プロファイル・エージェントのオプションは、次のとおりです。
- -p<mode> は、収集モードを設定します。
0 は、通常のデフォルトのモードです。プロファイル・エージェントは、ホストからの TCP/IP 接続を待機します。
1 は、エージェントがスタックを含まない事前定義済みの収集を開始します。収集サンプルはターゲットのメモリーに格納されます。ホストへデータを転送するには、TCP/IP 接続が必要です。
2 は、エージェントがサンプル・コールスタックを含む事前定義済みの収集を開始します。収集サンプルはターゲットのメモリーに格納されます。ホストへデータを転送するには、TCP/IP 接続が必要です。
- -d <sec> は、収集の最大期間 (秒) を設定します。収集は、指定した時間が経過した後、またはメモリーバッファーが一杯になると停止します。
- -s <sec> は、指定した時間が経過した後に収集を開始します。
- -b <size_ratio> は、収集バッファーサイズを設定します (1 ^ size_ratio バイト)。例えば、単一の CPU コアの場合、8MB バッファーサイズは -b 23 と指定します。エージェントは、CPU コアごとのターゲットメモリーの使用量が 16MB になるように、バッファーの切り替えにダブルバッファー・スキーマを使用します。4 CPU コアの場合、エージェントの合計メモリー使用量は 64MB になります。デフォルト値は 19 (0.5MB) です。
- QNX* イメージをリビルドしてフラッシュします。
- システムを再起動して、OS ブートプロセス中にインテル® VTune™ Amplifier のデータ収集を開始します。
- 収集結果をホストに転送します。
事前定義済みの収集モード (-p1 または -p2) では、ターゲット・エージェントはメモリーバッファー内のワークロードを指定された期間プロファイルして、リスニングモードに切り替わり、次のようなメッセージをコンソールに出力します: ‘sep5_0: Waiting for control connection from host on port XXXX…’ (sep5_0: ポート XXXX でホストからの制御接続を待機しています…)。このメッセージが出力されたら、ホストで sep ユーティリティーを起動して、ネットワーク経由でターゲットから収集データをコピーできます。使用するホストのコマンドライン・オプションがターゲット・エージェントのオプションと対応していることを確認してください。例えば、-p1 モードの場合、ホストコマンドは次のようになります。
<vtune-install-dir>/bin64/sep -start -target-ip <target-system-ip-address> -target-port 9321 -out /tmp/qnx_boot.tb7
-p2 の場合は次のようになります。
<vtune-install-dir>/bin64/sep -start -target-ip <target-system-ip-address> -target-port 9321 -lbr call_stack -out /tmp/qnx_boot.tb7
結果をインテル® VTune™ Amplifier プロジェクトへインポートする
- ホストシステムでインテル® VTune™ Amplifier スタンドアロン GUI を起動して、結果のファイナライズ中に適切なバイナリーファイルを選択します。
例えば、Windows* システムでインテル® VTune™ Amplifier を起動するには、次のコマンドを使用します。
<vtune-install-dir>/bin64/amplxe-gui.exe
- 新しいインテル® VTune™ Amplifier プロジェクトを作成して (英語)、バイナリー/シンボル検索ディレクトリー (英語) にカーネルやドライバーのデバッグファイルのパスを設定します。
Linux* ホストでは、kptr_restrict value (英語) を 0 に変更してカーネル関数名の解決を有効にできます。
- 結果をプロジェクトへインポートする
- Linux* の結果をインポートするには、[Import a result into the current project (現在のプロジェクトに結果をインポート)] オプションを使用します。次に例を示します。
- Android* または QNX* から結果をインポートするには、[Import raw data (生のトレースデータをインポート)] オプションを使用して、参照ボタンをクリックして必要な *.tb7 ファイルを選択します。
*.tb7 ファイルがインポートされ結果がファイナライズされたら、[Hotspots by CPU Utilization (CPU 利用率によるホットスポット)] ビューポイントに切り替えます。
プロセスの実行を解析する
収集結果を開いて [Bottom-up (ボトムアップ)] タブ (英語) をクリックし、最も多くの CPU リソースを占有していたプロセスを特定します。
[Platform (プラットフォーム)] タブに切り替えて、プロセス/サービスの実行シーケンスを解析します。次の操作を行います。
- タイムラインのグループ化を [Process/Thread (プロセス/スレッド)] に変更します。
- 右クリックしてコンテキスト・メニューを開き、[Sort by (ソート)] から [Row Start Time (開始時間行)] と [Ascending (昇順)] を選択して行をソートします。
- プロセスの実行順序を解析します。