收集性能数据

监控定时器原生服务会在系统启动期间从 early-init 阶段开始记录 I/O 性能数据。原生服务会将收集的性能数据转储到 bug 报告中。供应商可以通过 dumpsys 查询原生服务,从而转储收集的数据,或启动自定义收集会话以进行调试。

数据收集频率

性能数据收集的频率因 build 类型而异。

  • 在 userdebug build 或 eng build 中,监控定时器会在系统启动期间每一 (1) 秒收集一次性能数据,并在启动完成后每 (1) 分钟收集一次性能数据。
  • 在 user build 上,监控定时器会在系统启动期间每 20 秒收集一次性能数据,并在启动完成后每二 (2) 分钟收集一次性能数据。

转储性能数据

捕获到 bug 报告时,监控定时器原生服务会将收集的性能数据转储到 bug 报告中。供应商可以通过以下 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.kitchensinkcom.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%

如果捕获 bug 报告,在不使用任何参数的情况下运行监控定时器 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。单个报告中报告的收集总数。

报告中报告的每次收集都可能包含以下所有内容或部分内容。每次收集中报告的统计信息都是自上次收集之后的增量数据,但瞬时性的统计信息(例如,自系统启动之后未汇总的统计信息)除外。

  • 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 调用的百分比。
  • 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