Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33830
  • 博文数量: 4
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-17 22:12
文章分类
文章存档

2007年(4)

我的朋友
最近访客

分类: LINUX

2007-07-09 13:56:27

近来看到不少入伍不久的战士们询问Linux下CPU资源用程序怎么获取,于是便冒着被联想起诉的风险发此帖,避免他们制造车轮.
1. 必备的条件:内核具备proc系统

2. 相关的文件: /proc/stat
[root@Eniak root]# cat /proc/stat
cpu  174 0 2974 79656
cpu0 174 0 2974 79656
page 15272 8781
swap 1 0
intr 102369 82804 2 0 0 0 0 3 0 1 0 0 0 0 0 14 2796 771 21 15957 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(1,1,8,0,0)
ctxt 10837
btime 1174871603
processes 1215

3. 官方说明: man proc
       stat   kernel/system statistics.   Varies  with  architecture.   Common
              entries include:

              cpu  3357 0 4313 1362393
                     The  number  of  jiffies  (1/100ths of a second) that the
                     system spent in user mode, user mode  with  low  priority
                     (nice),  system  mode,  and  the idle task, respectively.
                     The last value should be 100 times the  second  entry  in
                     the uptime pseudo-file.

              page 5741 1808
                     The  number  of  pages the system paged in and the number
                     that were paged out (from disk).

              swap 1 0
                     The number of swap pages that have been  brought  in  and
                     out.

              intr 1462898
                     The number of interrupts received from the system boot.

              disk_io: (2,0):(31,30,5764,1,2) (3,0):...
                     (major,minor):(noinfo,       read_io_ops,      blks_read,
                     write_io_ops, blks_written)

              ctxt 115315
                     The number of context switches that the system underwent.

              btime 769041601
                     boot  time, in seconds since the epoch (January 1, 1970).

              processes 86031
                     Number of forks since boot.
                    
从man手册摘录出的内容可以知道,我们关心的数据在stat文件头两行已经标示出来了(单CPU)
cpu  174 0 2974 79656
cpu0 174 0 2974 79656

第一行是总的CPU资源状况,第二行是第一个CPU的资源状况,多CPU的以此类推
计算方法很简单,原理是系统每秒会有一个固定的时间片值,比如100,也就是说,
每秒CPU产生的100个时间片,要么被消耗掉(前三个数值),要么就空闲浪费掉(最后一个数值累加)
如果不考虑系统资源与用户资源差别的话,消耗的时间片等于前三项数值相加,CPU资源利用率
计算方法也就诞生了:
0. 获取当前系统时间片 jiff
1. 记录时间1的CPU时间片用量 j1
2. sleep 3 秒 s
3. 记录时间2的CPU时间片用量 j2

CPU利用率 = ( j2 - j1 ) / s / jiff * 100

光说不练非好汉,我们实际操作一下
[root@Eniak root]# cat /proc/stat; sleep 3; cat /proc/stat
#first
cpu  181 0 7344 308853
cpu0 181 0 7344 308853
page 15272 8997
swap 1 0
intr 381403 316378 2 0 0 0 0 3 0 1 0 0 0 0 0 14 2831 1195 21 60958 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(1,1,8,0,0)
ctxt 13562
btime 1174871604
processes 1217

#second
cpu  181 0 7346 309154
cpu0 181 0 7346 309154
page 15272 9025
swap 1 0
intr 381855 316681 2 0 0 0 0 3 0 1 0 0 0 0 0 14 2833 1198 21 61102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(1,1,8,0,0)
ctxt 13579
btime 1174871604
processes 1219

首先应该肯定的是,第一次的CPU信息4项数值总合会比第二次的数值总合小300(我的jiff是100,休眠了3秒),这一点通过上述数据可以得到验证.

带入公式:
( ( 181 + 0 + 7346 ) - ( 181 + 0 + 7344 ) ) / 3 / 100 * 100 = 0

我这三秒的CPU利用率为0.

 

附: 联想专利页面 (耻者, 没有最无, 只有更无)

 
申    请    号:  02129337.6 申   请   日:  2002.09.02
名          称:  获取Linux操作系统信息的方法
公 开 (公告) 号:  CN1480878 公开(公告)日:  2004.03.10
主  分  类  号:  G06F17/40 分案原申请号:  
分    类    号:  G06F17/40
颁   证     日:   优   先   权:  
申请(专利权)人:  联想(北京)有限公司
地          址:  100085北京市海淀区上地信息产业基地创业路6号
发 明 (设计)人:  周健;李勇;周谧;席振新 国  际 申 请:  
国  际  公  布:   进入国家日期:  
专利 代理 机构:  北京同立钧成知识产权代理有限公司 代   理   人:  李云鹏;刘芳
 
  摘要 
 一种获取Linux操作系统信息的方法,通过Linux操作系统的proc文件系统,读取Linux内核中各模块的信息;对读出的信息进行处理;将处理后的信息输出到指定的接口文件。本发明通过读取和处理Linux操作系统\proc目录下的内核信息文件,获得运行该LINUX操作系统服务器的完整信息,并可独立于不同的Linux发行版本,而仅仅依靠标准的Linux内核就可以实现服务器信息的获取,具有广泛的兼容性。

阅读(1843) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~