我想要分析系统中所有内核占用的百分比,并在大约100毫秒的间隔后将结果保存在文件中。例如,如果我有8个核心,我想知道每个核心有多忙。如果分析器给出一个合计,比如620%,或者只给出每个单独处理器的百分比,比如core1的89%,核心2的82%等等,对我来说没问题。哪个分析器能够给出这样的统计数据,又是如何给出的?
发布于 2015-03-23 18:19:14
您可以读取文件/proc/stat并获取行"cpu0","cpu1",...以作进一步分析。有关各个列的说明,请参阅http://www.linuxhowtos.org/System/procstat.htm。
您确实需要获取两次读数才能获得某个时间间隔之间的利用率。这些值是自系统启动以来的总量,而不是瞬时使用率。
发布于 2015-03-23 18:27:04
这是从/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的总周期数之间的比率。
如果您想连续测量利用率,只需将其封装到一个循环中即可。
https://stackoverflow.com/questions/29205886
复制相似问题