[Linux Memory] 用/proc/stat计算cpu的占用率

转载自:http://blog.csdn.net/pppjob/article/details/4060336

在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次。这个精度当然是不高的,而且容易出错,下面是在Documentation/cpu-load.txt中的一个例子:
  time line between two timer interrupts
 |--------------------------------------|
 ^                                    ^
 |_ user appA begins working          |
                                      |_ user appA goes to sleep
结果这个A的动作没有被记录下来,这一S有可能被记录到其他的头上。如果你做的程序正好是那个其他,你就会抱怨说,这真是一陀屎呀。
那么有没有高精度的记录呢?
有,但是要自己写,就算你用oprofile之类的,他的原理也是用timer_interrupt记录的,你可以用其他的高精度timer,但是,频繁的中断会把系统弄死。所以要自己写,假设有一个高精度的硬件counter,好像x86下的TimeStamp Counter
在cpu_idle 里记录idle的时间,在asm_do_IRQ里记录处理irq的时间,在context_switch记录进入了那个process,以及时间,在__do_softirq里记录处理softirq的时间,把这些东西记录在一块全局数组里。
时间: 2024-12-16 20:19:56

[Linux Memory] 用/proc/stat计算cpu的占用率的相关文章

【转】android如何查看cpu的占用率和内存泄漏

原文网址:http://www.cnblogs.com/yejiurui/p/3472765.html 在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程度上很重要,经过查询资料,研究了一下,暂时了解到大概有以下几种方式,如果哪位高手有更好的办法,或者文中描述有错误,还望高手在下面留言,非常感谢! 一. 通过eclipse,ADT开发工具的DDMS来查看(Heap) 在“Devices”窗口中选择模拟器中的一个需要查看的程序,从工具条中选“Updat

cpu真实占用率检测工具

 windows任务管理器所看到的CPU占用,一直在不断的变动跳跃 ,并不能反应真实的平均CPU占用率.迅雷下载工具也是一样 ,有时这些知名软件,反倒是没有做的这么人性化,仔细,或 许就是不想让人知道平均下载速度吧.自已设计了一个工具. cpu真实占用率检测工具,布布扣,bubuko.com

cpu真实占用率检測工具

?? windows任务管理器所示CPU占用,一直在不断的变动跳跃 ,并不能反应真实的平均CPU占用率.迅雷下载工具也是一样 ,有时这些知名软件,反倒是没有做的这么人性化,细致.或 许就是不想让人知道平均下载速度吧.自已设计了一个工具.

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据 某一线程Cpu使用率的计算 计算方法 实验数据 多核情况下cpu使用率的计算 实验一 描述 数据一 数据二 实验二 描述 数据一 数据二 主要问题 Java 系统

查看 Linux 下 CPU、内存的占用率的方法集锦

如何查看 Linux 下内存占用率方法一 : 我们可以使用下面命令的组合来达到此目的.在该方法中,我们使用的是 free 和 awk 命令的组合来获取内存占用率. 要获取不包含百分比符号的内存占用率: #free -t | awk 'NR ==2 {print "CurrentMemory Utilization is: "$3/$2*100}' 或 #free -t | awk 'FNR ==2 {print"Current Memory Utilization is: &

TOP CPU占用率原理及与实时线程的冲突

linux下通过top或vmstat查看系统CPU占用率,在大多数情况下测得的CPU占用率是准确的,但在时间精度较高的实时linux系统中,top测量的CPU占用率可能会不准确,下面结合top原理和实时linux实例分析在实时系统中top的使用情况. 统计CPU占用率的时候,大致统计以下几个时间: 用户时间(User time).系统时间(System time).等待时间(Waiting time).空闲时间(Idle time).Nice时间.硬件终端处理时间等 其中主要计算用户时间.系统时

关于vmstat,top,ps aux查看的cpu占用率不一致的问题

问题: 用vmstat,top,和ps aux三个命令查看进程对cpu的占用率,数值差异很大. 例: 用 vmstat 查看系统cpu空闲率, id是cpu的空闲率,可以看出,空闲率一直在73%以上 用 ps aux 统计两个compress进程的cpu占用率,长时间恒定在15.5%和28.9% 用 top统计两个compress进程的cpu占用率,可以看出是一个动态变化的过程 (命令执行结果后面有显示) 这三个命令查出的cpu利用率不统一 首先,ps aux中两个compress进程占用cpu

实战开发经验: 如何降低CPU占用率

在软件开发和性能测试中,CPU占用率是一个很重要的指标,到底有哪些因素会导致CPU占用率上升呢?又有哪些手段可以降低CPU的占用率呢?本文是"Jhuster的专栏"的<实战开发经验 >系列又一篇文章,简单地总结了一下关于CPU占用率的那些事. 1. 如何测试CPU占用率? 首先,我们要学会如何测试程序的CPU占用率,这里简单地给出最基础的方法: Windows上可以通过Ctrl+Alt+Del组合调出"任务管理器",然后查看指定进程的详细信息即可. Li

使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

Linux内核是一名了不起的马戏表演者,它在进程和系统资源间小心地玩着杂耍,并保持系统的能够正常运转. 同时,内核也很公正:它将资源公平地分配给各个进程. 但是,如果你需要给一个重要进程提高优先级时,该怎么做呢? 或者是,如何降低一个进程的优先级? 又或者,如何限制一组进程所使用的资源呢? 答案是需要由用户来为内核指定进程的优先级 大部分进程启动时的优先级是相同的,因此Linux内核会公平地进行调度. 如果想让一个CPU密集型的进程运行在较低优先级,那么你就得事先配置好调度器. 下面介绍3种控制