如何使用“proc”文件系统计算linux中所有正在运行的进程的CPU利用率?

时间:2016-08-17 11:21:52

标签: c linux cpu-usage

Thisthis link我正在尝试计算CPU利用率,但它没有按预期进行。的(即 我的应用程序显示CPU利用率为3%,top显示为99%。)

我正在尝试以下方法,

usage=100*(((utime_ticks_current + cutime_ticks_current + stime_ticks_current + cstime_ticks_current) - (utime_ticks_prev + cutime_ticks_prev + stime_ticks_prev + cstime_ticks_prev)) / (long)(total_cpu_time_current - total_cpu_time_prev))

here, 
utime_ticks = /proc/pid/stat -> 14th value
stime_ticks = /proc/pid/stat -> 15th value
cutime_ticks = /proc/pid/stat -> 16th value
cstime_ticks = /proc/pid/stat -> 17th value

total_cpu_time = /proc/stat -> sum of all 10 values

当前和上一次的时间差是1秒。

另外,我手动检查了所有变量的所有值都是正确的。

请注意我为“stime,cstime”和“utime,cutime”分别尝试了同样的事情

我认为我计算它的方式存在一些问题,

有人可以帮忙吗?

我只找到了解决方案,我只需要将该值乘以可用的核心/ CPU总数。

1 个答案:

答案 0 :(得分:0)

我可以给你一些我用于cpu利用率服务器的代码。这非常准确。

long double a[4], b[4], loadavg;
FILE *fp;
char dump[50] = {0};
memset(dump, 0, 50);

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]));
loadavg=loadavg*100;
sprintf(dump, "%Lf\n",loadavg);
long double used;