一、简介
在使用 App 时经常会遇到手机发热发烫或者应用 ANR 无响应等一系列问题,这都是因为 CPU 使用率过高或过于繁忙,使整个系统无法响应用户操作,整体性能降低,用户体验非常差,所以我们需要进行 CPU 测试来检测系统是否存在这一系列问题。
1.1 CPU 性能测试指标
Android CPU 性能测试主要关注两个指标:
1. CPU 总体使用率
2. 应用程序 CPU 占用率
- 空闲状态下应用CPU消耗情况
- 中等规格状态(CPU已占用50%),应用CPU消耗情况
- 高负荷(CPU占用80%以上),应用CPU消耗情况
1.2 CPU 计算公式
在Linux系统下,CPU 利用率分为用户态、系统态、空闲态,分别表示 CPU 处于用户态执行的时间、系统内核执行的时间、空闲系统进程执行的时间(如下图)。
CPU 使用率计算公式:
二、查看 CPU 指标
2.1 top 命令
top 命令提供了实时的对系统处理器的状态监控,可以按 CPU 使用内存和执行时间对任务进行排序。
优缺点:易获取,但可能存在误差
1. 查看 top 命令帮助信息
adb shell top -h
2. 使用命令获取 CPU 使用情况
adb shell top -m 10 -n 1 -d 2 -s cpu -t
第一组数据(CPU占用率):
- User:用户进程
- System:系统进程
- IOW:IO等待时间
- IRQ:硬中断时间
第二组数据(CPU使用情况):
- User:处于用户态的运行时间,不包含优先值为负进程
- Nice:优先值为负的进程所占用的CPU时间
- Sys:处于核心态的运行时间
- Idle:除IO等待时间以外的其它等待时间
- IOW:IO等待时间
- IRQ:硬中断时间
- SIRQ:软中断时间
第三组数据(进程属性):
- PID:进程id
- PR:优先级
- CPU%:当前瞬时CPU占用率
- S:进程状态(D=不可中断的睡眠状态,R=运行状态,S=睡眠状态,T=跟踪/停止状态,Z=僵尸进程)
- #THR:程序当前所用的线程数
- VSS:Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS:Resident Set Size 实际使用屋里内存(包含共享库占用的内存)
- PCY:调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
- UID:进程所有者的用户id
- Name:进程名称
2.2 cpuinfo
信息较少,不推荐使用
adb shell dumpsys cpuinfo
进程917 CPU占用率4.2%,其中用户user话费2%,内核空间kernel话费2.2%
2.3 /proc 文件获取
/proc 文件系统是一个伪文件系统,只存在内存当中,不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,/proc文件系统是动态从系统内核读出所需信息并提交的。
安卓性能指标 cpu 总体使用率和应用程序 cpu 占用率主要与两个 proc 文件相关,分别是 /proc/stat 和 /proc/进程id/stat文件.。
stat 中存储了 cpu 从启动到当前时刻的活动信息,可查看 cpu 总体使用率 adb shell cat /proc/stat
以 cpu 开头的行是关注重点,cpu0 表示当前 CPU 的核心(如果为双核还会有 cpu1),cpu 为总的 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 |
要统计某个 App 的使用率可以进入到/proc/进程id/stat目录
1. 先获取 App 进程 ID,以豆瓣为例
2. 查询对应的 stat 文件
在第14行(utime)、15行(stime)记录了当前进程的 Jiffies 信息
- utime=963 该任务在用户态运行的时间,单位为 jiffies
- stime=259 该任务在核心态运行的时间,单位为 jiffies
所以当前进程的Jiffies计算方式为utime+stime,要计算出一段时间内该进程的CPU使用率可使用:(当前时间(utime + stime) - 旧时间(utime + stime))/ total cpu Jiffies
2.4 第三方工具
如腾讯 GT、网易 Emagee 等。