16

是否有命令或任何其他方式来获取 Linux 中的当前或平均CPU 利用率(对于多处理器环境)?

我在一个小型系统中使用嵌入式 Linux。基本上,我需要确定 CPU 利用率,如果它很高,我可以将新进程转移到系统中的另一个控制器,而不是在可能忙于执行更重要进程的主处理器上执行。

这个问题不仅仅是优先处理进程,另一个控制器可以充分处理新进程,只是当主处理器不忙时,我希望它来执行。

4

5 回答 5

27

经过大量搜索和修补后的问题答案:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    long double a[4], b[4], loadavg;
    FILE *fp;
    char dump[50];

    for(;;)
    {
        fp = fopen("/proc/stat","r");
        fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]);
        fclose(fp);
        sleep(1);

        fp = fopen("/proc/stat","r");
        fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]);
        fclose(fp);

        loadavg = ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
        printf("The current CPU utilization is : %Lf\n",loadavg);
    }

    return(0);
}

我得到的值与系统监视器报告的值相同。

于 2010-09-23T17:16:37.443 回答
11
cat /proc/stat

你会看到这样的东西

cpu  178877 11039 58012 5027374 22025 2616 1298 0 0
cpu0 122532 8808 34213 2438147 10881 1050 448 0 0
cpu1 56344 2230 23799 2589227 11143 1565 850 0 0

只需将前三个数字的总和除以前四个整数的总和即可

前 4 个数字是用户、nice、系统和空闲时间

注意:这给出了总体平均值。如果要取自发平均,则应取两个样本并在除法之前将它们彼此相减。

于 2010-09-22T15:09:35.473 回答
10

您需要对值/proc/stat进行两次采样,并计算该时间的平均利用率。(瞬时利用率并没有多大意义——它在单核机器上总是 100%,因为你的利用率测量代码在任何时候都在运行)。

于 2010-09-22T13:41:28.597 回答
3

/proc 文件系统有各种有趣的信息。查看man proc更多信息。

于 2010-09-22T13:02:52.637 回答
1

如果可用,只需使用顶部。您可以在非交互模式下使用它:

top -n 1

如果你想要一些特定的东西,那么只需 grep 那个输出。确切的细节将取决于您的 top 命令如何格式化其输出,但例如:

top -n 1 | grep 'Load'
于 2010-09-22T13:04:35.477 回答