创客百科

姿势共享,有节操无门槛参与的创客百科,创客动力之源 \ (^_^) /

用户工具

站点工具


note:spoony:用-proc-stat计算cpu的占用率

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

note:spoony:用-proc-stat计算cpu的占用率 [2017/08/29 13:42] (当前版本)
Spoony 创建
行 1: 行 1:
 +====== 用/​proc/​stat计算cpu的占用率 ======
 +<​code>​
 +在Linux下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间,三者之和就是CPU的总时间,当没有用户进程、系统进程等需要执行的时候,CPU就执行系统缺省的空闲进程。从平常的思维方式理解的话,CPU的利用率就是非空闲进程占用时间的比例,即CPU执行非空闲进程的时间 / CPU总的执行时间。
  
 +在linux系统中,CPU时间的分配信息保存在/​proc/​stat文件中,利用率的计算应该从这个文件中获取数据。文件的头几行记录了每个CPU的用户态,系统态,空闲态等状态下分配的时间片(单位是Jiffies),这些数据是从CPU加电到当前的累计值。常用的监控软件就是利用/​proc/​stat里面的这些数据来计算CPU的利用率的。
 +
 +不同版本的linux /​proc/​stat文件内容不一样,以Linux 2.6来说,/​proc/​stat文件的内容如下:
 +
 +cpu 2032004 102648 238344 167130733 758440 15159 17878 0
 +
 +cpu0 1022597 63462 141826 83528451 366530 9362 15386 0
 +
 +cpu1 1009407 39185 96518 83602282 391909 5796 2492 0
 +
 +intr 303194010 212852371 3 0 0 11 0 0 2 1 1 0 0 3 0 11097365 0 72615114 6628960 0 179 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 236095529
 +
 +btime 1195210746
 +
 +processes 401389
 +
 +procs_running 1
 +
 +procs_blocked 0
 +
 +第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义(单位:jiffies):
 +
 +user
 + ​(2032004)
 +
 +从系统启动开始累计到当前时刻,用户态的CPU时间,不包含nice值为负进程。
 +
 +nice (102648)
 +
 +从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
 +
 +system
 + ​(238344)
 +
 +从系统启动开始累计到当前时刻,核心时间
 +
 +idle (167130733)
 +
 +从系统启动开始累计到当前时刻,除IO等待时间以外其它等待时间
 +
 +iowait
 + ​(758440)
 +
 +从系统启动开始累计到当前时刻,IO等待时间
 +
 +irq (15159)
 +
 +从系统启动开始累计到当前时刻,硬中断时间
 +
 +softirq
 + ​(17878)
 +
 +从系统启动开始累计到当前时刻,软中断时间
 +
 +因为/​proc/​stat中的数值都是从系统启动开始累计到当前时刻的积累值,所以需要在不同时间点t1和t2取值进行比较运算,当两个时间点的间隔较短时,就可以把这个计算结果看作是CPU的即时利用率。
 +
 +CPU的即时利用率的计算公式:
 +
 +CPU在t1到t2时间段总的使用时间 = ( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)
 +
 +CPU在t1到t2时间段空闲使用时间 = (idle2 - idle1)
 +
 +CPU在t1到t2时间段即时利用率 =  1 - CPU空闲使用时间 / CPU总的使用时间
 +
 + 
 +
 + 
 +
 +这些值是谁,什么时候记录的呢?
 +
 +每次timer的中断就会记录一次,记录在struct cpu_usage_stat 里,实现在timer_tick ->​update_process_times里。
 +那么它的精度就是HZ,​如果HZ是100,就意味着每S记录100次。
 +</​code>​
note/spoony/用-proc-stat计算cpu的占用率.txt · 最后更改: 2017/08/29 13:42 由 Spoony