/proc/stat
    在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。

adb shell cat /proc/stat

 

参数解释
user从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies),不包含 nice值为负进程。
nice从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies)
irq从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

 

参数解释
intr这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
ctxt给出了自系统启动以来,CPU发生的上下文交换的次数。
btime给出了从系统启动到现在为止的时间,单位为秒。
processes (total_forks)自系统启动以来所创建的任务的个数目。
procs_running当前运行队列的任务的数目。
procs_blocked当前被阻塞的任务的数目。

 

计算CPU总时间

CPU时间=user+system+nice+idle+iowait+irq+softirq
total_0=user[0]+nice[0]+system[0]+idle[0]+iowait[0]+irq[0]+softirq[0];
total_1=user[1]+nice[1]+system[1]+idle[1]+iowait[1]+irq[1]+softirq[1];

 

计算某时间点当前的CPU利用率

cpu_usage=100*(idle[1]-idle[0])/(total_1-total_0)
cpu_usage=((user[1]+nice[1]+system[1])-(user[0]+nice[0]+system[0]))/(total_1-total_0) * 100

ps:分别是bash和shell的当前CPU利用率计算方式
 

计算从开机到某时间点的CPU利用率

cpu_usage=idle[0]/total_0
cpu_usage=user[0]+nice[0]+system[0]/total_0 * 100

 

iowait时间是不可靠值,理由如下:

当CPU进入空闲状态,很可能会调度另一个任务执行,所以iowait计算时间偏小;

多核CPU,iowait的计算并非某一个核,因此计算每一个cpu的iowait非常困难;

文章目录