确定CPU利用率

17

在Linux中,有没有一种命令或其他方式可以获取当前或平均CPU利用率(对于多处理器环境)?

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

这个问题不仅仅是关于进程的优先级,另一个控制器可以足够地处理新进程,只是在主处理器忙碌时,我更愿意它去执行。


你可能想使用任务cpusets来强制Linux调度程序为你完成这项工作;你可以限制任务可以运行的核心。我假设你在使用SMP。 - MarkR
你为什么要重复huseyinalb的答案,然后选择自己?这看起来像是试图操纵声望系统。 - Andrew
我回答自己的问题会获得什么声誉? - user191776
我认为你会因为被接受的答案而获得声望,但即使你没有,你也在否定huseyinalb的机会,这似乎不太公平。 - Andrew
5个回答

28
一番搜索和调试后得出的答案是:
#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);
}

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


不,j0h,这是一个procfs文件。它们不是普通的文件系统。PS:抱歉打扰了,但我必须回答。 - ArsenArsen
为什么使用 long double 而不是 long int? - ocirocir
3
最近有一篇关于从 /proc/stat 收集 CPU 利用率的解释,其中包括一个 Bash 示例。 - Jaime
为什么不直接将文件指针定位到开头,而要重新打开文件? - Marek R
请注意,在使用 sleep() 函数时不要忘记 #include <unistd.h> - red0ct
你需要对所有字段求和(除了guestguest_nice,因为它们已经包含在用户和优先级中,参见https://unix.stackexchange.com/a/303224/20626)。目前,此代码仅对`user`、`nice`、`system`和`idle`进行求和。剩余的字段`irq`、`softirq`和`steal`缺失。它们必须单独处理,因为它们*不*包含在系统中! - scai

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

将前三个数的和除以前四个整数之和即可。

前四个数字是用户、优美、系统和空闲时间。

注意:这给出的是总平均值。如果要进行即时平均值计算,则需要取两个样本并将它们相互减去后再进行除法运算。


这是以百分比还是某个因素来衡量的?我的意思是,这里可能的最大值是100还是1? - user191776

10

你需要在两个时间点采样/proc/stat中的值,并计算该时间段内的平均利用率。(瞬时利用率没有多大意义-在单核机器上它总是100%,因为你的利用率测量代码每次看到它就在运行)。


3

/proc文件系统包含各种有趣的信息。查看man proc以获取更多信息。


1

如果可用,只需使用 top 命令即可。您可以在非交互模式下使用它:

top -n 1

如果您想要某些特定的内容,只需使用grep命令来搜索输出结果。具体细节取决于您的top命令如何格式化其输出,例如:
top -n 1 | grep 'Load'

不正确,那会给你平均负载时间,这与CPU利用率不同(前者从/proc/loadavg提取,而后者从/proc/stat提取)[参见man proc]。 - tsotso
不,那是正确的。我给出的示例获取了负载平均值,但是方法也可以提取CPU利用率。在OSX和Linux上,格式略有不同,但在两个系统上,它都是在负载下面的一行,因此很容易过滤掉。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接