Merge pull request #2806 from rorysexton/dev_turbostat_plugin
authorPavel Rochnyak <pavel2000@ngs.ru>
Sat, 20 Oct 2018 11:17:11 +0000 (18:17 +0700)
committerGitHub <noreply@github.com>
Sat, 20 Oct 2018 11:17:11 +0000 (18:17 +0700)
turbostat plugin: New metrics: P-states,Turboboost,Platform TDP,Uncore bus ratio

1  2 
src/turbostat.c
src/types.db

diff --combined src/turbostat.c
@@@ -129,14 -129,21 +129,21 @@@ static bool apply_config_ptm
   */
  static unsigned int tcc_activation_temp;
  
+ static unsigned int do_power_fields;
+ #define UFS_PLATFORM (1 << 0)
+ #define TURBO_PLATFORM (1 << 1)
+ #define PSTATES_PLATFORM (1 << 2)
  static unsigned int do_rapl;
  static unsigned int config_rapl;
  static bool apply_config_rapl;
  static double rapl_energy_units;
+ static double rapl_power_units;
  
  #define RAPL_PKG (1 << 0)
  /* 0x610 MSR_PKG_POWER_LIMIT */
  /* 0x611 MSR_PKG_ENERGY_STATUS */
+ /* 0x614 MSR_PKG_POWER_INFO */
  #define RAPL_DRAM (1 << 1)
  /* 0x618 MSR_DRAM_POWER_LIMIT */
  /* 0x619 MSR_DRAM_ENERGY_STATUS */
@@@ -188,6 -195,10 +195,10 @@@ static struct pkg_data 
    uint32_t energy_dram;  /* MSR_DRAM_ENERGY_STATUS */
    uint32_t energy_cores; /* MSR_PP0_ENERGY_STATUS */
    uint32_t energy_gfx;   /* MSR_PP1_ENERGY_STATUS */
+   uint32_t tdp;
+   uint8_t turbo_enabled;
+   uint8_t pstates_enabled;
+   uint32_t uncore;
    unsigned int tcc_activation_temp;
    unsigned int pkg_temp_c;
  } * package_delta, *package_even, *package_odd;
@@@ -395,6 -406,8 +406,8 @@@ get_counters(struct thread_data *t, str
    if (do_rapl & RAPL_PKG) {
      READ_MSR(MSR_PKG_ENERGY_STATUS, &msr);
      p->energy_pkg = msr & 0xFFFFFFFF;
+     READ_MSR(MSR_PKG_POWER_INFO, &msr);
+     p->tdp = msr & 0x7FFF;
    }
    if (do_rapl & RAPL_CORES) {
      READ_MSR(MSR_PP0_ENERGY_STATUS, &msr);
      READ_MSR(MSR_IA32_PACKAGE_THERM_STATUS, &msr);
      p->pkg_temp_c = p->tcc_activation_temp - ((msr >> 16) & 0x7F);
    }
+   if (do_power_fields & TURBO_PLATFORM) {
+     READ_MSR(MSR_IA32_MISC_ENABLE, &msr);
+     p->turbo_enabled = !((msr >> 38) & 0x1);
+   }
+   if (do_power_fields & PSTATES_PLATFORM) {
+     READ_MSR(MSR_IA32_MISC_ENABLE, &msr);
+     p->pstates_enabled = (msr >> 16) & 0x1;
+   }
+   if (do_power_fields & UFS_PLATFORM) {
+     READ_MSR(MSR_UNCORE_FREQ_SCALING, &msr);
+     p->uncore = msr & 0x1F;
+   }
  
  out:
    close(msr_fd);
@@@ -442,6 -467,11 +467,11 @@@ static inline void delta_package(struc
    delta->energy_cores = new->energy_cores - old->energy_cores;
    delta->energy_gfx = new->energy_gfx - old->energy_gfx;
    delta->energy_dram = new->energy_dram - old->energy_dram;
+   delta->tdp = new->tdp;
+   delta->turbo_enabled = new->turbo_enabled;
+   delta->pstates_enabled = new->pstates_enabled;
+   delta->tcc_activation_temp = new->tcc_activation_temp;
+   delta->uncore = new->uncore;
  }
  
  /*
@@@ -627,9 -657,11 +657,11 @@@ static int submit_counters(struct threa
      turbostat_submit(name, "percent", "pc10", 100.0 * p->pc10 / t->tsc);
  
    if (do_rapl) {
-     if (do_rapl & RAPL_PKG)
+     if (do_rapl & RAPL_PKG) {
        turbostat_submit(name, "power", "pkg",
                         p->energy_pkg * rapl_energy_units / interval_float);
+       turbostat_submit(name, "tdp", "pkg", p->tdp * rapl_power_units);
+     }
      if (do_rapl & RAPL_CORES)
        turbostat_submit(name, "power", "cores",
                         p->energy_cores * rapl_energy_units / interval_float);
        turbostat_submit(name, "power", "DRAM",
                         p->energy_dram * rapl_energy_units / interval_float);
    }
+   if (do_power_fields & TURBO_PLATFORM) {
+     turbostat_submit(name, "turbo_enabled", NULL, p->turbo_enabled);
+   }
+   if (do_power_fields & PSTATES_PLATFORM) {
+     turbostat_submit(name, "pstates_enabled", NULL, p->pstates_enabled);
+   }
+   if (do_power_fields & UFS_PLATFORM) {
+     turbostat_submit(name, "uncore_ratio", NULL, p->uncore);
+   }
+   turbostat_submit(name, "temperature", "tcc_activation",
+                    p->tcc_activation_temp);
  done:
    return 0;
  }
@@@ -985,10 -1029,12 +1029,12 @@@ static int __attribute__((warn_unused_r
      case 0x4F: /* BDX */
      case 0x56: /* BDX-DE */
        do_rapl = RAPL_PKG | RAPL_DRAM;
+       do_power_fields = TURBO_PLATFORM | UFS_PLATFORM | PSTATES_PLATFORM;
        break;
      case 0x2D: /* SNB Xeon */
      case 0x3E: /* IVB Xeon */
        do_rapl = RAPL_PKG | RAPL_CORES | RAPL_DRAM;
+       do_power_fields = TURBO_PLATFORM | PSTATES_PLATFORM;
        break;
      case 0x37: /* BYT */
      case 0x4D: /* AVN */
      if (get_msr(0, MSR_RAPL_POWER_UNIT, &msr))
        return 0;
  
+     rapl_power_units = 1.0 / (1 << (msr & 0xF));
      if (model == 0x37)
        rapl_energy_units = 1.0 * (1 << (msr >> 8 & 0x1F)) / 1000000;
      else
@@@ -1429,7 -1476,7 +1476,7 @@@ static int turbostat_read(void) 
    /* Saving the scheduling affinity, as it will be modified by get_counters */
    if (sched_getaffinity(0, cpu_saved_affinity_setsize,
                          cpu_saved_affinity_set) != 0) {
 -    ERROR("turbostat plugin: Unable to save the CPU affinity");
 +    ERROR("turbostat plugin: Unable to save the CPU affinity: %s", STRERRNO);
      return -1;
    }
  
diff --combined src/types.db
@@@ -31,7 -31,6 +31,7 @@@ clock_state             value:GAUGE:0:
  clock_stratum           value:GAUGE:0:U
  compression             uncompressed:DERIVE:0:U, compressed:DERIVE:0:U
  compression_ratio       value:GAUGE:0:2
 +commands                value:DERIVE:0:U
  connections             value:DERIVE:0:U
  conntrack               value:GAUGE:0:4294967295
  contextswitch           value:DERIVE:0:U
@@@ -209,10 -208,10 +209,11 @@@ ps_rss                  value:GAUGE:0:9
  ps_stacksize            value:GAUGE:0:9223372036854775807
  ps_state                value:GAUGE:0:65535
  ps_vm                   value:GAUGE:0:9223372036854775807
+ pstates_enabled         value:GAUGE:0:1
  pubsub                  value:GAUGE:0:U
  queue_length            value:GAUGE:0:U
  records                 value:GAUGE:0:U
 +redis_command_cputime   value:DERIVE:0:U
  requests                value:GAUGE:0:U
  response_code           value:GAUGE:0:U
  response_time           value:GAUGE:0:U
@@@ -239,6 -238,7 +240,7 @@@ spl                     value:GAUGE:U:
  swap                    value:GAUGE:0:1099511627776
  swap_io                 value:DERIVE:0:U
  tcp_connections         value:GAUGE:0:4294967295
+ tdp                     value:GAUGE:U:U
  temperature             value:GAUGE:U:U
  threads                 value:GAUGE:0:U
  time_dispersion         value:GAUGE:-1000000:1000000
@@@ -257,7 -257,9 +259,9 @@@ total_sessions          value:DERIVE:0:
  total_threads           value:DERIVE:0:U
  total_time_in_ms        value:DERIVE:0:U
  total_values            value:DERIVE:0:U
+ turbo_enabled           value:GAUGE:0:1
  uptime                  value:GAUGE:0:4294967295
+ uncore_ratio            value:GAUGE:0:U
  users                   value:GAUGE:0:65535
  vcl                     value:GAUGE:0:65535
  vcpu                    value:GAUGE:0:U