在Linux中,有没有一种命令或其他方式可以获取当前或平均CPU利用率(对于多处理器环境)?
我正在使用嵌入式Linux系统。基本上,我需要确定CPU的利用率,这样如果它很高,我可以将一个新进程转移到系统中的另一个控制器上,而不是在主处理器上执行,因为主处理器可能正在执行更重要的进程。
这个问题不仅仅是关于进程的优先级,另一个控制器可以足够地处理新进程,只是在主处理器忙碌时,我更愿意它去执行。
在Linux中,有没有一种命令或其他方式可以获取当前或平均CPU利用率(对于多处理器环境)?
我正在使用嵌入式Linux系统。基本上,我需要确定CPU的利用率,这样如果它很高,我可以将一个新进程转移到系统中的另一个控制器上,而不是在主处理器上执行,因为主处理器可能正在执行更重要的进程。
这个问题不仅仅是关于进程的优先级,另一个控制器可以足够地处理新进程,只是在主处理器忙碌时,我更愿意它去执行。
#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);
}
我得到的值与系统监视器报告的值相同。
sleep()
函数时不要忘记 #include <unistd.h>
。 - red0ctguest
和guest_nice
,因为它们已经包含在用户和优先级中,参见https://unix.stackexchange.com/a/303224/20626)。目前,此代码仅对`user`、`nice`、`system`和`idle`进行求和。剩余的字段`irq`、`softirq`和`steal`缺失。它们必须单独处理,因为它们*不*包含在系统中! - scaicat /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
将前三个数的和除以前四个整数之和即可。
前四个数字是用户、优美、系统和空闲时间。
注意:这给出的是总平均值。如果要进行即时平均值计算,则需要取两个样本并将它们相互减去后再进行除法运算。
你需要在两个时间点采样/proc/stat
中的值,并计算该时间段内的平均利用率。(瞬时利用率没有多大意义-在单核机器上它总是100%,因为你的利用率测量代码每次看到它就在运行)。
/proc文件系统包含各种有趣的信息。查看man proc
以获取更多信息。
如果可用,只需使用 top 命令即可。您可以在非交互模式下使用它:
top -n 1
top -n 1 | grep 'Load'