diff --git a/Makefile b/Makefile index d5b0b49..7fb6978 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ ROTPATH = /etc/logrotate.d PMPATH1 = /usr/lib/pm-utils/sleep.d PMPATH2 = /usr/lib64/pm-utils/sleep.d -CFLAGS += -O2 -I. -Wall # -DHTTPSTATS +CFLAGS += -O2 -I. -Wall # -DOPENVZ # -DHTTPSTATS LDFLAGS += -lncurses -lm -lz OBJMOD0 = version.o OBJMOD1 = various.o deviate.o procdbase.o diff --git a/atop b/atop deleted file mode 100755 index 42b4214..0000000 Binary files a/atop and /dev/null differ diff --git a/atop.h b/atop.h index 2ce4cc3..12c9875 100644 --- a/atop.h +++ b/atop.h @@ -126,6 +126,9 @@ int compmem(const void *, const void *); int compnet(const void *, const void *); int compusr(const void *, const void *); int compnam(const void *, const void *); +#if OPENVZ +int compveid(const void *, const void *); +#endif int cpucompar (const void *, const void *); int diskcompar(const void *, const void *); diff --git a/photoproc.c b/photoproc.c index 47a3dac..face12a 100644 --- a/photoproc.c +++ b/photoproc.c @@ -304,6 +304,9 @@ fillproc(struct pstat *curproc) int pid, ppid, prio, policy, rtprio, nice, ruid, euid, suid, fsuid, rgid, egid, sgid, fsgid, curcpu, nthreads, sleepavg; +#if OPENVZ + int veid; +#endif count_t utime, stime, starttime; count_t minflt, majflt, size, rss, nswap, startcode, endcode, @@ -394,6 +397,13 @@ fillproc(struct pstat *curproc) sscanf(line, "Threads: %d", &nthreads); break; } +#if OPENVZ + if (memcmp(line, "envID:", 6)==0) + { + sscanf(line, "envID: %d", &veid); + break; + } +#endif } fclose(fp); @@ -440,6 +450,9 @@ fillproc(struct pstat *curproc) ** store required info in process-structure */ curproc->gen.pid = pid; +#if OPENVZ + curproc->gen.veid = veid; +#endif curproc->gen.ppid = ppid; curproc->gen.ruid = ruid; curproc->gen.euid = euid; diff --git a/photoproc.h b/photoproc.h index 98d4eb7..c1e2a81 100644 --- a/photoproc.h +++ b/photoproc.h @@ -34,6 +34,9 @@ struct pstat { /* GENERAL PROCESS INFO */ struct gen { int pid; /* process identification */ +#if OPENVZ + int veid; /*process openvz container */ +#endif int ppid; /* parent process identification*/ int ruid; /* real user identification */ int euid; /* eff. user identification */ diff --git a/showgeneric.c b/showgeneric.c index d30b436..683035c 100644 --- a/showgeneric.c +++ b/showgeneric.c @@ -293,6 +293,9 @@ static int maxintlines = 999; /* maximum interface lines */ static int cumusers(struct pstat *, struct pstat *, int); static int cumprocs(struct pstat *, struct pstat *, int); +#if OPENVZ +static int cumveid(struct pstat *, struct pstat *, int); +#endif static long getnumval(char *, long, int); @@ -431,6 +434,12 @@ generic_samp(time_t curtime, int nsecs, showtype = MCUMPROC; break; +#if OPENVZ + case MCUMVEID: + showtype = MCUMVEID; + break; +#endif + case MSYSFIXED: if (fixedhead) fixedhead=0; @@ -694,7 +703,7 @@ generic_samp(time_t curtime, int nsecs, ** list of processes and accumulate resource consumption ** of all processes in the current list */ - if (showtype == MCUMUSER || showtype == MCUMPROC) + if (showtype == MCUMUSER || showtype == MCUMPROC || showtype == MCUMVEID) { /* ** remember info based on individual processes @@ -722,6 +731,11 @@ generic_samp(time_t curtime, int nsecs, case MCUMPROC: nact = cumprocs(save_pstat, pstat, save_nact); break; +#if OPENVZ + case MCUMVEID: + nact = cumveid(save_pstat, pstat, save_nact); + break; +#endif } lastorder = 0; /* force new sort */ @@ -786,7 +800,7 @@ generic_samp(time_t curtime, int nsecs, ** if cumulative figures per user shown, ** release temporary space and restore per-process values */ - if (showtype == MCUMUSER || showtype == MCUMPROC) + if (showtype == MCUMUSER || showtype == MCUMPROC || showtype == MCUMVEID) { free(pstat); @@ -1108,6 +1122,18 @@ generic_samp(time_t curtime, int nsecs, showtype = MCUMPROC; firstproc = 0; break; +#if OPENVZ + /* + ** accumulated resource consumption per veid + */ + case MCUMVEID: + statmsg = "Consumption per veid; use 'a' to " + "toggle between all/active processes"; + + showtype = MCUMVEID; + firstproc = 0; + break; +#endif /* ** help wanted? @@ -1684,6 +1710,71 @@ cumprocs(struct pstat *curprocs, struct pstat *curprogs, int numprocs) return numprogs; } +#if OPENVZ +/* +** accumulate all processes with the same veid (i.e. same virutal machine) +** into a new list +*/ +static int +cumveid(struct pstat *curprocs, struct pstat *curprogs, int numprocs) +{ + register int i, numprogs; + + /* + ** sort list of active processes in order of process-name + */ + qsort(curprocs, numprocs, sizeof(struct pstat), compveid); + + /* + ** accumulate all processes with same name in the new list + */ + for (numprogs=i=0; i < numprocs; i++, curprocs++) + { + if ( curprogs->gen.veid != curprocs->gen.veid ) + { + if (curprogs->gen.veid) + { + numprogs++; + curprogs++; + } + curprogs->gen.veid = curprocs->gen.veid; + } + + curprogs->gen.pid++; /* misuse as counter */ + + curprogs->gen.nthr += curprocs->gen.nthr; + curprogs->cpu.utime += curprocs->cpu.utime; + curprogs->cpu.stime += curprocs->cpu.stime; + + curprogs->dsk.rio += curprocs->dsk.rio; + curprogs->dsk.wio += curprocs->dsk.wio; + + curprogs->dsk.rsz += curprocs->dsk.rsz; + curprogs->dsk.wsz += curprocs->dsk.wsz; + + curprogs->net.tcpsnd += curprocs->net.tcpsnd; + curprogs->net.tcprcv += curprocs->net.tcprcv; + curprogs->net.udpsnd += curprocs->net.udpsnd; + curprogs->net.udprcv += curprocs->net.udprcv; + curprogs->net.rawsnd += curprocs->net.rawsnd; + curprogs->net.rawrcv += curprocs->net.rawrcv; + + if (curprocs->gen.state != 'E') + { + curprogs->mem.rmem += curprocs->mem.rmem; + curprogs->mem.vmem += curprocs->mem.vmem; + curprogs->mem.rgrow += curprocs->mem.rgrow; + curprogs->mem.vgrow += curprocs->mem.vgrow; + } + } + + if (curprogs->gen.veid) + numprogs++; + + return numprogs; +} +#endif + /* ** get a numerical value from the user and verify */ @@ -1776,6 +1867,10 @@ static struct helptext { {"\t'%c' - total resource consumption per user\n", MCUMUSER}, {"\t'%c' - total resource consumption per program (i.e. same " "process name)\n", MCUMPROC}, +#if OPENVZ + {"\t'%c' - total resource consumption per veid (i.e. same " + "openvz container)\n", MCUMVEID}, +#endif {"\n", ' '}, {"Selections:\n", ' '}, {"\t'%c' - focus on specific user name (regular expression)\n", @@ -1926,8 +2021,14 @@ generic_usage(void) printf("\t -%c show cumulated process-info per user\n", MCUMUSER); printf("\t -%c show cumulated process-info per program " - "(i.e. same name)\n\n", + "(i.e. same name)\n", MCUMPROC); +#if OPENVZ + printf("\t -%c show cumulated process-info per veid " + "(i.e. same openvz container)\n", + MCUMVEID); +#endif + printf("\n"); printf("\t -%c sort processes in order of cpu-consumption " "(default)\n", MSORTCPU); @@ -2134,6 +2235,12 @@ do_flags(char *name, char *val) showtype = MCUMPROC; break; +#if OPENVZ + case MCUMVEID: + showtype = MCUMVEID; + break; +#endif + case MALLPROC: deviatonly = 0; break; diff --git a/showgeneric.h b/showgeneric.h index 06a4254..2350e90 100644 --- a/showgeneric.h +++ b/showgeneric.h @@ -62,6 +62,7 @@ struct selection { #define MCUMUSER 'u' #define MCUMPROC 'p' +#define MCUMVEID 'O' #define MSORTCPU 'C' #define MSORTDSK 'D' diff --git a/showlinux.c b/showlinux.c index c9fdbf7..07d717d 100644 --- a/showlinux.c +++ b/showlinux.c @@ -429,6 +429,9 @@ sys_printdef *netintfsyspdefs[] = { proc_printdef *allprocpdefs[]= { &procprt_PID, +#if OPENVZ + &procprt_VEID, +#endif &procprt_PPID, &procprt_SYSCPU, &procprt_USRCPU, @@ -506,6 +509,7 @@ proc_printpair cmdprocs[MAXITEMS]; proc_printpair ownprocs[MAXITEMS]; proc_printpair totusers[MAXITEMS]; proc_printpair totprocs[MAXITEMS]; +proc_printpair totveid[MAXITEMS]; /*****************************************************************/ @@ -1070,7 +1074,11 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort) { // No patches, iostat data is available make_proc_prints(genprocs, MAXITEMS, +#if OPENVZ + "PID:10 VEID:10 RUID:3 EUID:2 THR:4 " +#else "PID:10 RUID:3 EUID:2 THR:4 " +#endif "SYSCPU:9 USRCPU:9 " "VGROW:8 RGROW:8 " "RDDSK:7 WRDSK:7 " @@ -1158,10 +1166,14 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort) "built-in netprocs"); make_proc_prints(varprocs, MAXITEMS, +#if OPENVZ + "PID:10 PPID:9 VEID:10 RUID:8 RGID:8 EUID:5 EGID:4 " +#else "PID:10 PPID:9 RUID:8 RGID:8 EUID:5 EGID:4 " - "SUID:3 SGID:2 FSUID:3 FSGID:2 " +#endif + "SUID:3 SGID:2 FSUID:3 FSGID:2 " "STDATE:7 STTIME:7 ENDATE:5 ENTIME:5 " - "ST:6 EXC:6 S:6 SORTITEM:10 CMD:10", + "ST:6 EXC:6 S:6 SORTITEM:10 CMD:10", "built-in varprocs"); make_proc_prints(cmdprocs, MAXITEMS, @@ -1179,6 +1191,14 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort) "RSIZE:8 RDDSK:7 WRDSK:7 RNET:6 SNET:6" "SORTITEM:10 CMD:10", "built-in totprocs"); + +#if OPENVZ + make_proc_prints(totveid, MAXITEMS, + "NPROCS:10 SYSCPU:9 USRCPU:9 VSIZE:8 " + "RSIZE:8 RDDSK:7 WRDSK:7 RNET:6 SNET:6 " + "SORTITEM:10 VEID:10", + "built-in totveid"); +#endif } /* @@ -1234,6 +1254,12 @@ priphead(int curlist, int totlist, char showtype, char showorder, char autosort) case MCUMPROC: showhdrline(totprocs, curlist, totlist, showorder, autosort); break; + +#if OPENVZ + case MCUMVEID: + showhdrline(totveid, curlist, totlist, showorder, autosort); + break; +#endif } } @@ -1403,6 +1429,12 @@ priproc(struct pstat *pstat, int firstproc, int lastproc, int curline, case MCUMPROC: showprocline(totprocs, curstat, perc, nsecs, avgval); break; + +#if OPENVZ + case MCUMVEID: + showprocline(totveid, curstat, perc, nsecs, avgval); + break; +#endif } curline++; @@ -1997,6 +2029,18 @@ compnam(const void *a, const void *b) return strcmp(nama, namb); } +#if OPENVZ +int +compveid(const void *a, const void *b) +{ + register int veida = ((struct pstat *)a)->gen.veid; + register int veidb = ((struct pstat *)b)->gen.veid; + + if (veida > veidb) return 1; + if (veida < veidb) return -1; + return 0; +} +#endif /* ** handle modifications from the /etc/atoprc and ~/.atoprc file diff --git a/showlinux.h b/showlinux.h index 76476ac..9357ba4 100644 --- a/showlinux.h +++ b/showlinux.h @@ -220,6 +220,9 @@ char *procprt_NOTAVAIL_7(struct pstat *curstat, int avgval, int nsecs); extern proc_printdef *allprocpdefs[]; extern proc_printdef procprt_PID; +#if OPENVZ +extern proc_printdef procprt_VEID; +#endif extern proc_printdef procprt_PPID; extern proc_printdef procprt_SYSCPU; extern proc_printdef procprt_USRCPU; diff --git a/showprocs.c b/showprocs.c index 1554b26..99e8025 100644 --- a/showprocs.c +++ b/showprocs.c @@ -445,6 +445,33 @@ proc_printdef procprt_PID = { " PID", "PID", procprt_PID_a, procprt_PID_e, 5 }; /***************************************************************/ +#if OPENVZ +char * +procprt_VEID_a(struct pstat *curstat, int avgval, int nsecs) +{ + static char buf[10]; + + sprintf(buf, "%-8d", curstat->gen.veid); + return buf; +} + +char * +procprt_VEID_e(struct pstat *curstat, int avgval, int nsecs) +{ + static char buf[10]; + + if (curstat->gen.veid == 0) + return " ?"; + + sprintf(buf, "%-8d", curstat->gen.veid); + return buf; +} + +proc_printdef procprt_VEID = + { "VEID ", "VEID", procprt_VEID_a, procprt_VEID_e, 8 }; + +#endif +/***************************************************************/ char * procprt_PPID_a(struct pstat *curstat, int avgval, int nsecs) {