3 #include <sys/resource.h>
7 #include "global_statistics.h"
12 #include "plugin_idlejitter.h"
14 #define CPU_IDLEJITTER_SLEEP_TIME_MS 20
16 void *cpuidlejitter_main(void *ptr)
20 if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
21 error("Cannot set pthread cancel type to DEFERRED.");
23 if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
24 error("Cannot set pthread cancel state to ENABLE.");
26 int sleep_ms = config_get_number("plugin:idlejitter", "loop time in ms", CPU_IDLEJITTER_SLEEP_TIME_MS);
28 config_set_number("plugin:idlejitter", "loop time in ms", CPU_IDLEJITTER_SLEEP_TIME_MS);
29 sleep_ms = CPU_IDLEJITTER_SLEEP_TIME_MS;
32 RRD_STATS *st = rrd_stats_find("system.idlejitter");
34 st = rrd_stats_create("system", "idlejitter", NULL, "cpu", "CPU Idle Jitter", "microseconds lost/s", 9999, update_every, CHART_TYPE_LINE);
35 rrd_stats_dimension_add(st, "jitter", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
38 struct timeval before, after;
39 unsigned long long counter;
40 for(counter = 0; 1 ;counter++) {
41 unsigned long long usec = 0, susec = 0;
43 while(susec < (update_every * 1000000ULL)) {
45 gettimeofday(&before, NULL);
46 usleep(sleep_ms * 1000);
47 gettimeofday(&after, NULL);
49 // calculate the time it took for a full loop
50 usec = usecdiff(&after, &before);
53 usec -= (sleep_ms * 1000);
55 if(counter) rrd_stats_next_usec(st, susec);
56 rrd_stats_dimension_set(st, "jitter", usec);