【问题标题】:How can you profile all cores for a multicore processor?您如何分析多核处理器的所有内核?
【发布时间】:2015-05-26 04:27:06
【问题描述】:

我想分析系统中所有内核占用的百分比,并在大约 100 毫秒的间隔后将结果保存在一个文件中。例如,如果我有 8 个核心,我想知道每个核心的繁忙程度。对我来说很好,如果分析器给出一个汇总,比如 620%,或者只是给我每个单独处理器的百分比,比如核心 1 的 89%,核心 2 的 82% 等。哪个分析器能够在 Linux 和怎么样?

【问题讨论】:

  • 但我想以编程方式进行,并在间隔 100 毫秒后将结果保存在文件中。
  • Nitpick:它不是您想要的 profiler,因为 profiler 测量程序功能的执行时间。这是一个系统监控工具。
  • 好的,您实际上并没有提到编程,也没有将结果保存到文件中。您可能需要编辑您的问题以澄清这一点。可能也应该定义“程序化”的含义(例如,shell、C 库等)。 'top' 可能仍然对你有用。它可以在具有设定间隔 (-d) 和设定迭代次数 (-n) 的批处理模式 (-b) 下运行。因此,如果运行 shell 脚本,您可以将批处理模式顶部输出重定向到文件。

标签: c linux multithreading multiprocessing profiler


【解决方案1】:

您可以读取文件 /proc/stat 并获取“cpu0”、“cpu1”等行以进行进一步分析。各栏的解释见http://www.linuxhowtos.org/System/procstat.htm

您确实需要读取两次读数才能获得时间间隔之间的利用率。这些值是自系统启动以来的总量,而不是瞬时利用率。

【讨论】:

    【解决方案2】:

    这是从/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 的总周期数之间的比率。

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

    【讨论】:

    • 如果读取管道出错怎么办?这是正确的!无限循环! (feof 出错时返回零)stackoverflow.com/questions/5431941/…
    • 你想要while(fgets(...) != NULL(或者可能是do...while(!feof(f) &amp;&amp; !ferror(f)),但前者是惯用的。
    • @WilliamPursell 感谢您指出这一点。它只是作为一个关于如何使用 CPU 统计信息的示例,而不是作为最佳实践 c 的参考。因此,代码中还有一些其他地方没有得到应有的处理。
    • 未能编辑失败是一个严重的错误。人们会看到这个例子并用它来延续不良做法。这些错误不是您要解决的问题的核心,这一事实绝不是它们的借口。请修复!
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2014-12-17
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多