日期:2014-05-16  浏览次数:20759 次

浅谈Linux下CPU利用率和CPU负载及其代码实现原理

编者注: 本来想写个简单的程序测试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;
    }

从而本程序中的CPU利用率 = (1- timer_buffer.idle/timer_buffer.total)*100 %,

之后我们编译运行本程序,程序输出为:

        [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表示该进程占用了多少虚拟内存量;