/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
一、/proc/stat文件解析
该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
文件内容如下:
[root@BJ-13 ~]#cat /proc/stat
cpu 311107 14286 774454 4612300861 632568 36 8533 496130 0
cpu0 171021 7146 330707 2305725802 606003 26 6851 233989 0
cpu1 140085 7140 443746 2306575059 26565 10 1682 262141 0
intr 526859973 124 6 0 0 0 0 0 0 534 0 0 22 104 0 0 83 0 0 0 0 0 0 0 0 0 1654590 0 104292042 394 0 117289661 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 189990419
btime 1430286951
processes 2164575
procs_running < span class="lit">1
procs_blocked 0
softirq 832417014 0 234715147 0 221929883 20 0 2 126520942 725921 248525099
[root@BJ-13 ~]#
这里一共显示了7+行数据,其中cpu[x]会根据服务器内核数自动增长。其含义如下:
cpu - 整体 CPU 各项使用时间
cpu[x] - 单个CPU 各项使用时间
ctxt - 显示系统经历过的上下文切换 context switch 次数。
btime - 计算机开机的时间,以由 epoch (1970 年 1 月 1 日) 至开机时间的秒数表示。
processes - 开机后 fork 的次数
procs_running - 在可运行 (runnable) 状态的进程数目,Linux 2.5.45 开始支持
procs_blocked - 被阻截 (blocked) 直至输入/输出完成的进程数目,Linux 2.5.45 开始支持
CPU整行包括9组数字,单位是jiffies,各列含义如下:
user - CPU 花在用户模式的时间,即运行应用程序花费的时间
nice - CPU 花在 nice 值大于一般值 0 (即有较低优先级别) 进程的时间。
system - CPU 花在系统模式即在内核空间 (kernel space) 的时间,即在运行内核工作的时间
idle - CPU 闲置的时间,其值一定为 /proc/uptime 中第二个项目乘 USER_HZ
iowait - CPU 花在等候输入/输出的时间,Linux 2.5.41 开始才开始支援
irq - CPU 花在处理硬件中断 (hardware interrupt) 的时间,Linux 2.6.0-test4 开始支持
softirq - CPU 花在处理 softirq 软件中断的时间,Linux 2.6.0-test4 开始支持
steal_time - 在虚拟环境下 CPU 花在处理其他作业系统的时间,Linux 2.6.11 开始支持
guest - 在 Linux 内核控制下 CPU 为 guest 作业系统运行虚拟 CPU 的时间,Linux 2.6.24 开始支持
二、计算CPU利用率
2.1 CPU利用率算法
A时刻取出cpu各值
sleep0.5秒后,
B时刻取出cpu各值
CPU繁忙时间=CPU总时间-空闲时间
CPU利用率=(B时刻CPU繁忙时间-A时刻繁忙时间)/(B时刻总时间-A时刻总时间)
2.2 shell实现
#/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
echo CPU: $CPU %
shell实现(精确到小数点后两位)
#/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
PRECPU=`echo "scale=2; $prevtotal-$previdle" |bc`
NOWCPU=`echo "scale=2; $total-$idle" |bc`
CPU=`echo "scale=2; 100*($NOWCPU-$PRECPU)/($total-$prevtotal)"|bc `
echo CPU: $CPU %
参考资料
https://bbs.archlinux.org/viewtopic.php?pid=874333#p874333
http://www.blogjava.net/fjzag/articles/317773.html
http://new-acos.blogspot.hk/2010/02/linuxprocstatcpu.html
转载请注明:IPCPU-网络之路 » 关于/proc/stat和CPU使用率的计算