用C计算CPU系统总使用率

用C计算CPU系统总使用率

我在 StackOverflow 上找到了这个答案,用于计算总 CPU用法:https://stackoverflow.com/questions/1420426/calculate-cpu-usage-of-a-process-in-linux/4497769#4497769

但我如何计算它占总可用 CPU 周期的比例呢?我试图在不必生成另一个进程的情况下做到这一点 - 只需使用系统调用和文件。

我认为这个数字只是total由 提供的信息的属性glibtop_cpu(看起来是这样user + nice + sys + idle,但它实际上会随着时间的推移而变化。

我认为这可能只是因为周期自然会随着时间的推移而变化,但在这种情况下,为什么它会向 报告不同的数字top?如果我在 Firefox 中生成一个新选项卡并加载一个页面,top则显示 Firefox 在几秒钟内使用了一个核心的约 35% - 但以下代码仅显示一致的 7.24%:

#include <stdio.h>
#include <time.h>
#include <glibtop/cpu.h>
#include <unistd.h>

float // Get CPU usge as a decimal percentage.
get_cpu(glibtop_cpu *cpustruct) {
    glibtop_get_cpu(cpustruct);
    return 100 - (float)cpustruct->idle / (float)cpustruct->total * 100;
}

int
main(void) {
    glibtop_cpu cpustruct;
    unsigned int sleepfor = 5000;
    float usage; 
    for(;;usleep(sleepfor)) {
        usage = get_cpu(&cpustruct);
        printf("%.2f\n", usage); 
    }
    exit(0);
}

答案1

更新1

您可以考虑将该time命令合并到您的程序中。来源是这里。主c文件( time.c)只有20kb。

原来的

可能不是您想要的,但“懒惰”的方法是使用time如下命令

time firefox

当 Firefox 关闭时,您会得到以下信息

~$ time firefox 
NOTE: child process received `Goodbye', closing down

real    3m16.070s
user    0m17.329s
sys     0m17.045s

输出“NOTE:”行firefox

时间real是程序运行的时间。

usersys使用的 cpu 时间。

答案2

因为glibtop_get_cpu()返回每个类别中使用的 jiffies 总数自系统启动以来。它还能做什么?它不知道距离你上次调用它已经过去了多久。

但你可以而且应该。您必须测量这些数字从一次呼叫到下一次呼叫的变化。你无法计算当前的(例如,从过去一秒或半秒或其他时间开始)只需一次调用即可使用。

您可以根据您的睡眠时间来计算,但如果您有单独的计时器,它会更准确,特别是在负载情况下。

相关内容