cpu的主要性能指标不包括 cpu的主要性能指标是

指标背景
很多场景下我们去使用 App,可能会碰到手机会出现发热发烫的现象 。这是因为 CPU 使用率过高、CPU 过于繁忙,会使得整个系统无法响应用户,整体性能降低,用户体验变得相当差,也容易引起 ANR 等等一系列问题 。Android 性能指标 CPU 主要关注两点:
CPU 总体使用率应用程序 CPU 占用率指标值获取
直接上干货,获取 App CPU 指标值的几种不同方式
读取 Linux proc 文件系统(精确、方便自动化集成)使用外部第三方工具来辅助测试,比如:腾讯 GT,网易 Emagee 等(其实这些工具的原理就是基于调用 Android 系统底层的 API 完成),掌握 adb 或者第三方工具获取方法都可以 。(精确,易获取,推荐)Linux top 命令(有误差,易获取)proc 文件获取方式
【cpu的主要性能指标不包括 cpu的主要性能指标是】/proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间 。它以文件系统的方式为内核与进程提供通信的接口 。用户和应用程序可以通过/proc 得到系统的信息,并可以改变内核的某些参数 。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc 目录中的文件时,/proc 文件系统是动态从系统内核读出所需信息并提交的 。我们关注的安卓性能指标 CPU 总体使用率和应用程序 CPU 占用率主要与两个 proc 文件相关,分别是/proc/stat 和/proc/进程 id/stat 文件 。。通过 adb shell 进入到手机内部 shell 模式,再通过 cat /proc/stat 查看结果如下:

cpu的主要性能指标不包括 cpu的主要性能指标是


前面三行 CPU cpu0 cpu1 是我们需要关注的重点,cpu0、cpu1 表示当前 CPU 的核心(双核),CPU 为总的 Jiffies,这里引入了 Jiffies(时间片)的概念,Jiffies 的介绍如下:
Jiffies 为 Linux 核心变数,是一个 unsigned long 类型的变量,它被用来记录系统自开机以来,已经过了多少 tick 。每发生一次 timer interrupt,Jiffies 变数会被加 1
而上面每一列的数值含义如下:user :从系统启动开始累计到当前时刻,用户态的 jiffies,不包含 nice 值为负进程;nice :从系统启动开始累计到当前时刻,nice 值为负的进程所占用的 jiffies;system :从系统启动开始累计到当前时刻,系统态的 jiffies;idle :从系统启动开始累计到当前时刻,除硬盘 IO 等待时间以外其它等待的 jiffies;iowait : 从系统启动开始累计到当前时刻,硬盘 IO 等待的 jiffies;irq : 从系统启动开始累计到当前时刻,硬中断的 jiffies;softirq :从系统启动开始累计到当前时刻,软中断的 jiffies 。总的 Jiffies 就是上面所有项加起来的总和 。因此我们计算一段时间的 CPU 占用率的时候就可以使用:total=user+system+nice+idle+iowait+irq+softirq*CPU usage=[(user_end +sys_end+nice_end) – (user_begin + sys_begin+nice_begin)]/(total_end – total_begin)100
上述方法统计的是当前系统所有进程的 CPU 总和使用率如果我们要统计某个 App 的使用率可以进入到/proc/进程 id/stat 目录,其中就有包含某进程的 CPU 信息首先,我们需要查询到 App 的进程 ID,以柠檬班 App 举例
cpu的主要性能指标不包括 cpu的主要性能指标是


其中的进程 ID 为 1228,再查询 stat 文件信息:
cpu的主要性能指标不包括 cpu的主要性能指标是


在第 14 行、15 行有记录当前进程的 Jiffies 信息utime=448 该任务在用户态运行的时间,单位为 jiffiesstime=2380 该任务在核心态运行的时间,单位为 jiffies所以当前进程的 Jiffies 计算方式为 utime+stime通过 shell 脚本获取的方式:cat /proc/进程 id/stat | awk -F " " '{print $14,$15}'要计算出一段时间内该进程的 CPU 使用率信息即可通过:utime+stime(当前时间点)-utime+stime(旧时间点)/ total CPU Jiffies

推荐阅读