static void zone_submit_values(c_avl_tree_t *tree) { char zonename[ZONENAME_MAX]; zoneid_t *zoneid = NULL; zone_stats_t *stats = NULL; while (c_avl_pick(tree, (void **)&zoneid, (void **)&stats) == 0) { if (getzonenamebyid(*zoneid, zonename, sizeof(zonename)) == -1) { WARNING("zone plugin: error retrieving zonename"); } else { zone_submit_value(zonename, (gauge_t)FRC2PCT(stats->pctcpu)); } free(stats); free(zoneid); } c_avl_destroy(tree); }
/* * Sorting routines */ static ulong_t get_cpu_from_psinfo(void *lwp) { return ((ulong_t) FRC2PCT((((lwp_info_t *)lwp)->li_info.pr_lwp.pr_pctcpu)*1000)); }
static void list_update(list_t *list, lwp_info_t *lwp) { id_info_t *id; if (list->l_head == NULL) { /* first element */ list->l_head = list->l_tail = id = Zalloc(sizeof (id_info_t)); goto update; } for (id = list->l_head; id; id = id->id_next) { if ((list->l_type == LT_USERS) && (id->id_uid != lwp->li_info.pr_uid)) continue; if ((list->l_type == LT_TASKS) && (id->id_taskid != lwp->li_info.pr_taskid)) continue; if ((list->l_type == LT_PROJECTS) && (id->id_projid != lwp->li_info.pr_projid)) continue; if ((list->l_type == LT_ZONES) && (id->id_zoneid != lwp->li_info.pr_zoneid)) continue; id->id_nproc++; id->id_taskid = lwp->li_info.pr_taskid; id->id_projid = lwp->li_info.pr_projid; id->id_zoneid = lwp->li_info.pr_zoneid; if (lwp->li_flags & LWP_REPRESENT) { id->id_size += lwp->li_info.pr_size; id->id_rssize += lwp->li_info.pr_rssize; } id->id_pctcpu += FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); if (opts.o_outpmode & OPT_LWPS) id->id_time += TIME2SEC(lwp->li_info.pr_lwp.pr_time); else id->id_time += TIME2SEC(lwp->li_info.pr_time); id->id_pctmem += FRC2PCT(lwp->li_info.pr_pctmem); id->id_key += lwp->li_key; total_cpu += FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); total_mem += FRC2PCT(lwp->li_info.pr_pctmem); return; } id = list->l_tail; id->id_next = Zalloc(sizeof (id_info_t)); id->id_next->id_prev = list->l_tail; id->id_next->id_next = NULL; list->l_tail = id->id_next; id = list->l_tail; update: id->id_uid = lwp->li_info.pr_uid; id->id_projid = lwp->li_info.pr_projid; id->id_taskid = lwp->li_info.pr_taskid; id->id_zoneid = lwp->li_info.pr_zoneid; id->id_nproc++; if (lwp->li_flags & LWP_REPRESENT) { id->id_size = lwp->li_info.pr_size; id->id_rssize = lwp->li_info.pr_rssize; } id->id_pctcpu = FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); if (opts.o_outpmode & OPT_LWPS) id->id_time = TIME2SEC(lwp->li_info.pr_lwp.pr_time); else id->id_time = TIME2SEC(lwp->li_info.pr_time); id->id_pctmem = FRC2PCT(lwp->li_info.pr_pctmem); id->id_key = lwp->li_key; total_cpu += id->id_pctcpu; total_mem += id->id_pctmem; list->l_count++; }
/* * A routine to display the contents of the list on the screen */ static void list_print(list_t *list) { lwp_info_t *lwp; id_info_t *id; char usr[4], sys[4], trp[4], tfl[4]; char dfl[4], lck[4], slp[4], lat[4]; char vcx[4], icx[4], scl[4], sig[4]; char psize[6], prssize[6], pmem[6], pcpu[6], ptime[12]; char pstate[7], pnice[4], ppri[4]; char pname[LOGNAME_MAX+1]; char projname[PROJNAME_MAX+1]; char zonename[ZONENAME_MAX+1]; float cpu, mem; double loadavg[3] = {0, 0, 0}; int i, lwpid; if (foreach_element(&set_tbl, &loadavg, psetloadavg) == 0) { /* * If processor sets aren't specified, we display system-wide * load averages. */ (void) getloadavg(loadavg, 3); } if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); (void) putp(t_ulon); switch (list->l_type) { case LT_PROJECTS: if (opts.o_outpmode & OPT_LWPS) (void) printf(PROJECT_HEADER_LWP); else (void) printf(PROJECT_HEADER_PROC); break; case LT_TASKS: if (opts.o_outpmode & OPT_LWPS) (void) printf(TASK_HEADER_LWP); else (void) printf(TASK_HEADER_PROC); break; case LT_ZONES: if (opts.o_outpmode & OPT_LWPS) (void) printf(ZONE_HEADER_LWP); else (void) printf(ZONE_HEADER_PROC); break; case LT_USERS: if (opts.o_outpmode & OPT_LWPS) (void) printf(USER_HEADER_LWP); else (void) printf(USER_HEADER_PROC); break; case LT_LWPS: if (opts.o_outpmode & OPT_LWPS) { if (opts.o_outpmode & OPT_PSINFO) (void) printf(PSINFO_HEADER_LWP); if (opts.o_outpmode & OPT_MSACCT) (void) printf(USAGE_HEADER_LWP); } else { if (opts.o_outpmode & OPT_PSINFO) (void) printf(PSINFO_HEADER_PROC); if (opts.o_outpmode & OPT_MSACCT) (void) printf(USAGE_HEADER_PROC); } break; } (void) putp(t_uloff); (void) putp(t_eol); (void) putchar('\n'); for (i = 0; i < list->l_used; i++) { switch (list->l_type) { case LT_PROJECTS: case LT_TASKS: case LT_USERS: case LT_ZONES: id = list->l_ptrs[i]; /* * CPU usage and memory usage normalization */ if (total_cpu >= 100) cpu = (100 * id->id_pctcpu) / total_cpu; else cpu = id->id_pctcpu; if (total_mem >= 100) mem = (100 * id->id_pctmem) / total_mem; else mem = id->id_pctmem; if (list->l_type == LT_USERS) pwd_getname(id->id_uid, pname, LOGNAME_MAX + 1); else if (list->l_type == LT_ZONES) getzonename(id->id_zoneid, zonename, ZONENAME_MAX); else getprojname(id->id_projid, projname, PROJNAME_MAX); Format_size(psize, id->id_size, 6); Format_size(prssize, id->id_rssize, 6); Format_pct(pmem, mem, 4); Format_pct(pcpu, cpu, 4); Format_time(ptime, id->id_time, 10); if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); if (list->l_type == LT_PROJECTS) (void) printf(PROJECT_LINE, (int)id->id_projid, id->id_nproc, psize, prssize, pmem, ptime, pcpu, projname); else if (list->l_type == LT_TASKS) (void) printf(TASK_LINE, (int)id->id_taskid, id->id_nproc, psize, prssize, pmem, ptime, pcpu, projname); else if (list->l_type == LT_ZONES) (void) printf(ZONE_LINE, (int)id->id_zoneid, id->id_nproc, psize, prssize, pmem, ptime, pcpu, zonename); else (void) printf(USER_LINE, id->id_nproc, pname, psize, prssize, pmem, ptime, pcpu); (void) putp(t_eol); (void) putchar('\n'); break; case LT_LWPS: lwp = list->l_ptrs[i]; if (opts.o_outpmode & OPT_LWPS) lwpid = lwp->li_info.pr_lwp.pr_lwpid; else lwpid = lwp->li_info.pr_nlwp + lwp->li_info.pr_nzomb; pwd_getname(lwp->li_info.pr_uid, pname, LOGNAME_MAX + 1); if (opts.o_outpmode & OPT_PSINFO) { Format_size(psize, lwp->li_info.pr_size, 6); Format_size(prssize, lwp->li_info.pr_rssize, 6); Format_state(pstate, lwp->li_info.pr_lwp.pr_sname, lwp->li_info.pr_lwp.pr_onpro, 7); if (strcmp(lwp->li_info.pr_lwp.pr_clname, "RT") == 0 || strcmp(lwp->li_info.pr_lwp.pr_clname, "SYS") == 0 || lwp->li_info.pr_lwp.pr_sname == 'Z') (void) strcpy(pnice, " -"); else Format_num(pnice, lwp->li_info.pr_lwp.pr_nice - NZERO, 4); Format_num(ppri, lwp->li_info.pr_lwp.pr_pri, 4); Format_pct(pcpu, FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu), 4); if (opts.o_outpmode & OPT_LWPS) Format_time(ptime, lwp->li_info.pr_lwp.pr_time.tv_sec, 10); else Format_time(ptime, lwp->li_info.pr_time.tv_sec, 10); if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); stripfname(lwp->li_info.pr_fname); (void) printf(PSINFO_LINE, (int)lwp->li_info.pr_pid, pname, psize, prssize, pstate, ppri, pnice, ptime, pcpu, lwp->li_info.pr_fname, lwpid); (void) putp(t_eol); (void) putchar('\n'); } if (opts.o_outpmode & OPT_MSACCT) { Format_pct(usr, lwp->li_usr, 4); Format_pct(sys, lwp->li_sys, 4); Format_pct(slp, lwp->li_slp, 4); Format_num(vcx, lwp->li_vcx, 4); Format_num(icx, lwp->li_icx, 4); Format_num(scl, lwp->li_scl, 4); Format_num(sig, lwp->li_sig, 4); Format_pct(trp, lwp->li_trp, 4); Format_pct(tfl, lwp->li_tfl, 4); Format_pct(dfl, lwp->li_dfl, 4); Format_pct(lck, lwp->li_lck, 4); Format_pct(lat, lwp->li_lat, 4); if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); stripfname(lwp->li_info.pr_fname); (void) printf(USAGE_LINE, (int)lwp->li_info.pr_pid, pname, usr, sys, trp, tfl, dfl, lck, slp, lat, vcx, icx, scl, sig, lwp->li_info.pr_fname, lwpid); (void) putp(t_eol); (void) putchar('\n'); } break; } } if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); if (opts.o_outpmode & OPT_TERMCAP) { switch (list->l_type) { case LT_PROJECTS: case LT_USERS: case LT_TASKS: case LT_ZONES: while (i++ < opts.o_nbottom) { (void) putp(t_eol); (void) putchar('\n'); } break; case LT_LWPS: while (i++ < opts.o_ntop) { (void) putp(t_eol); (void) putchar('\n'); } } } if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); if ((opts.o_outpmode & OPT_SPLIT) && list->l_type == LT_LWPS) return; (void) printf(TOTAL_LINE, total_procs, total_lwps, loadavg[LOADAVG_1MIN], loadavg[LOADAVG_5MIN], loadavg[LOADAVG_15MIN]); (void) putp(t_eol); (void) putchar('\n'); if (opts.o_outpmode & OPT_TTY) (void) putchar('\r'); (void) putp(t_eol); (void) fflush(stdout); }
/* * Calculate a process' statistics from its lwp statistics. */ static void id_update(id_info_t *id, lwp_info_t *lwp, int l_type) { char usrname[LOGNAME_MAX+1]; char projname[PROJNAME_MAX+1]; /* * When an id is processed first time in an update run its * id_alive flag set to false. * The next values are gauges, their old values from the previous * calculation should be set to null. * The names and timestamp must be set once. */ if (id->id_alive == B_FALSE) { id->id_hpsize = 0; id->id_size = 0; id->id_rssize = 0; id->id_pctmem = 0; id->id_timestamp = 0; id->id_time = 0; id->id_pctcpu = 0; id->id_nlwps = 0; id->id_nproc = 0; id->id_pid = (int)-1; id->id_taskid = lwp->li_psinfo->pr_taskid; id->id_projid = lwp->li_psinfo->pr_projid; id->id_psetid = lwp->li_lwpsinfo->pr_bindpset; id->id_uid = lwp->li_psinfo->pr_uid; if (l_type == LT_USERS) { getusrname(id->id_uid, usrname, LOGNAME_MAX+1); id->id_name = Realloc(id->id_name, strlen(usrname) + 1); (void) strcpy(id->id_name, usrname); } else if (l_type == LT_PROJECTS) { getprojname(id->id_projid, projname, PROJNAME_MAX); id->id_name = Realloc(id->id_name, strlen(projname) + 1); (void) strcpy(id->id_name, projname); } else { id->id_name = nullstr; } id->id_timestamp = get_timestamp(); /* mark this id as changed in this update run */ id->id_alive = B_TRUE; } if (lwp->li_psinfo->pr_nlwp > 0) { id->id_nlwps++; } /* * The next values are calculated only one time for each pid. */ if ((id->id_pid != lwp->li_psinfo->pr_pid) && (lwp->rlwpid == lwp->li_lwpsinfo->pr_lwpid)) { id->id_nproc++; id->id_hpsize += (lwp->li_hpsize/1024); id->id_size += lwp->li_psinfo->pr_size; id->id_rssize += lwp->li_psinfo->pr_rssize; id->id_pctmem += FRC2PCT(lwp->li_psinfo->pr_pctmem); id->id_pid = lwp->li_psinfo->pr_pid; if (l_type == LT_PROCESS) total_mem += FRC2PCT(lwp->li_psinfo->pr_pctmem); } id->id_pctcpu += FRC2PCT(lwp->li_lwpsinfo->pr_pctcpu); if (l_type == LT_PROCESS) total_cpu += FRC2PCT(lwp->li_lwpsinfo->pr_pctcpu); id->id_time += TIME2SEC(lwp->li_lwpsinfo->pr_time); id->id_usr += lwp->li_usr; id->id_sys += lwp->li_sys; id->id_ttime += lwp->li_ttime; id->id_tpftime += lwp->li_tpftime; id->id_dpftime += lwp->li_dpftime; id->id_kpftime += lwp->li_kpftime; id->id_lck += lwp->li_lck; id->id_slp += lwp->li_slp; id->id_lat += lwp->li_lat; id->id_stime += lwp->li_stime; id->id_minf += lwp->li_minf; id->id_majf += lwp->li_majf; id->id_nswap += lwp->li_nswap; id->id_inblk += lwp->li_inblk; id->id_oublk += lwp->li_oublk; id->id_msnd += lwp->li_msnd; id->id_mrcv += lwp->li_mrcv; id->id_sigs += lwp->li_sigs; id->id_vctx += lwp->li_vctx; id->id_ictx += lwp->li_ictx; id->id_scl += lwp->li_scl; id->id_ioch += lwp->li_ioch; }