X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcpu.c;h=307ae499e2baf2e064379c557bfea0ddd7b90b0b;hb=47fd864adf60f70628e516d933c859229ff70912;hp=80692e76b167315a3cd6220008a489b0035b9425;hpb=79963d13c1884d1d92667cc502ad20758b084a12;p=collectd.git diff --git a/src/cpu.c b/src/cpu.c index 80692e76..307ae499 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -156,6 +156,12 @@ static int maxcpu; /* #endif HAVE_LIBSTATGRAB */ #elif defined(HAVE_PERFSTAT) +#define TOTAL_IDLE 0 +#define TOTAL_USER 1 +#define TOTAL_SYS 2 +#define TOTAL_WAIT 3 +#define TOTAL_STAT_NUM 4 +static value_to_rate_state_t total_conv[TOTAL_STAT_NUM]; static perfstat_cpu_t *perfcpu; static int numcpu; static int pnumcpu; @@ -203,9 +209,9 @@ static int cpu_config(char const *key, char const *value) /* {{{ */ else if (strcasecmp(key, "ReportNumCpu") == 0) report_num_cpu = IS_TRUE(value) ? 1 : 0; else - return (-1); + return -1; - return (0); + return 0; } /* }}} int cpu_config */ static int init(void) { @@ -223,12 +229,12 @@ static int init(void) { "load information. " ""); cpu_list_len = 0; - return (-1); + return -1; } if (status != KERN_SUCCESS) { ERROR("cpu plugin: host_processors() failed with status %d.", (int)status); cpu_list_len = 0; - return (-1); + return -1; } INFO("cpu plugin: Found %i processor%s.", (int)cpu_list_len, @@ -241,7 +247,7 @@ static int init(void) { numcpu = 0; if (kc == NULL) - return (-1); + return -1; /* Solaris doesn't count linear.. *sigh* */ for (numcpu = 0, ksp_chain = kc->kc_chain; @@ -263,7 +269,7 @@ static int init(void) { if (status == -1) { char errbuf[1024]; WARNING("cpu plugin: sysctl: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } /* #endif CAN_USE_SYSCTL */ @@ -276,7 +282,7 @@ static int init(void) { char errbuf[1024]; WARNING("cpu plugin: sysctlbyname(hw.ncpu): %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } #ifdef HAVE_SYSCTL_KERN_CP_TIMES @@ -286,7 +292,7 @@ static int init(void) { char errbuf[1024]; WARNING("cpu plugin: sysctlbyname(kern.smp.maxcpus): %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } #else if (numcpu != 1) @@ -304,49 +310,39 @@ static int init(void) { /* nothing to initialize */ #endif /* HAVE_PERFSTAT */ - return (0); + return 0; } /* int init */ static void submit_value(int cpu_num, int cpu_state, const char *type, value_t value) { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - memcpy(&values[0], &value, sizeof(value)); - - vl.values = values; + vl.values = &value; vl.values_len = 1; - sstrncpy(vl.host, hostname_g, sizeof(vl.host)); sstrncpy(vl.plugin, "cpu", sizeof(vl.plugin)); sstrncpy(vl.type, type, sizeof(vl.type)); sstrncpy(vl.type_instance, cpu_state_names[cpu_state], sizeof(vl.type_instance)); if (cpu_num >= 0) { - ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%i", cpu_num); + snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%i", cpu_num); } plugin_dispatch_values(&vl); } -static void submit_percent(int cpu_num, int cpu_state, gauge_t percent) { - value_t value; - +static void submit_percent(int cpu_num, int cpu_state, gauge_t value) { /* This function is called for all known CPU states, but each read * method will only report a subset. The remaining states are left as * NAN and we ignore them here. */ - if (isnan(percent)) + if (isnan(value)) return; - value.gauge = percent; - submit_value(cpu_num, cpu_state, "percent", value); + submit_value(cpu_num, cpu_state, "percent", (value_t){.gauge = value}); } -static void submit_derive(int cpu_num, int cpu_state, derive_t derive) { - value_t value; - - value.derive = derive; - submit_value(cpu_num, cpu_state, "cpu", value); +static void submit_derive(int cpu_num, int cpu_state, derive_t value) { + submit_value(cpu_num, cpu_state, "cpu", (value_t){.derive = value}); } /* Takes the zero-index number of a CPU and makes sure that the module-global @@ -366,7 +362,7 @@ static int cpu_states_alloc(size_t cpu_num) /* {{{ */ tmp = realloc(cpu_states, sz * sizeof(*cpu_states)); if (tmp == NULL) { ERROR("cpu plugin: realloc failed."); - return (ENOMEM); + return ENOMEM; } cpu_states = tmp; tmp = cpu_states + cpu_states_num; @@ -381,11 +377,29 @@ static cpu_state_t *get_cpu_state(size_t cpu_num, size_t state) /* {{{ */ size_t index = ((cpu_num * COLLECTD_CPU_STATE_MAX) + state); if (index >= cpu_states_num) - return (NULL); + return NULL; - return (&cpu_states[index]); + return &cpu_states[index]; } /* }}} cpu_state_t *get_cpu_state */ +#if defined(HAVE_PERFSTAT) /* {{{ */ +/* populate global aggregate cpu rate */ +static int total_rate(gauge_t *sum_by_state, size_t state, derive_t d, + value_to_rate_state_t *conv, cdtime_t now) { + gauge_t rate = NAN; + int status = + value_to_rate(&rate, (value_t){.derive = d}, DS_TYPE_DERIVE, now, conv); + if (status != 0) + return status; + + sum_by_state[state] = rate; + + if (state != COLLECTD_CPU_STATE_IDLE) + RATE_ADD(sum_by_state[COLLECTD_CPU_STATE_ACTIVE], sum_by_state[state]); + return 0; +} +#endif /* }}} HAVE_PERFSTAT */ + /* Populates the per-CPU COLLECTD_CPU_STATE_ACTIVE rate and the global * rate_by_state * array. */ @@ -415,6 +429,31 @@ static void aggregate(gauge_t *sum_by_state) /* {{{ */ RATE_ADD(sum_by_state[COLLECTD_CPU_STATE_ACTIVE], this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].rate); } + +#if defined(HAVE_PERFSTAT) /* {{{ */ + cdtime_t now = cdtime(); + perfstat_cpu_total_t cputotal = {0}; + + if (!perfstat_cpu_total(NULL, &cputotal, sizeof(cputotal), 1)) { + char errbuf[1024]; + WARNING("cpu plugin: perfstat_cpu_total: %s", + sstrerror(errno, errbuf, sizeof(errbuf))); + return; + } + + /* Reset COLLECTD_CPU_STATE_ACTIVE */ + sum_by_state[COLLECTD_CPU_STATE_ACTIVE] = NAN; + + /* Physical Processor Utilization */ + total_rate(sum_by_state, COLLECTD_CPU_STATE_IDLE, (derive_t)cputotal.pidle, + &total_conv[TOTAL_IDLE], now); + total_rate(sum_by_state, COLLECTD_CPU_STATE_USER, (derive_t)cputotal.puser, + &total_conv[TOTAL_USER], now); + total_rate(sum_by_state, COLLECTD_CPU_STATE_SYSTEM, (derive_t)cputotal.psys, + &total_conv[TOTAL_SYS], now); + total_rate(sum_by_state, COLLECTD_CPU_STATE_WAIT, (derive_t)cputotal.pwait, + &total_conv[TOTAL_WAIT], now); +#endif /* }}} HAVE_PERFSTAT */ } /* }}} void aggregate */ /* Commits (dispatches) the values for one CPU or the global aggregation. @@ -443,17 +482,13 @@ static void cpu_commit_one(int cpu_num, /* {{{ */ } /* }}} void cpu_commit_one */ /* Commits the number of cores */ -static void cpu_commit_num_cpu(gauge_t num_cpu) /* {{{ */ +static void cpu_commit_num_cpu(gauge_t value) /* {{{ */ { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = num_cpu; - - vl.values = values; + vl.values = &(value_t){.gauge = value}; vl.values_len = 1; - sstrncpy(vl.host, hostname_g, sizeof(vl.host)); sstrncpy(vl.plugin, "cpu", sizeof(vl.plugin)); sstrncpy(vl.type, "count", sizeof(vl.type)); @@ -532,11 +567,11 @@ static int cpu_stage(size_t cpu_num, size_t state, derive_t d, value_t val = {.derive = d}; if (state >= COLLECTD_CPU_STATE_ACTIVE) - return (EINVAL); + return EINVAL; status = cpu_states_alloc(cpu_num); if (status != 0) - return (status); + return status; if (global_cpu_num <= cpu_num) global_cpu_num = cpu_num + 1; @@ -545,11 +580,11 @@ static int cpu_stage(size_t cpu_num, size_t state, derive_t d, status = value_to_rate(&rate, val, DS_TYPE_DERIVE, now, &s->conv); if (status != 0) - return (status); + return status; s->rate = rate; s->has_value = 1; - return (0); + return 0; } /* }}} int cpu_stage */ static int cpu_read(void) { @@ -604,7 +639,7 @@ static int cpu_read(void) { char errbuf[1024]; ERROR("cpu plugin: fopen (/proc/stat) failed: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } while (fgets(buf, 1024, fh) != NULL) { @@ -643,7 +678,7 @@ static int cpu_read(void) { static cpu_stat_t cs; if (kc == NULL) - return (-1); + return -1; for (int cpu = 0; cpu < numcpu; cpu++) { if (kstat_read(kc, ksp[cpu], &cs) == -1) @@ -668,7 +703,7 @@ static int cpu_read(void) { if (numcpu < 1) { ERROR("cpu plugin: Could not determine number of " "installed CPUs using sysctl(3)."); - return (-1); + return -1; } memset(cpuinfo, 0, sizeof(cpuinfo)); @@ -686,7 +721,7 @@ static int cpu_read(void) { char errbuf[1024]; ERROR("cpu plugin: sysctl failed: %s.", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } } } else @@ -703,7 +738,7 @@ static int cpu_read(void) { char errbuf[1024]; ERROR("cpu plugin: sysctl failed: %s.", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } for (int i = 0; i < CPUSTATES; i++) { @@ -733,7 +768,7 @@ static int cpu_read(void) { char errbuf[1024]; ERROR("cpu plugin: sysctlbyname failed: %s.", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } for (int i = 0; i < numcpu; i++) { @@ -756,7 +791,7 @@ static int cpu_read(void) { char errbuf[1024]; ERROR("cpu plugin: sysctlbyname failed: %s.", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } cpu_stage(0, COLLECTD_CPU_STATE_USER, (derive_t)cpuinfo[CP_USER], now); @@ -772,7 +807,7 @@ static int cpu_read(void) { if (cs == NULL) { ERROR("cpu plugin: sg_get_cpu_stats failed."); - return (-1); + return -1; } cpu_state(0, COLLECTD_CPU_STATE_IDLE, (derive_t)cs->idle); @@ -792,7 +827,7 @@ static int cpu_read(void) { char errbuf[1024]; WARNING("cpu plugin: perfstat_cpu: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } if (pnumcpu != numcpu || perfcpu == NULL) { @@ -806,7 +841,7 @@ static int cpu_read(void) { char errbuf[1024]; WARNING("cpu plugin: perfstat_cpu: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } for (int i = 0; i < cpus; i++) { @@ -819,7 +854,7 @@ static int cpu_read(void) { cpu_commit(); cpu_reset(); - return (0); + return 0; } void module_register(void) { @@ -827,5 +862,3 @@ void module_register(void) { plugin_register_config("cpu", cpu_config, config_keys, config_keys_num); plugin_register_read("cpu", cpu_read); } /* void module_register */ - -/* vim: set sw=8 sts=8 noet fdm=marker : */