CPU利用率计算
/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非常困难;