Android性能监测之CPU使用率

一、proc文件系统介绍
/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。
了解了proc文件系统,接下来就可以开始读取整机及应用相关的CPU使用情况了。 
二、整机的CPU使用率
1、获取整机CPU使用情况
要查看机器的CPU使用情况,可通过查看/proc/stat 文件,该文件包含了所有自系统启动以来累计的CPU活动信息
查看方式:在 adb shell模式下,输入cat /proc/stat
以我的手机为例,打开文件后,可以看到如下内容:
以上数据的单位是jiffies, jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间。
上图所示的第一行数据即为设备所有cpu的运行数据,其含义如下:
user (29048)    从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice (5966)      从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。这里解释下何为nice。
每一人进程都有一个PRI和NI值,可通过ps -l 命令查看。PRI还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
system (19488)  从系统启动开始累计到当前时刻,处于核心态的运行时间
idle (8333)   从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait (5811) 从系统启动开始累计到当前时刻,IO等待时间
irq (0)           从系统启动开始累计到当前时刻,硬中断时间
softirq (22)      从系统启动开始累计到当前时刻,软中断时间
stealstolen(0)     在虚拟机环境下运行其他操作系统所花费的时间
guest(0)       运行在访客模式下所花费的时间
guest_nice (0) 运行在访客模式下,nice值为负的进程所占用的CPU时间。 
2、总的CPU使用率计算方法:
a、  采样两个足够短的时间间隔的Cpu快照,分别为t1,t2,其中t1、t2均包含(user、nice、system、idle、iowait、irq、softirq、stealstolen、 guest)9个元素;
b、  计算总的cpu时间
        把第一次的所有cpu使用情况求和,得到total_t1;
        把第二次的所有cpu使用情况求和,得到total_t2;
        这个时间间隔内的所有时间片,即totalCpuTime = total_t2 - total_t1 ;
c、计算空闲时间idle
idle对应第四列的数据,用第二次的idle - 第一次的idle即可
idle = idle_t2 – idle_t1
d、计算cpu使用率
cpuUsage = 100 * (total_t2 - total_t1 – (idle_t2 – idle_t1)) / (total_t2 – total_t1) 
三、应用相关CPU使用率
1、获取应用相关的CPU使用情况
首先需要通过ps -l 命令查看应用的pid,
然后输入命令:cat /proc/<pid>/stat,可查看应用相关的CPU使用情况
pid(19544) 进程号
S 表示任务状态为Sleep
utime (682) 该任务在用户态运行的时间,单位为jiffies
stime(211) 该任务在核心态运行的时间,单位为jiffies
2、应用相关的CPU使用率计算方法:
同样采样两个足够短的时间间隔的CPU快照,t1,t2
计算总的CPU时间和应用所占的CPU时间。总的CPU时间上面已经介绍过了,
应用进程所占用的CPU时间pcpu=utime + stime,
再除以总的cpu时间,即可得到该进程的cpu占用率了。
pcpuUsage=100*(pcpu_t2 - pcpu_t1)/(total_t2 - total_t1)
四、程序实现
有了以上的理论基础,剩下的就是用代码来实现读取和计算的工作了。下面附一段简单的示例:


本文来自网易实践者社区,经作者施红授权发布。