免费注册 查看新帖 |

Chinaunix

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

Linux下的CPU利用率统计无效? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-24 15:36 |只看该作者 |倒序浏览
前段时间调试一个程序的性能,发现当系统的负载增加到某一个临界值的时候,系统的CPU利用率会急剧上升,而在这个邻接点往下,系统的CPU利用率都是出奇的轻,百思不得其解。
开始以为是某个东西具有非线性的负载CPU利用率,一路从软件到硬件排查了一遍后,逐个都洗清了嫌疑。后来,一个数据让我有点儿豁然开朗的感觉,那就是n个核心就有n倍单核心的throughput,这个数据显示系统的scalability还是相当不错的。联系到程序的一些实现方式,并研读了Linux内核统计CPU利用率的代码后,我的猜测得到了印证:Linux下的CPU利用率统计对我们这个系统实现来说,不准确。
不太相信,我是第一个碰到这个问题的人,随即google了一番,原来内核代码中的一个文档
Documentation/cpu-load.txt
早在2007年就发现并记下了这个问题。鉴于那篇文章比较清楚的描述了这种误差出现的原因,我这里就不再赘述了。
那么都什么情况会导致Linux统计的CPU利用率和实际情况偏差很大呢?
所有依赖于Linux的滴答定时器(tick timer)唤醒的任务,如内核里面的动态定时器(dynamic timer),用户空间定时执行的任务等。
现今的内核截至到2.6.29都没有针对这个问题进行修正,我想以后也不太可能会为了这一类负载而大动干戈,那么我们如何回避这个问题呢?
  • 去除对tick timer的依赖,如果可以的话。
  • 测试采用benchmark的形式,即在cpu全负荷情况下测试其他数据,间接反应程序效率。
如果以上提到的两种方法都不适合,可以尝试改变CPU利用率的计算方法。Linux现在有目录/sys/devices/system/cpu/cpuidle和/sys/devices/system/cpu/cpu[0..]/cpuidle/state[0..]/,里面的time分别对应着系统处于某个idle state的时间,将其累加再除以系统的uptime,再用1减去,就得到CPU利用率,当然,这个时候你别指望能得到system time等其他信息了,不过,毕竟寥胜于无!
参考文档:

  • Documentation/cpuidle
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5251/showart_1877933.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

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

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP