/* * CPU usage as ticks spent since last call, * see <tt>sg_get_cpu_stats_diff(3)</tt> manpage. */ static VALUE statgrab_cpu_stats_diff(VALUE self) { sg_cpu_stats *stats; VALUE info, time_at; if ((stats = sg_get_cpu_stats_diff()) == NULL) statgrab_handle_error(); info = rb_hash_new(); rb_hash_aset(info, ID2SYM(rb_intern("user")), INT2NUM(stats->user)); rb_hash_aset(info, ID2SYM(rb_intern("kernel")), INT2NUM(stats->kernel)); rb_hash_aset(info, ID2SYM(rb_intern("idle")), INT2NUM(stats->idle)); rb_hash_aset(info, ID2SYM(rb_intern("iowait")), INT2NUM(stats->iowait)); rb_hash_aset(info, ID2SYM(rb_intern("swap")), INT2NUM(stats->swap)); rb_hash_aset(info, ID2SYM(rb_intern("nice")), INT2NUM(stats->nice)); rb_hash_aset(info, ID2SYM(rb_intern("systime")), INT2NUM(stats->systime)); time_at = rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(stats->systime)); rb_hash_aset(info, ID2SYM(rb_intern("time")), time_at); return info; }
sg_cpu_percents *sg_get_cpu_percents(){ static sg_cpu_percents cpu_usage; #ifndef WIN32 sg_cpu_stats *cs_ptr; cs_ptr=sg_get_cpu_stats_diff(); if(cs_ptr==NULL){ return NULL; } cpu_usage.user = ((float)cs_ptr->user / (float)cs_ptr->total)*100; cpu_usage.kernel = ((float)cs_ptr->kernel / (float)cs_ptr->total)*100; cpu_usage.idle = ((float)cs_ptr->idle / (float)cs_ptr->total)*100; cpu_usage.iowait = ((float)cs_ptr->iowait / (float)cs_ptr->total)*100; cpu_usage.swap = ((float)cs_ptr->swap / (float)cs_ptr->total)*100; cpu_usage.nice = ((float)cs_ptr->nice / (float)cs_ptr->total)*100; cpu_usage.time_taken = cs_ptr->systime; #else double result; if(read_counter_double(SG_WIN32_PROC_USER, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_USER); return NULL; } cpu_usage.user = (float)result; if(read_counter_double(SG_WIN32_PROC_PRIV, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_PRIV); return NULL; } cpu_usage.kernel = (float)result; if(read_counter_double(SG_WIN32_PROC_IDLE, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_IDLE); return NULL; } /* win2000 does not have an idle counter, but does have %activity * so convert it to idle */ cpu_usage.idle = 100 - (float)result; if(read_counter_double(SG_WIN32_PROC_INT, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_INTER); return NULL; } cpu_usage.iowait = (float)result; #endif return &cpu_usage; }
void populate_cpu() { if (use_cpu_percent) { sg_cpu_percents *cpu_p = sg_get_cpu_percents(); if (cpu_p != NULL) { add_stat(FLOAT, &cpu_p->user, "cpu", "user", NULL); add_stat(FLOAT, &cpu_p->kernel, "cpu", "kernel", NULL); add_stat(FLOAT, &cpu_p->idle, "cpu", "idle", NULL); add_stat(FLOAT, &cpu_p->iowait, "cpu", "iowait", NULL); add_stat(FLOAT, &cpu_p->swap, "cpu", "swap", NULL); add_stat(FLOAT, &cpu_p->nice, "cpu", "nice", NULL); add_stat(TIME_T, &cpu_p->time_taken, "cpu", "time_taken", NULL); } } else { sg_cpu_stats *cpu_s; cpu_s = use_diffs ? sg_get_cpu_stats_diff() : sg_get_cpu_stats(); if (cpu_s != NULL) { add_stat(LONG_LONG, &cpu_s->user, "cpu", "user", NULL); add_stat(LONG_LONG, &cpu_s->kernel, "cpu", "kernel", NULL); add_stat(LONG_LONG, &cpu_s->idle, "cpu", "idle", NULL); add_stat(LONG_LONG, &cpu_s->iowait, "cpu", "iowait", NULL); add_stat(LONG_LONG, &cpu_s->swap, "cpu", "swap", NULL); add_stat(LONG_LONG, &cpu_s->nice, "cpu", "nice", NULL); add_stat(LONG_LONG, &cpu_s->total, "cpu", "total", NULL); add_stat(TIME_T, &cpu_s->systime, "cpu", "systime", NULL); } } }
static void populate_cpu(void) { sg_cpu_stats *cpu_s; cpu_s = use_diffs ? sg_get_cpu_stats_diff(NULL) : sg_get_cpu_stats(NULL); if (use_cpu_percent) { sg_cpu_percent_source cps = use_diffs ? sg_last_diff_cpu_percent : sg_entire_cpu_percent; sg_cpu_percents *cpu_p = sg_get_cpu_percents_of(cps, NULL); if (cpu_p != NULL) { add_stat(DOUBLE, &cpu_p->user, "cpu", "user", NULL); add_stat(DOUBLE, &cpu_p->kernel, "cpu", "kernel", NULL); add_stat(DOUBLE, &cpu_p->idle, "cpu", "idle", NULL); add_stat(DOUBLE, &cpu_p->iowait, "cpu", "iowait", NULL); add_stat(DOUBLE, &cpu_p->swap, "cpu", "swap", NULL); add_stat(DOUBLE, &cpu_p->nice, "cpu", "nice", NULL); add_stat(TIME_T, &cpu_p->time_taken, "cpu", "time_taken", NULL); } } else { if (cpu_s != NULL) { add_stat(UNSIGNED_LONG_LONG, &cpu_s->user, "cpu", "user", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->kernel, "cpu", "kernel", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->idle, "cpu", "idle", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->iowait, "cpu", "iowait", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->swap, "cpu", "swap", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->nice, "cpu", "nice", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->total, "cpu", "total", NULL); add_stat(TIME_T, &cpu_s->systime, "cpu", "systime", NULL); } } if (cpu_s != NULL) { add_stat(UNSIGNED_LONG_LONG, &cpu_s->context_switches, "cpu", "ctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->voluntary_context_switches, "cpu", "vctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->involuntary_context_switches, "cpu", "nvctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->syscalls, "cpu", "syscalls", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->interrupts, "cpu", "intrs", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->soft_interrupts, "cpu", "softintrs", NULL); } }
int main(int argc, char **argv){ extern char *optarg; int c; int delay = 1; sg_cpu_percents *cpu_percent; sg_cpu_stats *cpu_diff_stats; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } #ifdef WIN32 delay = delay * 1000; #endif /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* XXX must be replaced by termios/(n)curses function .... if( 0 != setvbuf(stdin, NULL, _IONBF, 0) ) { perror("setvbuf"); exit(1); } */ /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) { sg_die("Error. Failed to drop privileges", 1); } register_sig_flagger( SIGINT, &quit ); /* Throw away the first reading as thats averaged over the machines uptime */ sg_snapshot(); cpu_percent = sg_get_cpu_percents(NULL); if( NULL == cpu_percent ) sg_die("Failed to get cpu stats", 1); /* Clear the screen ready for display the cpu usage */ printf("\033[2J"); while( ( ( cpu_diff_stats = sg_get_cpu_stats_diff(NULL) ) != NULL ) && ( ( cpu_percent = sg_get_cpu_percents_of(sg_last_diff_cpu_percent, NULL) ) != NULL ) ) { int ch; sg_snapshot(); printf("\033[2;2H%-14s : %lld (%6.2f)", "User CPU", cpu_diff_stats->user, cpu_percent->user); printf("\033[3;2H%-14s : %lld (%6.2f)", "Kernel CPU", cpu_diff_stats->kernel, cpu_percent->kernel); printf("\033[4;2H%-14s : %lld (%6.2f)", "IOWait CPU", cpu_diff_stats->iowait, cpu_percent->iowait); printf("\033[5;2H%-14s : %lld (%6.2f)", "Swap CPU", cpu_diff_stats->swap, cpu_percent->swap); printf("\033[6;2H%-14s : %lld (%6.2f)", "Nice CPU", cpu_diff_stats->nice, cpu_percent->nice); printf("\033[7;2H%-14s : %lld (%6.2f)", "Idle CPU", cpu_diff_stats->idle, cpu_percent->idle); printf("\033[8;2H%-14s : %llu", "Ctxts", cpu_diff_stats->context_switches); printf("\033[9;2H%-14s : %llu", " Voluntary", cpu_diff_stats->voluntary_context_switches); printf("\033[10;2H%-14s : %llu", " Involuntary", cpu_diff_stats->involuntary_context_switches); printf("\033[11;2H%-14s : %llu", "Syscalls", cpu_diff_stats->syscalls); printf("\033[12;2H%-14s : %llu", "Intrs", cpu_diff_stats->interrupts); printf("\033[13;2H%-14s : %llu", "SoftIntrs", cpu_diff_stats->soft_interrupts); fflush(stdout); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } sg_shutdown(); exit(0); }