免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2755 | 回复: 8
打印 上一主题 下一主题

一个监控Linux系统CPU的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-25 19:03 |只看该作者 |倒序浏览
做一个监控系统CPU利用率的程序,使用如下得到

  1. system("top -n1 | grep -i^'cpu' | awk '{print $2 $4}' | awk -F\"%\" '{print $1+$2}'>tmp");
  2. read(tmp)
复制代码

但是发现每一次top第一次得到的CPU占用率都不准确,比如我事先利用一个while(1)来消耗CPU,然后利用top命令查看的时候第一次显示的CPU占用率总是3.9,从第二次开始才是90%多,请大家指点一二,谢谢了!

论坛徽章:
0
2 [报告]
发表于 2006-04-25 21:00 |只看该作者
原帖由 afeijunjun 于 2006-4-25 19:03 发表
做一个监控系统CPU利用率的程序,使用如下得到
[code]
但是发现每一次top第一次得到的CPU占用率都不准确


每次看cpu占用率都不一样才是正常的吧

论坛徽章:
0
3 [报告]
发表于 2006-04-25 21:22 |只看该作者
呵呵~~确实是每一次不一样才应该正确,就是因为这个原因我才怀疑top第一次显示的问题,不管CPU占用多少,我使用top命令察看第一次显示的每次都是1.3%us,2.6%sy,第二次一下子就变为了90%多,如果出现一次这很正常,但是我每次top的结果第一次显示都是1.3%us,2.6%sy,所以我怀疑top第一次显示的问题,也可能是我机器的问题,我找了另外一台机器试验了一下每次第一次也是一样的都是0.1%us,0.1%sy。我又做了一个试验,打开三个终端:
1:运行test,代码如下:

  1. int main()
  2. {
  3.         while(1);
  4. }
复制代码

2:执行top命令查看结果如下:

  1. [root@localhost root]# top -n5 | grep -i ^cpu
  2. Cpu(s):  0.1% us,  0.1% sy,  0.0% ni, 99.8% id,  0.0% wa,  0.0% hi,  0.0% si
  3. Cpu(s): 100.0% us,  0.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
  4. Cpu(s): 99.7% us,  0.3% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
  5. Cpu(s): 100.0% us,  0.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
  6. Cpu(s): 100.0% us,  0.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
复制代码

3:等2开始之后运行top -n1,结果如下

  1. [root@localhost root]# top -n1 | grep -i ^cpu
  2. Cpu(s):  0.1% us,  0.1% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
复制代码

由上面的试验可以看出每次top的第一次显示并不可信,不知道我的理解正不正确,请指点一二,谢谢~!

论坛徽章:
0
4 [报告]
发表于 2006-04-25 22:10 |只看该作者
搂住获取的结果可能是正常的
用top看cpu应该是第一次很小 紧接着第二次很大
第二次很大是因为top命令的执行导致的

论坛徽章:
0
5 [报告]
发表于 2006-04-26 09:29 |只看该作者
应该不是top命令导致的cpu占用率上升,因为我在一个终端上运行top,另一个终端上利用top查看cpu的占用也只有0.1左右,所以应该不是top命令所至。

论坛徽章:
0
6 [报告]
发表于 2006-04-26 10:04 |只看该作者
cpu利用率并不像time一样返回一个可判定的值,而是两个单位时间内进程消耗时间片总合的差;
也就是说在你统计cup的开始,虽然cup利用率已经100了,但统计程序刚刚开始,他只能获取当前进程的时间片使用量,并不知道到下一个计量点时进程的时间片使用量(因为还没发生),所以根本无从计算,其实你所说的开始总是一个很小的值,那也是初始值,没什么意义

[ 本帖最后由 isnowran 于 2006-4-26 10:07 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-04-26 11:00 |只看该作者
谢谢了~~知道了哈~~:)
用了一个别的方法得到:
top -n2 -d 0.1 | grep -i ^cpu | sed -n '2p'

论坛徽章:
0
8 [报告]
发表于 2006-04-26 15:43 |只看该作者
再问各位一个问题,我用

  1. top -n2 -d 0.1 | grep -i ^cpu | sed -n '2p'
复制代码

确实可以实现CPU占用率的真实值,但是这样得出的值也不能反映系统真实CPU占用率,因为当执行上面的脚本命令的时候CPU占用率会骤增,所以每次得出来的占用率都是百分之八九十,但是如果不运行上面的脚本系统CPU占用率也只有百分之几,请问各位有没有别的方法得到系统的CPU占用率~谢谢了~~:)

论坛徽章:
0
9 [报告]
发表于 2006-04-26 15:53 |只看该作者
自己写一个,大概步骤如下:
0。利用系统函数得出自己的系统ticks
1。遍历/prog 下每个进程的当前cpu占用时间片值总合x
2。等待n秒
3。重复第一步骤,得出y
4。cpu占用率 = ( y - x - ticks ) / n

注意事项:
1。算法要优秀,否则占用资源的都是统计程序,失去了它存在的意义
2。间隔时间越长越精确,但别小于1秒,因为ticks的最小单位是1秒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP