X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcpu.c;h=461a6e1bca64e653be62122cfb7c459b5a54228e;hb=496ca2b758344bc6372ab0adf98ad8050f69b25a;hp=3dbe80eeb1b7f4727b491803e93e841cac09200a;hpb=83077c18c3e78739c2d2d18debf99875944eaa72;p=collectd.git diff --git a/src/cpu.c b/src/cpu.c index 3dbe80ee..461a6e1b 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -1,6 +1,6 @@ /** * collectd - src/cpu.c - * Copyright (C) 2005-2009 Florian octo Forster + * Copyright (C) 2005-2010 Florian octo Forster * Copyright (C) 2008 Oleg King * Copyright (C) 2009 Simon Kuhnle * Copyright (C) 2009 Manuel Sanmartin @@ -104,12 +104,6 @@ static mach_port_t port_host; static processor_port_array_t cpu_list; static mach_msg_type_number_t cpu_list_len; - -#if PROCESSOR_TEMPERATURE -static int cpu_temp_retry_counter = 0; -static int cpu_temp_retry_step = 1; -static int cpu_temp_retry_max = 1; -#endif /* PROCESSOR_TEMPERATURE */ /* #endif PROCESSOR_CPU_LOAD_INFO */ #elif defined(KERNEL_LINUX) @@ -147,23 +141,31 @@ static int pnumcpu; static int init (void) { -#if PROCESSOR_CPU_LOAD_INFO || PROCESSOR_TEMPERATURE +#if PROCESSOR_CPU_LOAD_INFO kern_return_t status; port_host = mach_host_self (); - /* FIXME: Free `cpu_list' if it's not NULL */ - if ((status = host_processors (port_host, &cpu_list, &cpu_list_len)) != KERN_SUCCESS) + status = host_processors (port_host, &cpu_list, &cpu_list_len); + if (status == KERN_INVALID_ARGUMENT) { - ERROR ("cpu plugin: host_processors returned %i", (int) status); + ERROR ("cpu plugin: Don't have a privileged host control port. " + "The most common cause for this problem is " + "that collectd is running without root " + "privileges, which are required to read CPU " + "load information. " + ""); + cpu_list_len = 0; + return (-1); + } + if (status != KERN_SUCCESS) + { + ERROR ("cpu plugin: host_processors() failed with status %d.", (int) status); cpu_list_len = 0; return (-1); } - DEBUG ("host_processors returned %i %s", (int) cpu_list_len, cpu_list_len == 1 ? "processor" : "processors"); INFO ("cpu plugin: Found %i processor%s.", (int) cpu_list_len, cpu_list_len == 1 ? "" : "s"); - - cpu_temp_retry_max = 86400 / CDTIME_T_TO_TIME_T (interval_g); /* #endif PROCESSOR_CPU_LOAD_INFO */ #elif defined(HAVE_LIBKSTAT) @@ -241,12 +243,12 @@ static int init (void) return (0); } /* int init */ -static void submit (int cpu_num, const char *type_instance, counter_t value) +static void submit (int cpu_num, const char *type_instance, derive_t value) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].counter = value; + values[0].derive = value; vl.values = values; vl.values_len = 1; @@ -262,98 +264,47 @@ static void submit (int cpu_num, const char *type_instance, counter_t value) static int cpu_read (void) { -#if PROCESSOR_CPU_LOAD_INFO || PROCESSOR_TEMPERATURE +#if PROCESSOR_CPU_LOAD_INFO int cpu; kern_return_t status; - -#if PROCESSOR_CPU_LOAD_INFO + processor_cpu_load_info_data_t cpu_info; mach_msg_type_number_t cpu_info_len; -#endif -#if PROCESSOR_TEMPERATURE - processor_info_data_t cpu_temp; - mach_msg_type_number_t cpu_temp_len; -#endif host_t cpu_host; for (cpu = 0; cpu < cpu_list_len; cpu++) { -#if PROCESSOR_CPU_LOAD_INFO cpu_host = 0; cpu_info_len = PROCESSOR_BASIC_INFO_COUNT; - if ((status = processor_info (cpu_list[cpu], - PROCESSOR_CPU_LOAD_INFO, &cpu_host, - (processor_info_t) &cpu_info, &cpu_info_len)) != KERN_SUCCESS) - { - ERROR ("cpu plugin: processor_info failed with status %i", (int) status); - continue; - } - - if (cpu_info_len < CPU_STATE_MAX) - { - ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len); - continue; - } - - submit (cpu, "user", (counter_t) cpu_info.cpu_ticks[CPU_STATE_USER]); - submit (cpu, "nice", (counter_t) cpu_info.cpu_ticks[CPU_STATE_NICE]); - submit (cpu, "system", (counter_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]); - submit (cpu, "idle", (counter_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]); -#endif /* PROCESSOR_CPU_LOAD_INFO */ -#if PROCESSOR_TEMPERATURE - /* - * Not all Apple computers do have this ability. To minimize - * the messages sent to the syslog we do an exponential - * stepback if `processor_info' fails. We still try ~once a day - * though.. - */ - if (cpu_temp_retry_counter > 0) - { - cpu_temp_retry_counter--; - continue; - } - - cpu_temp_len = PROCESSOR_INFO_MAX; - - status = processor_info (cpu_list[cpu], - PROCESSOR_TEMPERATURE, - &cpu_host, - cpu_temp, &cpu_temp_len); + status = processor_info (cpu_list[cpu], PROCESSOR_CPU_LOAD_INFO, &cpu_host, + (processor_info_t) &cpu_info, &cpu_info_len); if (status != KERN_SUCCESS) { - ERROR ("cpu plugin: processor_info failed: %s", + ERROR ("cpu plugin: processor_info (PROCESSOR_CPU_LOAD_INFO) failed: %s", mach_error_string (status)); - - cpu_temp_retry_counter = cpu_temp_retry_step; - cpu_temp_retry_step *= 2; - if (cpu_temp_retry_step > cpu_temp_retry_max) - cpu_temp_retry_step = cpu_temp_retry_max; - continue; } - if (cpu_temp_len != 1) + if (cpu_info_len < CPU_STATE_MAX) { - DEBUG ("processor_info (PROCESSOR_TEMPERATURE) returned %i elements..?", - (int) cpu_temp_len); + ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len); continue; } - cpu_temp_retry_counter = 0; - cpu_temp_retry_step = 1; - - DEBUG ("cpu_temp = %i", (int) cpu_temp); -#endif /* PROCESSOR_TEMPERATURE */ + submit (cpu, "user", (derive_t) cpu_info.cpu_ticks[CPU_STATE_USER]); + submit (cpu, "nice", (derive_t) cpu_info.cpu_ticks[CPU_STATE_NICE]); + submit (cpu, "system", (derive_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]); + submit (cpu, "idle", (derive_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]); } /* #endif PROCESSOR_CPU_LOAD_INFO */ #elif defined(KERNEL_LINUX) int cpu; - counter_t user, nice, syst, idle; - counter_t wait, intr, sitr; /* sitr == soft interrupt */ + derive_t user, nice, syst, idle; + derive_t wait, intr, sitr; /* sitr == soft interrupt */ FILE *fh; char buf[1024]; @@ -410,7 +361,7 @@ static int cpu_read (void) #elif defined(HAVE_LIBKSTAT) int cpu; - counter_t user, syst, idle, wait; + derive_t user, syst, idle, wait; static cpu_stat_t cs; if (kc == NULL) @@ -421,10 +372,10 @@ static int cpu_read (void) if (kstat_read (kc, ksp[cpu], &cs) == -1) continue; /* error message? */ - idle = (counter_t) cs.cpu_sysinfo.cpu[CPU_IDLE]; - user = (counter_t) cs.cpu_sysinfo.cpu[CPU_USER]; - syst = (counter_t) cs.cpu_sysinfo.cpu[CPU_KERNEL]; - wait = (counter_t) cs.cpu_sysinfo.cpu[CPU_WAIT]; + idle = (derive_t) cs.cpu_sysinfo.cpu[CPU_IDLE]; + user = (derive_t) cs.cpu_sysinfo.cpu[CPU_USER]; + syst = (derive_t) cs.cpu_sysinfo.cpu[CPU_KERNEL]; + wait = (derive_t) cs.cpu_sysinfo.cpu[CPU_WAIT]; submit (ksp[cpu]->ks_instance, "user", user); submit (ksp[cpu]->ks_instance, "system", syst); @@ -551,12 +502,12 @@ static int cpu_read (void) return (-1); } - submit (0, "idle", (counter_t) cs->idle); - submit (0, "nice", (counter_t) cs->nice); - submit (0, "swap", (counter_t) cs->swap); - submit (0, "system", (counter_t) cs->kernel); - submit (0, "user", (counter_t) cs->user); - submit (0, "wait", (counter_t) cs->iowait); + submit (0, "idle", (derive_t) cs->idle); + submit (0, "nice", (derive_t) cs->nice); + submit (0, "swap", (derive_t) cs->swap); + submit (0, "system", (derive_t) cs->kernel); + submit (0, "user", (derive_t) cs->user); + submit (0, "wait", (derive_t) cs->iowait); /* #endif HAVE_LIBSTATGRAB */ #elif defined(HAVE_PERFSTAT) @@ -571,10 +522,10 @@ static int cpu_read (void) sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } - - if (pnumcpu != numcpu || perfcpu == NULL) + + if (pnumcpu != numcpu || perfcpu == NULL) { - if (perfcpu != NULL) + if (perfcpu != NULL) free(perfcpu); perfcpu = malloc(numcpu * sizeof(perfstat_cpu_t)); } @@ -589,12 +540,12 @@ static int cpu_read (void) return (-1); } - for (i = 0; i < cpus; i++) + for (i = 0; i < cpus; i++) { - submit (i, "idle", (counter_t) perfcpu[i].idle); - submit (i, "system", (counter_t) perfcpu[i].sys); - submit (i, "user", (counter_t) perfcpu[i].user); - submit (i, "wait", (counter_t) perfcpu[i].wait); + submit (i, "idle", (derive_t) perfcpu[i].idle); + submit (i, "system", (derive_t) perfcpu[i].sys); + submit (i, "user", (derive_t) perfcpu[i].user); + submit (i, "wait", (derive_t) perfcpu[i].wait); } #endif /* HAVE_PERFSTAT */