パフォーマンス データの収集

ウォッチドッグ ネイティブ サービスは、システム起動時の early-init 以降の I/O パフォーマンス データを記録します。ネイティブ サービスは、収集したパフォーマンス データをバグレポートにダンプします。ベンダーは、dumpsys を介してネイティブ サービスにクエリを実行し、収集したデータをダンプするか、カスタム コレクション セッションを開始してデバッグできます。

データの収集頻度

パフォーマンス データの収集頻度は、ビルドタイプによって異なります。

  • userdebug ビルドまたは eng ビルドでは、ウォッチドッグはシステム起動中に 1 秒に 1 回、起動完了後に 1 分に 1 回パフォーマンス データを収集します。
  • ユーザービルドでは、ウォッチドッグはシステムの起動中に 20 秒に 1 回、起動が完了してから 2 分に 1 回、パフォーマンス データを収集します。

データ収集イベント

サンプルベースのプロファイリングは、さまざまなシステム イベント(システムの起動、システムの復帰、ユーザーの切り替えなど)中に、直近の N 分間に実行されます。

  • バグレポート生成前の直近 N 分間のイベント: 30 分のローリング ウィンドウ内に生成されます。
  • 起動時イベント: 起動後に生成されます。
  • ユーザー切り替えイベント: ユーザー切り替えが開始された後に生成されます。
  • カスタム コレクション イベント: ポーリング期間と最大期間を指定できます。パッケージでフィルタすることもできます。

パフォーマンス データをダンプする

バグレポートがキャプチャされると、ウォッチドッグ ネイティブ サービスは収集したパフォーマンス データをバグレポートにダンプします。ベンダーは、以下の dumpsys コマンドを使用してネイティブ サービスにクエリを実行し、収集したパフォーマンス データをダンプできます。このレポートについて詳しくは、パフォーマンス レポートについてのセクションをご覧ください。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default > /tmp/carwatchdog_dump.txt

パフォーマンス データを収集してデバッグする

ベンダーは、ウォッチドッグ ネイティブ サービスを使用して、デバッグ目的のパフォーマンス データのカスタム収集を行えます。たとえば、ベンダーはアプリやサービスの I/O 使用状況を把握するために、特定のパッケージ リストまたはシステム全体の I/O 使用状況をプロファイリングするカスタム パフォーマンス データ収集を実行できます。

カスタム コレクション セッションを開始する

カスタム パフォーマンス データ収集セッションを開始するコマンドは次のとおりです。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default --start_perf [--interval <seconds>] [--max_duration <seconds>] [--filter_packages <package_name>,<package_name>,...]
  • --start_perf カスタム パフォーマンス データ収集セッションを開始します。
  • --interval <seconds>: プロファイリング間隔を指定します。この間隔はデフォルトで 30 秒です。
  • --max_duration <seconds>: カスタム パフォーマンス データ収集セッションの最大期間を指定します。セッションを手動で停止しない場合、セッションは停止され、この期間が経過すると収集されたデータは破棄されます。デフォルトでは、この期間は最大で 30 分です。
  • --filter_packages <package_name>,<package_name>... プロファイリングするパッケージ名のカンマ区切りのリストを指定します。リストを指定する場合、パフォーマンス データ収集はこれらのパッケージに制限されます。それ以外の場合、パフォーマンス データ収集はシステム内のすべてのパッケージに対して行われます。

たとえば、次のコマンドは、プロファイリング間隔を 10 秒、最大収集時間を 1 時間に設定してカスタム パフォーマンス データ収集を開始し、プロファイリングを com.google.android.car.kitchensink パッケージと com.google.android.apps.maps パッケージに制限します。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default --start_perf --interval 10 --max_duration 3600 --filter_packages com.google.android.car.kitchensink,com.google.android.apps.maps

カスタム コレクション セッションを停止してダンプする

ベンダーは、目的のアプリやサービスの I/O 使用状況を記録した後、カスタム パフォーマンス データの収集セッションを停止して、収集したデータをダンプする必要があります。このコマンドは、カスタム パフォーマンス データの収集を停止し、収集したデータを /tmp/carwatchdog_dump.txt にダンプします。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default --stop-perf > /tmp/carwatchdog_custom_dump.txt

Dumpsys ヘルプ

dumpsys のヘルプを表示するには:

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default --help

proto 形式にダンプする

必要に応じて、dumpsys データを proto 形式でダンプできます。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default --proto

パフォーマンス データ レポートについて

詳しくは、次のサンプル パフォーマンス データ レポートをご覧ください。

adb shell dumpsys android.automotive.watchdog.ICarWatchdog/default

---------------------------------
WatchdogPerfService report:
---------------------------------
Boot-time collection information:
=================================
Event polling interval: 1 second

Wake-up collection information:
===============================
Event polling interval: 1 second

User-switch collection information:
===================================
Event polling interval: 1 second

Periodic collection information:
================================
Event polling interval: 60 seconds
---------------------------------------------------------------------------
Boot-time performance report:
=================================
No collection recorded
---------------------------------------------------------------------------
Wake-up performance report:
===========================
No collection recorded
---------------------------------------------------------------------------
User-switch events performance report:
======================================
No collection recorded
---------------------------------------------------------------------------
Last N minutes performance report:
======================================
Collection duration: 10800 seconds
Number of collections: 181

Collection 0: <Mon Oct  2 18:36:06 2023 GMT>
=============================================
Total CPU time (ms): 473210
Total CPU cycles: 39553152000
Total idle CPU time (ms)/percent: 435860 / 92.11%
CPU I/O wait time (ms)/percent: 0 / 0.00%
Number of context switches: 13723415093
Number of I/O blocked processes/percent: 0 / 0.00%

Top N CPU Times:
----------------
Android User ID, Package Name, CPU Time (ms), Percentage of total CPU time, CPU Cycles
    Command, CPU Time (ms), Percentage of UID's CPU Time, CPU Cycles
10, com.google.android.carassistant, 13357, 2.82%, 16409088000
    assistant:interactor, 13360, 100.02%, 16409088000
0, system, 9097, 1.92%, 9640512000
    sensors@1.0-ser, 3790, 41.66%, 3773184000
    system_server, 2760, 30.34%, 3135936000
    com.android.car, 1150, 12.64%, 1099584000
    binder:621_4, 1000, 10.99%, 1281024000
    surfaceflinger, 230, 2.53%, 245376000
0, audioserver, 4383, 0.93%, 4597248000
    Main, 2690, 61.37%, 2980416000
    binder:916_2, 950, 21.67%, 925056000
    audioserver, 720, 16.43%, 691776000
0, root, 4357, 0.92%, 3727872000
    irq/311-iam2068, 2630, 60.36%, 2471616000
    irq/26-90b6400., 370, 8.49%, 561024000
    kworker/u16:4-bwmon_wq, 290, 6.66%, 48960000
    kworker/u16:1-memlat_wq, 270, 6.20%, 0
    ipcdaemon, 220, 5.05%, 218304000
10, com.google.android.apps.geo.automotive.adas, 1509, 0.32%, 1756416000
    adas:publishing, 1490, 98.74%, 1735680000
    as:clientparams, 10, 0.66%, 20736000
0, com.android.vending, 796, 0.17%, 765504000
    android.vending, 790, 99.25%, 765504000
0, shared:com.google.uid.shared, 581, 0.12%, 481152000
    google.android.gms, 340, 58.52%, 237312000
    .gms.persistent, 190, 32.70%, 184512000
    process.gservices, 50, 8.61%, 59328000
0, gps, 507, 0.11%, 659136000
    binder:920_2, 500, 98.62%, 659136000
10, com.android.vending, 489, 0.10%, 372288000
    android.vending, 480, 98.16%, 372288000
0, shared:android.uid.systemui, 438, 0.09%, 449856000
    android.systemui, 440, 100.46%, 449856000

Top N Storage I/O Reads:
-------------
Android User ID, Package Name, Foreground Bytes, Foreground Bytes %, Foreground Fsync, Foreground Fsync %, Background Bytes, Background Bytes %, Background Fsync, Background Fsync %
0, root, 56123392, 81.95%, 1, 100.00%, 0, 0.00%, 0, 0.00%
0, system, 12333056, 18.01%, 0, 0.00%, 0, 0.00%, 0, 0.00%

Top N Storage I/O Writes:
-------------------------
Android User ID, Package Name, Foreground Bytes, Foreground Bytes %, Foreground Fsync, Foreground Fsync %, Background Bytes, Background Bytes %, Background Fsync, Background Fsync %
0, com.android.vending, 0, 0.00%, 0, 0.00%, 520192, 46.35%, 20, 47.62%
10, com.android.vending, 0, 0.00%, 0, 0.00%, 520192, 46.35%, 20, 47.62%
10, shared:com.google.uid.shared, 0, 0.00%, 0, 0.00%, 45056, 4.01%, 0, 0.00%
0, shared:com.google.uid.shared, 0, 0.00%, 0, 0.00%, 36864, 3.28%, 2, 4.76%
0, logd, 24576, 40.00%, 0, 0.00%, 0, 0.00%, 0, 0.00%
0, root, 20480, 33.33%, 0, 0.00%, 0, 0.00%, 0, 0.00%
0, system, 16384, 26.67%, 0, 0.00%, 0, 0.00%, 0, 0.00%

Top N I/O waiting UIDs:
-----------------------
Android User ID, Package Name, Number of owned tasks waiting for I/O, Percentage of owned tasks waiting for I/O
    Command, Number of I/O waiting tasks, Percentage of UID's tasks waiting for I/O
0, root, 2, 0.39%
    dp_hdcp2p2, 1, 50.00%
    hdcp_2x, 1, 50.00%

Top N major page faults:
------------------------
Android User ID, Package Name, Number of major page faults, Percentage of total major page faults
    Command, Number of major page faults, Percentage of UID's major page faults
0, com.android.vending, 104, 48.83%
    android.vending, 104, 100.00%
10, com.android.vending, 104, 48.83%
    android.vending, 104, 100.00%
0, shared:com.google.uid.shared, 4, 1.88%
    .gms.persistent, 4, 100.00%
10, shared:com.google.uid.shared, 1, 0.47%
    .gms.persistent, 1, 100.00%
Number of major page faults since last collection: 213
Percentage of change in major page faults since last collection: 0.00%

バグレポートをキャプチャするとき、引数を指定せずにウォッチドッグ dumpsys コマンドを実行したとき、またはカスタム コレクション セッションを停止したとき、ウォッチドッグ ネイティブ サービスは、上記のレポートと同様のパフォーマンス データ レポートをダンプします。

このレポートには、システムの起動時に収集されたデータとレポート生成前の最後の N 分間に収集されたデータが含まれています。

アイテム 説明
起動時の収集情報 起動時のパフォーマンス データ収集セッションに関する情報を提供します。
ウェイクアップ収集情報 システムが一時停止から復帰したときのウェイクアップ パフォーマンス データ収集セッションに関する情報を提供します。
ユーザースイッチの収集情報 ユーザー スイッチがある場合に、ユーザー スイッチのパフォーマンス データ収集セッションに関する情報を提供します。
定期的な収集情報 起動完了後に開始する定期的なパフォーマンス収集セッションに関する情報を提供します。
起動時パフォーマンス レポート システム起動時に収集されたパフォーマンス データが含まれます。このデータはシステムがシャットダウンするまでメモリ内に保持されるため、すべてのレポートにダンプされます。
ウェイクアップ パフォーマンス レポート ウェイクアップ中に収集されたパフォーマンス データが含まれます。このデータは、システムがシャットダウンするまでメモリ内に保持されるため、すべてのレポートにダンプされます。
ユーザー切り替えのパフォーマンス レポート ユーザーの切り替え時に収集されたパフォーマンス データが含まれます。このデータはシステムがシャットダウンするまでメモリ内に保持されるため、すべてのレポートにダンプされます。
直近 N 分間の I/O パフォーマンス レポート レポート生成前の直近の N 分間に(定期的な収集セッションによって)収集されたパフォーマンス データが含まれます。
収集期間 パフォーマンス データの収集の合計時間。
コレクションの数 1 つのレポートでレポートされるコレクションの合計数。

レポートで報告される各コレクションには、以下のセクションのすべてまたは一部が含まれる場合があります。各コレクションで報告される統計情報は、瞬間的な統計情報(たとえば、システムの起動時から集計されていない統計情報)を除く、前回の収集からの差分です。

アイテム 説明
CPU I/O 待機時間/割合 絶対 CPU 時間と、最後の収集以降に I/O オペレーションによるコンテキストの切り替えまたは待機に費やされた合計 CPU 時間の割合。
合計 CPU 時間 合計 CPU 時間(ミリ秒)。
合計アイドル CPU 時間 アイドル状態だった合計 CPU 時間。
CPU I/O 待機時間 CPU が I/O オペレーションの待機に費やした合計時間。
コンテキスト切り替えの数 プロセスまたはスレッド間での CPU 切り替えの数。
I/O がブロックされたプロセスの数/割合 最後の収集以降、I/O を待機してブロックされたプロセスの合計数と、I/O を待機してブロックされたプロセスの割合。
上位 N 個の CPU 時間

前回の収集以降に CPU 時間を最も多く消費した上位 N 個のパッケージ:

  • 各最上位行には、ユーザー ID、パッケージ名、CPU 時間、合計 CPU 時間の割合、CPU サイクルが含まれます。
  • 内部レベルの行には、コマンド、CPU 時間、UID の CPU 時間の割合、CPU サイクルが含まれます。
上位 N 件のストレージ I/O 読み取り

前回の収集以降、ディスクから最も多くのデータを読み取った上位 N 個のパッケージ。

各行には、ユーザー ID、パッケージ名、フォアグラウンド モードとバックグラウンド モードでの読み取りの合計バイト数、システムにおけるすべてのフォアグラウンド モードとバックグラウンド モードでの読み取りバイト数の割合、フォアグラウンド モードとバックグラウンド モードで行われた fsync 呼び出しの合計数、すべてのフォアグラウンド モードとバックグラウンド モードでの fsync呼び出しの割合が含まれます。fsync

上位 N 件のストレージ I/O 書き込み 前回の収集以降に、最も多くのデータをディスクに書き込んだ上位 N 個のパッケージ。各行には、上位 N 個の読み取りに類似したフィールドが含まれています。
上位 N 個の I/O 待機中の UID

I/O 待機タスクが最も多い上位 N 個のパッケージ。

  • 各最上位行には、ユーザー ID、パッケージ名、I/O を待機しているパッケージが所有するタスクの数と割合が含まれます。
  • 内部レベルの行には、パッケージが所有する上位プロセスの I/O 待機情報が含まれます。
上位 N 件の重大なページ フォールト 前回の収集以降に、重大なページ フォールトが発生した上位 N 個のパッケージ。