如何分析多核处理器的所有内核?

时间:2015-03-23 08:29:24

标签: c linux multithreading multiprocessing profiler

我希望分析系统中所有核心占用的百分比,并在大约100毫秒的间隔后将结果保存到文件中。例如,如果我有8个核心,我想知道每个核心有多忙。对我来说很好,如果分析器给出一个聚合,比如620%,或者只是给我每个单独处理器的百分比,比如core1的89%,核心2的82%等等。哪个分析器能够在Linux上提供这样的统计数据。如何?

2 个答案:

答案 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的总周期数之间的比率。

如果要连续测量利用率,可以将其简单地包装成循环。