Linux层有公共目录。很多公共信息资源由两个虚拟的文件系统提供:
/proc:包括内存,CPU,网络等
/sys:设备驱动,网络环境(/sys/class/net/)等
我们先通过proc/stat 来获取cpu的整体情况
adb shell cat proc/stat
在对图片中的数据进行解析
第一列中(cpu ) :是cpu的名称
第二列中 (212510)user : 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含nice值为负进程。1 jiffies=0.01秒
第三列中 (10540 )nice :从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
第四列中(132215)system : 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
第五列中(399620) idle: 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
第六列中(3781) iowait: 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies)
第七列中(0) irq :从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
第八列中(18) softirq: 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
第九列中(0) stealstolen: 从系统启动开始累积到当前时刻,在虚拟环境运行时花费在其他操作系统的时间
第十列中(0) guest: 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费的时间。
第十一列中(0) guest_nice: 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费在nice进程上的时间。
总的CPU时间 cpu_time = user + system + nice + idle + iowait + irq + softirq
我们再通过proc/stat 来进程cpu的情况
adb shell cat/pid/stat
在对图片中的数据进行解析
pid=5832进程(包括轻量级进程,即线程)号
comm=ncent.wecarnavi 应用程序或命令的名字
task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=396父进程ID
pgid=395线程组号
sid=0 该任务所在的会话组ID
tty_nr=0 (pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
tty_pgrp=-1 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=1077936448 进程标志位,查看该任务的特性
min_flt=757469 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=1051累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=165该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=7796该任务在用户态运行的时间,单位为jiffies
stime=1229该任务在核心态运行的时间,单位为jiffies
cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=1 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=20任务的动态优先级
nice=0 任务的静态优先级
num_threads=100 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=1925666 该任务启动的时间,单位为jiffies
vsize=1934348288(page) 该任务的虚拟地址空间大小
rss=53203(page) 该任务当前驻留物理地址空间的大小
以下只解释对我们计算Cpu使用率有用相关参数
参数 解释
pid=5832 进程号
utime=7796 该任务在用户态运行的时间,单位为jiffies
stime=1229 该任务在核心态运行的时间,单位为jiffies
cutime=0 所有已死线程在用户态运行的时间,单位为jiffies
cstime=1 所有已死在核心态运行的时间,单位为jiffies
进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。
总的Cpu使用率计算
计算方法:
1、 采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
2、 计算总的Cpu时间片totalCpuTime
a) 把第一次的所有cpu使用情况求和,得到s1;
b) 把第二次的所有cpu使用情况求和,得到s2;
c) s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = j2 - j1 ;
3、计算空闲时间idle
idle对应第四列的数据,用第二次的第四列 - 第一次的第四列即可
idle=第二次的第四列 - 第一次的第四列
6、计算cpu使用率
pcpu =100* (total-idle)/total
某一进程Cpu使用率的计算
计算方法:
1. 采样两个足够短的时间间隔的cpu快照与进程快照,
a) 每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
b) 每一个进程快照均为 (utime、stime、cutime、cstime)的4元组;
2. 分别根据(进程的总Cpu时间,总的CPU时间)计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2
3. 计算该进程的cpu使用率pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%计算,如果是多核情况下还需乘以cpu的个数);