从This和this 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总数。
答案 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;