I needed to be able to see what containers were doing what on openvz, so I
wrote a patch for it.
This will allow you to see what veid a process belongs to. It will also let
you group processes by veid and sort them based on whatever atop will let you
sort by (cpu, disk, memory etc.).
If you think it might be helpful to you,
here it is:
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)
{