Android* 应用程序的性能评估





4.00/5 (4投票s)
在本说明中,我们将讨论如何获取 Android* 操作系统的类似性能数据。
Intel® Developer Zone 为跨平台应用开发、平台和技术信息、代码示例以及同行专业知识提供工具和操作方法信息,以帮助开发人员进行创新和取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术 和 Windows,下载工具,访问开发套件,与志同道合的开发人员交流想法,并参与黑客马拉松、竞赛、路演和本地活动。
概述
为了优化应用程序以获得最佳用户体验,了解应用程序在特定平台上产生的性能需求非常重要。在 Linux* 操作系统上,可以使用 vmstat 来监控应用程序的许多性能方面,例如其内存占用、CPU 和 IO 需求。Windows* 任务管理器为 Windows* 操作系统提供了类似的功能。在本说明中,我们将讨论如何获取 Android* 操作系统的类似性能数据。
讨论
Android* 本质上是一个 Linux* 操作系统,因此提供类似的性能数据。获取这些数据有些困难,因为手机/平板电脑的使用模式只允许一个应用程序在前台运行。
监控 Android* 上应用程序性能的第一个任务是,在应用程序运行感兴趣的工作负载时运行性能监控实用程序。例如,我们想监控视频播放应用程序的性能,以了解为什么该应用程序无法以所需的帧速率运行。由于我们感兴趣的应用程序(在此情况下是视频播放器)在前台运行,我们需要找到一种替代方法来在视频播放器运行时监控性能。一种解决办法是编写一个 Android* 服务,该服务持续在后台运行,并将性能数据记录到可以稍后检查的文件中。一种更简单的方法是使用 Android* Debug Bridge (adb) 实用程序。Android* ADB 通过 USB 数据线或 TCP/IP 端口提供到 Android* 操作系统的调试 Shell。使用以下过程通过 TCP/IP 启用 adb 调试。
- 在 Android* 控制面板中启用 USB 调试。
- 通过 USB 数据线将设备连接到主机。如果使用 Windows* 主机,您可能需要从设备制造商处获取 USB 设备驱动程序。Linux* 主机通常不需要特殊的设备驱动程序。
- 通过发出命令 'adb devices' 来确保主机可以看到设备。该命令应返回连接到主机的设备列表。
- 通过发出命令 'adb tcpip 5555' 来启用 TCPIP 调试。此命令指示 adb 重新启动并侦听端口 5555 的 adb 连接消息。
- 断开 USB 数据线,然后通过发出命令 'adb <device_ip_address>' 重新连接到设备。
通过 adb 连接后,用户将能够访问 Unix Shell,该 Shell 可用于在感兴趣的应用程序在设备的主屏幕上运行时运行各种后台监控命令,例如 'top' 和 'vmstat'。请记住,与其他命令并行运行应用程序可能会降低感兴趣的应用程序的性能。例如,'top' 命令相当消耗 CPU,应谨慎使用。以最小开销监控性能的最佳方法是简单地在固定的时间间隔收集操作系统已生成的数据,并将其存储在文件中,以便在应用程序停止后进行后处理。Android* 类似于 Linux*,在 /proc 文件系统中提供了大多数性能统计信息。感兴趣的性能数据存储在 /proc/stat 中。要以 5 秒的固定时间间隔监控系统性能,只需使用类似的 Shell 脚本。
while : do echo Date: `date +"%Y-%m-%d %H:%M:%S”` cat /proc/stat >> /data/local/tmp/myvmstat.out sleep 5 done
以下是 Android* Media Player 在 Motorola Xoom*1 平板电脑上播放 720p H264 视频时,以 5 秒间隔捕获的 /proc/stat 的两个示例。数据已导入电子表格以提高可读性。
/proc/stat 中包含大量数据。最相关的信息在第一行,报告所有 CPU 活动的总和。每个以 'cpuN' 开头的后续行报告该特定 CPU 的活动。我们可以看到这里示例设备有两个处理器。这些字段的含义如下解释:
1 * 其他名称和品牌可能被声明为他人财产
时间单位以 USER_HZ(通常是百分之一秒)给出。这些统计数据中的数值自系统启动以来是累计的。要获取每个时间间隔的性能数据,需要计算在每个时间间隔的开始和结束时捕获的数据之间的差值。
User: 在用户模式下执行进程所花费的时间
Nice: 在“nice”用户模式下执行进程所花费的时间。“Nice”进程是指优先级与默认优先级不同的进程。
System: 在内核或监管模式下执行所花费的时间。
Idle: 执行空闲进程所花费的时间。没有可运行的进程。
Iowait: 等待 IO 完成所花费的时间。
Irq: 处理中断所花费的时间。
Softirq: 处理 softIRQs 所花费的时间。
Steal, Guest Time, Guest Nice Time: 花费在虚拟化访客操作系统上的时间。在 Android* 中,这些值通常为零。
/proc/stats 中报告的其余数据如下所述:
Intr: 系统执行的中断数。'intr' 标签后的第一列是自系统启动以来执行的总中断数。后续列中的值表示自中断 0 开始,为列号指示的中断执行的中断数。
Ctxt: 自系统启动以来执行的上下文切换次数。
Btime: 系统启动时间,以自 1970 年 1 月 1 日 GMT 以来的秒数偏移量表示。
Processes: 自启动以来系统创建的进程数。
Procs running: 正在运行的进程数。
Procs blocked: 正在等待 IO 完成而阻塞的进程。
Softirq: 处理的 softirq 总数。SoftIRQ 是非时间关键的软件中断。
下表显示了上述两个数据样本之间的差异。Sum 列显示了在各种任务中花费的总时间单位。CPU Util 列是所有非空闲任务的总和。每个 CPU 下方的行以总时间的百分比显示相同的数据。请注意,在各种任务中花费的总时间加起来为 5 秒。由于系统中存在两个处理器,每个样本的总可用 CPU 时间为 2x5 = 10 秒。
对于视频播放等相当长时间运行的工作负载,我们可以形成一个时间图,显示工作负载随时间的 CPU 利用率。研究此类时间图可以识别工作负载可能占用处理器资源的不同阶段。下图 1 显示了一个图形化工作负载的时间图。我们注意到工作负载达到的最大 CPU 利用率仅为 50%。这表明该工作负载只能利用一个 CPU。如果提高此工作负载的速度很重要,那么找到利用第二个 CPU 的方法可能值得。
CPU 利用率并不能说明全部性能情况。现代处理器通常可以在几种不同的频率下运行,称为 pstates。操作系统可以更改处理器运行频率以最小化功耗,并在移动设备的情况下延长电池寿命。
下图 2 显示了 CPU 利用率以及相同平板电脑播放相同 720p H264 和 360p H264 编码视频片段的平均处理器运行频率。数据显示,播放 720p H264 视频比 CPU 利用率差异所显示的资源消耗要大得多。解码 720p H264 视频不仅需要大约 4 倍的 CPU 利用率,还需要以大约 2.4 倍的更高频率运行处理器。
Android* 在 /sys/devices/system/cpu/cpuX/cpufreq/stats/time_in_state 文件中报告其处理器运行频率或 pstate。下面的脚本已修改为包含处理器 pstate 数据的收集。
while : do echo Date: `date +"%Y-%m-%d %H:%M:%S”` cat /proc/stat >> /data/local/tmp/myvmstat.out echo CPU0 Pstate Residency cat /sys/devices/cpu/cpu0/cpufreq/stats/time_in_state echo CPU1 Pstate Residency cat /sys/devices/cpu/cpu1/cpufreq/stats/time_in_state sleep 5 done
Motorola Xoom 的处理器 pstate 信息返回的数据如下所示。
CPU0 PState Residency 216000 4356448 312000 400626 456000 559897 608000 398231 760000 92081 816000 0 912000 0 1000000 1485891
每对数据代表一个 pstate 频率(以 KHz 为单位)以及自系统启动以来在该状态下花费的时间(以百分之一秒为单位)。可用的 pstate 数量因处理器而异。在此情况下,驱动 Motorola Xoom 的 NVIDIA Tegra2 处理器提供 8 个可能的 pstate,范围从 216 MHz 到 1 GHz。
应用用于计算 CPU 利用率的相同技术,我们可以计算出处理器在给定采样间隔内花费在每个 pstate 的时间百分比。我们还可以通过计算 pstate 频率和在该 pstate 中花费时间的百分比的加权总和来推导出同一间隔的平均频率。此类数据已导出并显示在图 1 中。
摘要
使用 adb 并利用 Android* 从 Linux* 继承的现有性能基础设施,我们可以深入了解 Android* 应用程序的性能特性。这些见解可用于应用程序优化,例如改善用户体验、降低功耗。