int cpu_times_percent(CpuTimes *ret) { static CpuTimes last_cpu_times; CpuTimes t1 = last_cpu_times; int r = cpu_times(&last_cpu_times); if(r < 0) { log_warn("Couldnt fetch cpu_times"); return -1; } double all_delta = sum_cpu_time(&last_cpu_times) - sum_cpu_time(&t1); ret->user = f_diff_percent(last_cpu_times.user, t1.user, all_delta); ret->system = f_diff_percent(last_cpu_times.system, t1.system, all_delta); ret->idle = f_diff_percent(last_cpu_times.idle, t1.idle, all_delta); ret->nice = f_diff_percent(last_cpu_times.nice, t1.nice, all_delta); ret->iowait = f_diff_percent(last_cpu_times.iowait, t1.iowait, all_delta); ret->irq = f_diff_percent(last_cpu_times.irq, t1.irq, all_delta); ret->softirq = f_diff_percent(last_cpu_times.softirq, t1.softirq, all_delta); ret->steal = f_diff_percent(last_cpu_times.steal, t1.steal, all_delta); ret->guest = f_diff_percent(last_cpu_times.guest, t1.guest, all_delta); ret->guest_nice = f_diff_percent(last_cpu_times.guest_nice, t1.guest_nice, all_delta); return 0; }
static double calc_cpu_busy_diff(CpuTimes *t1, CpuTimes *t2) { double t1_all = sum_cpu_time(t1); double t1_busy = t1_all - t1->idle; double t2_all = sum_cpu_time(t2); double t2_busy = t2_all - t2->idle; if(t2_busy <= t1_busy) return 0.0; double busy_delta = t2_busy - t1_busy; double all_delta = t2_all - t1_all; double busy_perc = (busy_delta / all_delta) * 100; return busy_perc; }
static double calculate_cpu_util_percentage(CpuTimes *t1, CpuTimes *t2) { double t1_all = sum_cpu_time(t1); double t2_all = sum_cpu_time(t2); double t1_busy = t1_all - t1->idle; double t2_busy = t2_all - t2->idle; double busy_delta, all_delta, busy_percentage; /* This exists in psutils. We'll put it in if we actually find it */ /* if (t2_busy < t1_busy) */ /* return 0.0; /\* Indicates a precision problem *\/ */ busy_delta = t2_busy - t1_busy; all_delta = t2_all - t1_all; busy_percentage = (busy_delta / all_delta) * 100; return busy_percentage; }
int cpu_times_percent_per_cpu(CpuTimes **ret) { static int last_cpu_count; static CpuTimes* last_cpu_times; CpuTimes *t1 = last_cpu_times; int cpus = cpu_times_per_cpu(&last_cpu_times); check(cpus > 0, "Couldn't find a cpu"); if(t1 == NULL) { t1 = calloc(cpus, sizeof(CpuTimes)); last_cpu_count = cpus; } *ret = calloc(cpus, sizeof(CpuTimes)); check_mem(*ret); int min_cpus = min(cpus, last_cpu_count); int i; for(i=0;i < min_cpus; i++) { //(*ret)[i] = calc_cpu_busy_diff(t1+i, last_cpu_times+i); double all_delta = sum_cpu_time(last_cpu_times+i) - sum_cpu_time(t1+i); (*ret+i)->user = f_diff_percent((last_cpu_times+i)->user, (t1+i)->user, all_delta); (*ret+i)->system = f_diff_percent((last_cpu_times+i)->system, (t1+i)->system, all_delta); (*ret+i)->idle = f_diff_percent((last_cpu_times+i)->idle, (t1+i)->idle, all_delta); (*ret+i)->nice = f_diff_percent((last_cpu_times+i)->nice, (t1+i)->nice, all_delta); (*ret+i)->iowait = f_diff_percent((last_cpu_times+i)->iowait, (t1+i)->iowait, all_delta); (*ret+i)->irq = f_diff_percent((last_cpu_times+i)->irq, (t1+i)->irq, all_delta); (*ret+i)->softirq = f_diff_percent((last_cpu_times+i)->softirq, (t1+i)->softirq, all_delta); (*ret+i)->steal = f_diff_percent((last_cpu_times+i)->steal, (t1+i)->steal, all_delta); (*ret+i)->guest = f_diff_percent((last_cpu_times+i)->guest, (t1+i)->guest, all_delta); (*ret+i)->guest_nice = f_diff_percent((last_cpu_times+i)->guest_nice, (t1+i)->guest_nice, all_delta); } last_cpu_count = cpus; free(t1); return min_cpus; error: free(t1); return -1; }
static CpuTimes *calculate_cpu_times_percentage(CpuTimes *t1, CpuTimes *t2) { CpuTimes *ret; double all_delta = sum_cpu_time(t2) - sum_cpu_time(t1); ret = (CpuTimes *)calloc(1, sizeof(CpuTimes)); check_mem(ret); ret->user = 100 * (t2->user - t1->user) / all_delta; ret->system = 100 * (t2->system - t1->system) / all_delta; ret->idle = 100 * (t2->idle - t1->idle) / all_delta; ret->nice = 100 * (t2->nice - t1->nice) / all_delta; ret->iowait = 100 * (t2->iowait - t1->iowait) / all_delta; ret->irq = 100 * (t2->irq - t1->irq) / all_delta; ret->softirq = 100 * (t2->softirq - t1->softirq) / all_delta; ret->steal = 100 * (t2->steal - t1->steal) / all_delta; ret->guest = 100 * (t2->guest - t1->guest) / all_delta; ret->guest_nice = 100 * (t2->guest_nice - t1->guest_nice) / all_delta; return ret; error: free(ret); return NULL; }