我希望分析系统中所有核心占用的百分比,并在大约100毫秒的间隔后将结果保存到文件中。例如,如果我有8个核心,我想知道每个核心有多忙。对我来说很好,如果分析器给出一个聚合,比如620%,或者只是给我每个单独处理器的百分比,比如core1的89%,核心2的82%等等。哪个分析器能够在Linux上提供这样的统计数据。如何?
答案 0 :(得分:1)
您可以读取文件/ proc / stat并选择“cpu0”,“cpu1”,...行以进行进一步分析。有关各列的说明,请参阅http://www.linuxhowtos.org/System/procstat.htm。
您需要读取两次读数才能在一段时间间隔内获得利用率。这些值是自系统启动以来的总量,而不是瞬时利用率。
答案 1 :(得分:1)
这是从/proc/stat
读取值的一个示例。它将在程序的开头和结尾检索CPU统计信息,并测量消耗的利用率。
#include <stdio.h>
typedef struct {
unsigned long long user;
unsigned long long nice;
unsigned long long sys;
unsigned long long idle;
} cpu_stats;
int read_cpu_stats( cpu_stats *stats ) {
unsigned int cpu;
cpu_stats stat;
char line[1024];
FILE *f = popen( "cat /proc/stat | grep cpu[0-9]", "r" );
if( f == NULL )
return 1;
do {
if( fgets( line, sizeof(line), f ) == NULL )
break;
sscanf( line + 3, "%u %llu %llu %llu %llu\n", &cpu, &stat.user, &stat.nice, &stat.sys, &stat.idle );
stats[cpu] = stat;
} while( !feof(f) && !ferror(f) );
pclose(f);
return 0;
}
float get_util( cpu_stats stat1, cpu_stats stat2 ) {
unsigned long long util1 = stat1.user + stat1.nice + stat1.sys;
unsigned long long util2 = stat2.user + stat2.nice + stat2.sys;
return (float)(util2 - util1) / ( (util2 + stat2.idle) - (util1 + stat1.idle) );
}
/* assuming at most 4 cpus in the system */
#define N_CPUS 4
int main() {
unsigned int i;
cpu_stats stats1[N_CPUS];
cpu_stats stats2[N_CPUS];
read_cpu_stats( stats1 );
/* do something */
usleep( 5000 * 1000 );
read_cpu_stats( stats2 );
for( i = 0; i < N_CPUS; i++ )
printf( "cpu %u: %f\n", i, get_util( stats1[i], stats2[i] ) );
return 0;
}
这将基本上收集两次调用read_cpu_stats
之间所花费的空闲和忙碌周期数,并计算繁忙周期与每个CPU的总周期数之间的比率。
如果要连续测量利用率,可以将其简单地包装成循环。