Linux*、Android*、および QNX* のシステムブート時のプロファイル

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

この記事は、インテル® デベロッパー・ゾーンに公開されている『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 ブート時のいくつかの問題に対処するのに適していますが、ブートプロセス全体をカバーすることはできません。例えば、カーネルの展開とファイルシステムのマウントはカバーされません。

使用するもの

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

  • オペレーティング・システム:
    • 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* システムのブート時をプロファイルする

  1. /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 など、初期ブート段階で利用可能な任意のローカルパスにすることができます。
  2. データ収集起動スクリプトの権限を変更します。
    chmod 755 /boot_profile
  3. 次の内容で /etc/systemd/system/vtune_boot.service ファイルを作成します。
    [Unit]
    Description=VTune Amplifier boot profile service
    
    [Service]
    Type=forking
    ExecStart=/boot_profile
    
    [Install]
    WantedBy=multi-user.target
  4. サービスを有効にします。
    systemctl enable vtune_boot
  5. システムを再起動して、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*ターゲットシステムのブート時をプロファイルする

必要条件:

  1. ホストシステムにインテル® VTune™ Amplifier をインストールします。
  2. Android* ターゲットシステムで lsmod コマンドを実行して、インテルのサンプリング・ドライバーが利用できることを確認します。

    ドライバー (pax.kosep5.kosocperf3.ko) が見つからない場合、以降のステップをスキップしてドライバーを使用しないモードで続行するか、以降のステップに従ってドライバーをビルドして署名します。

    1. ホストシステムで次のコマンドを実行します。

      <vtune-install-dir>/target/<android-version-arch>/sepdk/build-driver

    2. 入力を求められたら、ターゲットシステムのビルドに使用する 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 です。

    3. ビルドしたドライバーは次のディレクトリーにあります。
      • <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
    4. 次のように、ドライバーに署名します。
      $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_HASHCONFIG_MODULE_SIG_KEY パラメーターの値を取得します。

Android* システムのブート時をプロファイルする

  1. インテル® VTune™ Amplifier のターゲットコレクターをインストールします。
    1. 通常の方法でターゲットシステムをブートします。
    2. インテル® VTune™ Amplifier GUI を実行して新しいプロジェクトを作成します。
    3. 新しい解析を設定します。[WHERE (どこを)] ペインで、[Android Device (ADB) (Android* デバイス (ADB))] 接続タイプを選択します。[ADB destination (ADB の対象)] フィールドでターゲットデバイスを選択します。これ以降、インテル® VTune™ Amplifier は自動的にターゲットコレクターをターゲットシステムへアップロードします。
  2. ターゲットコレクターを利用可能な最も早くロードされるファイルシステムの場所 (例: /vendor) へコピーします。
    adb shell cp -rf /data/data/com.intel.vtune/perfrun /vendor/vtune
  3. インテルのサンプリング・ドライバーが利用可能な場合、pax.ko、sep5.ko、および socperf3.ko ドライバーを /vendor/vtune へコピーします。
  4. 収集トレースの出力先として、利用可能な最も早くロードされる書き込み可能な場所を選択します。例えば、/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
  5. このスクリプトは、hotspot 収集を開始して 10 秒間実行します。
  6. このスクリプトをターゲットの 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* システムをビルドすることを検討してください。

  7. オプションで、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 モードでブートされていることを確認します。

  8. Android* ターゲットシステムを再起動して、データが収集されるのを待ちます。
  9. 詳しく解析するため、/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* システムのブート時をプロファイルする

  1. <vtune-install-dir>/target/qnx_x86_64 から <qnx-sdk-path>\qnx700\target\qnx7\x86_64\usr\bin へターゲット・プロファイル・エージェント (sep バイナリー) をコピーします。
  2. QNX* イメージの *.build ファイルを変更します。
    1. 文字列 /usr/bin/gzip=gzip を検索して、その後に /usr/bin/sep=sep を追加します。
    2. 起動スクリプトセクションに 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) です。
  3. QNX* イメージをリビルドしてフラッシュします。
  4. システムを再起動して、OS ブートプロセス中にインテル® VTune™ Amplifier のデータ収集を開始します。
  5. 収集結果をホストに転送します。

事前定義済みの収集モード (-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 プロジェクトへインポートする

  1. ホストシステムでインテル® VTune™ Amplifier スタンドアロン GUI を起動して、結果のファイナライズ中に適切なバイナリーファイルを選択します。

    例えば、Windows* システムでインテル® VTune™ Amplifier を起動するには、次のコマンドを使用します。

    <vtune-install-dir>/bin64/amplxe-gui.exe

  2. 新しいインテル® VTune™ Amplifier プロジェクトを作成して (英語)、バイナリー/シンボル検索ディレクトリー (英語) にカーネルやドライバーのデバッグファイルのパスを設定します。

    Linux* ホストでは、kptr_restrict value (英語) を 0 に変更してカーネル関数名の解決を有効にできます。

  3. 結果をプロジェクトへインポートする
    • Linux* の結果をインポートするには、[Import a result into the current project (現在のプロジェクトに結果をインポート)] オプションを使用します。次に例を示します。

    • Android* または QNX* から結果をインポートするには、[Import raw data (生のトレースデータをインポート)] オプションを使用して、参照ボタンをクリックして必要な *.tb7 ファイルを選択します。

      *.tb7 ファイルがインポートされ結果がファイナライズされたら、[Hotspots by CPU Utilization (CPU 利用率によるホットスポット)] ビューポイントに切り替えます。

プロセスの実行を解析する

収集結果を開いて [Bottom-up (ボトムアップ)] タブ (英語) をクリックし、最も多くの CPU リソースを占有していたプロセスを特定します。

[Platform (プラットフォーム)] タブに切り替えて、プロセス/サービスの実行シーケンスを解析します。次の操作を行います。

  1. タイムラインのグループ化を [Process/Thread (プロセス/スレッド)] に変更します。
  2. 右クリックしてコンテキスト・メニューを開き、[Sort by (ソート)] から [Row Start Time (開始時間行)][Ascending (昇順)] を選択して行をソートします。

  3. プロセスの実行順序を解析します。

関連情報

インテル® VTune™ プロファイラー・パフォーマンス解析クックブックのトップに戻る

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