我在 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
是程序运行的时间。
和user
是sys
使用的 cpu 时间。
答案2
因为glibtop_get_cpu()
返回每个类别中使用的 jiffies 总数自系统启动以来。它还能做什么?它不知道距离你上次调用它已经过去了多久。
但你可以而且应该。您必须测量这些数字从一次呼叫到下一次呼叫的变化。你无法计算当前的(例如,从过去一秒或半秒或其他时间开始)只需一次调用即可使用。
您可以根据您的睡眠时间来计算,但如果您有单独的计时器,它会更准确,特别是在负载情况下。