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

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

データの収集頻度

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

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

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

バグレポートがキャプチャされると、ウォッチドッグ ネイティブ サービスは収集したパフォーマンス データをバグレポートにダンプします。ベンダーは、以下の 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 seconds、最大収集時間を 1 hour として、カスタム パフォーマンス データ収集を開始し、プロファイリングを 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 ヘルプ

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

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

パフォーマンス データ レポートのサンプルを以下に示します。

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

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

Periodic collection information:
=========================
Event interval: 60 seconds
--------------------------------
Boot-time I/O performance report:
============================
Collection duration: 1637609138 seconds
Number of collections: 12

Collection 0: <Fri Jan  7 19:53:53 2022 GMT>
===================================
CPU I/O wait time/percent: 18 / 0.63%
Number of I/O blocked processes/percent: 0 / 0.00%

Top N 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 Writes:
-------------
Android User ID, Package Name, Foreground Bytes, Foreground Bytes %, Foreground Fsync, Foreground Fsync %, Background Bytes, Background Bytes %, Background Fsync, Background Fsync %
0, root, 53248, 100.00%, 1, 100.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.59%
        kworker/7:2+events, 1, 50.00%
        kworker/4:2+events, 1, 50.00%
0, system, 2, 7.14%
        ais_server, 2, 100.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, system, 48, 53.33%
        ais_server, 13, 27.08%
        audiod, 10, 20.83%
0, root, 41, 45.56%
        init, 39, 95.12%
        ueventd, 1, 2.44%
0, media, 1, 1.11%
        init.qti.media., 1, 100.00%
Number of major page faults since last collection: 90
Percentage of change in major page faults since last collection: 0.00%

Collection 1: <Fri Jan  7 19:53:54 2022 GMT>
===================================
 … Collection data …

Collection 2: <Fri Jan  7 19:53:55 2022 GMT>
===================================
 … Collection data …
 … Repeated collection data until boot-complete …

-----------------------------------------
Last N minutes I/O performance report:
================================
Collection duration: 10797 seconds
Number of collections: 181

Collection 0: <Tue Jan 11 19:43:05 2022 GMT>
====================================
CPU I/O wait time/percent: 18 / 0.04%
Number of I/O blocked processes/percent: 0 / 0.00%

Top N Writes:
-------------
Android User ID, Package Name, Foreground Bytes, Foreground Bytes %, Foreground Fsync, Foreground Fsync %, Background Bytes, Background Bytes %, Background Fsync, Background Fsync %
0, system, 33697792, 92.41%, 0, 0.00%, 0, 0.00%, 0, 0.00%
0, gps, 2420736, 6.64%, 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, 1, 0.19%
        crtc_commit:244, 1, 100.00%

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

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

  • Boot-time collection information。起動時のパフォーマンス データ収集セッションに関する情報を提供します。
  • Periodic collection information。起動完了後に開始される定期的なパフォーマンス収集セッションに関する情報を提供します。
  • Boot-time I/O performance report。システムの起動時に収集されたパフォーマンス データが含まれています。このデータは、システムがシャットダウンするまでメモリ内に保持されるため、すべてのレポートにダンプされます。
  • Last N minutes I/O performance report。レポート生成前の最後の N 分間に定期的な収集セッションを通じて収集されたパフォーマンス データが含まれます。
  • Collection duration。パフォーマンス データ収集の合計期間。
  • Number of collections。1 つのレポートで報告されたコレクションの合計数。

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

  • CPU I/O wait time/percent。前回の収集以降に I/O オペレーションのためにコンテキストの切り替えや待機に費やされた合計 CPU 時間と合計 CPU 時間の割合。
  • Number of I/O blocked processes/percent。最後のコレクション以降、I/O の待機中にブロックされたプロセスの合計数と、I/O の待機中にブロックされたプロセスの割合。
  • Top N Reads。前回のコレクション以降、ディスクから最も多くのデータを読み取った上位 N 個のパッケージ。
    • 各行には、ユーザー ID、パッケージ名、フォアグラウンド モードとバックグラウンド モードで読み取られたバイト数の合計、システム内で読み取られたすべてのフォアグラウンド モードとバックグラウンド モードでのバイト数の割合、フォアグラウンド モードとバックグラウンド モードで行われた fsync 呼び出し数の合計、システム内で行われたすべてのフォアグラウンド モードとバックグラウンド モードの fsync 呼び出しでの fsync 呼び出しの割合が含まれます。
  • Top N Writes。前回のコレクション以降、ディスクに最も多くのデータを書き込んだ上位 N 個のパッケージ。
    • 各行には、Top N Reads と類似したフィールドがあります。
  • Top N I/O waiting UIDs。I/O 待機タスクが最も多い上位 N 個のパッケージ。
    • 各最上位行には、ユーザー ID、パッケージ名、番号、I/O を待機しているパッケージが所有するタスクの数と割合が含まれます。
    • 中間レベルの行には、パッケージが所有する最上位プロセスの I/O 待機情報が含まれます。
  • Top N major page faults。前回のコレクション以降に最も多くページ障害が発生した上位 N 個のパッケージ。
    • 各最上位行には、ユーザー ID、パッケージ名、パッケージに起因する主要なページ フォールトの数と割合が含まれます。
    • 中間レベルの行には、パッケージが所有する上位プロセスの主なページ フォールト情報が含まれます。
  • Number of major page faults since last collection
  • Percentage of change in major page faults since last collection