最新消息:

关于/proc/stat和CPU使用率的计算

Linux ipcpu 3504浏览

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

一、/proc/stat文件解析

该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。

文件内容如下:

  1. [root@BJ-13 ~]#cat /proc/stat
  2. cpu 311107 14286 774454 4612300861 632568 36 8533 496130 0
  3. cpu0 171021 7146 330707 2305725802 606003 26 6851 233989 0
  4. cpu1 140085 7140 443746 2306575059 26565 10 1682 262141 0
  5. 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
  6. ctxt 189990419
  7. btime 1430286951
  8. processes 2164575
  9. procs_running < span class="lit">1
  10. procs_blocked 0
  11. softirq 832417014 0 234715147 0 221929883 20 0 2 126520942 725921 248525099
  12. [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利用率算法

  1. A时刻取出cpu各值
  2. sleep0.5秒后,
  3. B时刻取出cpu各值
  4. CPU繁忙时间=CPU总时间-空闲时间
  5. CPU利用率=(B时刻CPU繁忙时间-A时刻繁忙时间)/(B时刻总时间-A时刻总时间)

2.2 shell实现

  1. #/bin/bash
  2. read cpu a b c previdle rest < /proc/stat
  3. prevtotal=$((a+b+c+previdle))
  4. sleep 0.5
  5. read cpu a b c idle rest < /proc/stat
  6. total=$((a+b+c+idle))
  7. CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
  8. echo CPU: $CPU %

shell实现(精确到小数点后两位)

  1. #/bin/bash
  2. read cpu a b c previdle rest < /proc/stat
  3. prevtotal=$((a+b+c+previdle))
  4. sleep 0.5
  5. read cpu a b c idle rest < /proc/stat
  6. total=$((a+b+c+idle))
  7. PRECPU=`echo "scale=2; $prevtotal-$previdle" |bc`
  8. NOWCPU=`echo "scale=2; $total-$idle" |bc`
  9. CPU=`echo "scale=2; 100*($NOWCPU-$PRECPU)/($total-$prevtotal)"|bc `
  10. 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使用率的计算