日期:2014-05-16 浏览次数:20759 次
编者注: 本来想写个简单的程序测试CPU利用率,后来代码实现后与top(ps)命令测试的结果做对比,疑惑了,疑惑后有了此文……
本来就是想通过写个小程序测试CPU利用率从而可以检验其他的工具性能之类的数据,后来参照IPbench中的cpu_target_lukem插件实现我们的功能,简单描述下原理:我们运行一个优先级很低的进程,它占有了CPU的闲暇时间,我们用CPU某段循环内闲暇时间除以该时段总时间则可得到CPU利用率。主要功能实现代码如下:
x0 = get_cycles(); //last cycle count values while (calc) { x1 = x0; //last cycle count values gives to x1 x0 = get_cycles(); //the current count values delta = x0 - x1; // ?t total += delta; //adds ?t to a running total /* If the delta looks like less than a context switch,add this to idle time; otherwise add it to busy time */ if (delta < PROFILE_CONTEXT_COST) idle += delta; timer_buffer.idle = idle; timer_buffer.total = total; }
之后我们编译运行本程序,程序输出为:
[11:43.32] dbg: Average CPU time is 5.2
[11:43.34] dbg: Average CPU time is 5.2
这时候我们使用 " ps -au "命令,会找到这一条信息:
long 11741
95.7 0.0 19668 520 pts/16 SNl+ 11:40 2:58 ./a.out
熟悉ps命令的童鞋们知道,long为该进程所属用户;11741为该进程的PID号;95.7表示该进程的CPU占用率为95.7%;0.0表示该进程的物理内存占用率为0%;19668表示该进程占用了多少虚拟内存量;