summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-01-05 00:52:14 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2018-01-05 00:52:14 +0100
commitb437065950b5d0234358fcfe8495f6bdb0bf3003 (patch)
treedbed53ff75256bc401b50cd3b18ad14b321d10c4
parentd3e54ff2d9039c67f6fe7d99349e1c83b696b7ae (diff)
downloadplan9front-b437065950b5d0234358fcfe8495f6bdb0bf3003.tar.xz
stats: show amount of reclaimable pages (add -r flag)
reclaimable pages are user pages that are used for caches like the image cache, mount cache and swap cache.
-rw-r--r--sys/man/8/stats18
-rw-r--r--sys/src/9/port/devswap.c6
-rw-r--r--sys/src/9/port/portfns.h1
-rw-r--r--sys/src/9/port/segment.c13
-rw-r--r--sys/src/cmd/stats.c76
5 files changed, 85 insertions, 29 deletions
diff --git a/sys/man/8/stats b/sys/man/8/stats
index 8e07dca7d..b67d60c54 100644
--- a/sys/man/8/stats
+++ b/sys/man/8/stats
@@ -39,6 +39,9 @@ percentage battery life remaining.
.B "c context
number of process context switches per second.
.TP
+.B "d draw
+draw memory allocation size in bytes.
+.TP
.B
.B "e ether
total number of packets sent and received per second.
@@ -58,6 +61,9 @@ system load, % time in idle, and % time in interrupts.
The last two are averaged over all processors on a
multiprocessor.
.TP
+.B "k kern
+kernel memory allocation size in bytes.
+.TP
.B "l load
(default) system load average.
The load is computed as a running average of
@@ -68,19 +74,17 @@ total pages of active memory.
The graph displays the fraction
of the machine's total memory in use.
.TP
-.B "k kern
-kernel memory allocation size in bytes.
-.TP
-.B "d draw
-draw memory allocation size in bytes.
-.TP
-.B
.B "n etherin,out,err
number of packets sent and received per second, and total number of errors, displayed as separate graphs.
.TP
.B "p tlbpurge
number of translation lookaside buffer flushes per second.
.TP
+.B "r reclaim
+total pages of reclaimable memory.
+The graph displays the fraction
+of the machine's total memory in use.
+.TP
.B "s syscall
number of system calls per second.
.TP
diff --git a/sys/src/9/port/devswap.c b/sys/src/9/port/devswap.c
index ffcb2016b..7cd4446c1 100644
--- a/sys/src/9/port/devswap.c
+++ b/sys/src/9/port/devswap.c
@@ -517,25 +517,29 @@ static long
swapread(Chan *c, void *va, long n, vlong off)
{
char tmp[256]; /* must be >= 18*NUMSIZE (Qswap) */
+ ulong reclaim;
switch((ulong)c->qid.path){
case Qdir:
return devdirread(c, va, n, swapdir, nelem(swapdir), devgen);
case Qswap:
+ reclaim = imagecached() + fscache.pgref + swapimage.pgref;
snprint(tmp, sizeof tmp,
"%llud memory\n"
"%llud pagesize\n"
"%lud kernel\n"
"%lud/%lud user\n"
"%lud/%lud swap\n"
+ "%lud/%lud reclaim\n"
"%llud/%llud/%llud kernel malloc\n"
"%llud/%llud/%llud kernel draw\n"
"%llud/%llud/%llud kernel secret\n",
(uvlong)conf.npage*BY2PG,
(uvlong)BY2PG,
conf.npage-conf.upages,
- palloc.user-palloc.freecount-fscache.pgref-swapimage.pgref, palloc.user,
+ palloc.user-palloc.freecount-reclaim, palloc.user,
conf.nswap-swapalloc.free, conf.nswap,
+ reclaim, palloc.user,
(uvlong)mainmem->curalloc,
(uvlong)mainmem->cursize,
(uvlong)mainmem->maxsize,
diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h
index c238c818e..5f60c1b9e 100644
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -133,6 +133,7 @@ uintptr ibrk(uintptr, int);
void ilock(Lock*);
void interrupted(void);
void iunlock(Lock*);
+ulong imagecached(void);
ulong imagereclaim(ulong);
long incref(Ref*);
void initseg(void);
diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c
index bc16c3333..ca67c4b56 100644
--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -297,6 +297,19 @@ found:
}
ulong
+imagecached(void)
+{
+ Image *i, *ie;
+ ulong np;
+
+ np = 0;
+ ie = &imagealloc.list[conf.nimage];
+ for(i = imagealloc.list; i < ie; i++)
+ np += i->pgref;
+ return np;
+}
+
+ulong
imagereclaim(ulong pages)
{
static Image *i, *ie;
diff --git a/sys/src/cmd/stats.c b/sys/src/cmd/stats.c
index 09ef62c63..dfb71a1cd 100644
--- a/sys/src/cmd/stats.c
+++ b/sys/src/cmd/stats.c
@@ -26,12 +26,13 @@ struct Graph
enum
{
- /* old /dev/swap */
+ /* /dev/swap */
Mem = 0,
Maxmem,
Swap,
Maxswap,
-
+ Reclaim,
+ Maxreclaim,
Kern,
Maxkern,
Draw,
@@ -48,6 +49,7 @@ enum
Load,
Idle,
InIntr,
+
/* /net/ether0/stats */
In = 0,
Link,
@@ -69,7 +71,7 @@ struct Machine
int tempfd;
int disable;
- uvlong devswap[8];
+ uvlong devswap[10];
uvlong devsysstat[10];
uvlong prevsysstat[10];
int nproc;
@@ -120,6 +122,7 @@ enum Menu2
Mload,
Mmem,
Mswap,
+ Mreclaim,
Mkern,
Mdraw,
Msyscall,
@@ -144,6 +147,7 @@ char *menu2str[Nmenu2+1] = {
"add load ",
"add mem ",
"add swap ",
+ "add reclaim ",
"add kern ",
"add draw ",
"add syscall ",
@@ -167,6 +171,7 @@ void contextval(Machine*, uvlong*, uvlong*, int),
idleval(Machine*, uvlong*, uvlong*, int),
memval(Machine*, uvlong*, uvlong*, int),
swapval(Machine*, uvlong*, uvlong*, int),
+ reclaimval(Machine*, uvlong*, uvlong*, int),
kernval(Machine*, uvlong*, uvlong*, int),
drawval(Machine*, uvlong*, uvlong*, int),
syscallval(Machine*, uvlong*, uvlong*, int),
@@ -192,6 +197,7 @@ void (*newvaluefn[Nmenu2])(Machine*, uvlong*, uvlong*, int init) = {
loadval,
memval,
swapval,
+ reclaimval,
kernval,
drawval,
syscallval,
@@ -205,7 +211,7 @@ Image *cols[Ncolor][3];
Graph *graph;
Machine *mach;
char *mysysname;
-char argchars[] = "8bcdeEfiIkmlnpstwz";
+char argchars[] = "8bcdeEfiIkmlnprstwz";
int pids[NPROC];
int parity; /* toggled to avoid patterns in textured background */
int nmach;
@@ -465,42 +471,58 @@ readnums(Machine *m, int n, uvlong *a, int spanlines)
int
readswap(Machine *m, uvlong *a)
{
+ static int xxx = 0;
+
if(strstr(m->buf, "memory\n")){
/* new /dev/swap - skip first 3 numbers */
if(!readnums(m, 7, a, 1))
return 0;
- a[0] = a[3];
- a[1] = a[4];
- a[2] = a[5];
- a[3] = a[6];
- a[4] = 0;
- a[5] = 0;
+ a[Mem] = a[3];
+ a[Maxmem] = a[4];
+ a[Swap] = a[5];
+ a[Maxswap] = a[6];
+
+ a[Reclaim] = 0;
+ a[Maxreclaim] = 0;
+ if(m->bufp = strstr(m->buf, "reclaim")){
+ while(m->bufp > m->buf && m->bufp[-1] != '\n')
+ m->bufp--;
+ a[Reclaim] = strtoull(m->bufp, &m->bufp, 10);
+ while(*m->bufp++ == '/')
+ a[Maxreclaim] = strtoull(m->bufp, &m->bufp, 10);
+ }
+
+ a[Kern] = 0;
+ a[Maxkern] = 0;
if(m->bufp = strstr(m->buf, "kernel malloc")){
while(m->bufp > m->buf && m->bufp[-1] != '\n')
m->bufp--;
- a[4] = strtoull(m->bufp, &m->bufp, 10);
+ a[Kern] = strtoull(m->bufp, &m->bufp, 10);
while(*m->bufp++ == '/')
- a[5] = strtoull(m->bufp, &m->bufp, 10);
+ a[Maxkern] = strtoull(m->bufp, &m->bufp, 10);
}
- a[6] = 0;
- a[7] = 0;
+ a[Draw] = 0;
+ a[Maxdraw] = 0;
if(m->bufp = strstr(m->buf, "kernel draw")){
while(m->bufp > m->buf && m->bufp[-1] != '\n')
m->bufp--;
- a[6] = strtoull(m->bufp, &m->bufp, 10);
+ a[Draw] = strtoull(m->bufp, &m->bufp, 10);
while(*m->bufp++ == '/')
- a[7] = strtoull(m->bufp, &m->bufp, 10);
+ a[Maxdraw] = strtoull(m->bufp, &m->bufp, 10);
}
return 1;
}
- a[4] = 0;
- a[5] = 0;
- a[6] = 0;
- a[7] = 0;
+ a[Reclaim] = 0;
+ a[Maxreclaim] = 0;
+ a[Kern] = 0;
+ a[Maxkern] = 0;
+ a[Draw] = 0;
+ a[Maxdraw] = 0;
+
return readnums(m, 4, a, 0);
}
@@ -636,7 +658,7 @@ alarmed(void *a, char *s)
int
needswap(int init)
{
- return init | present[Mmem] | present[Mswap] | present[Mkern] | present[Mdraw];
+ return init | present[Mmem] | present[Mswap] | present[Mreclaim] | present[Mkern] | present[Mdraw];
}
@@ -747,6 +769,15 @@ swapval(Machine *m, uvlong *v, uvlong *vmax, int)
}
void
+reclaimval(Machine *m, uvlong *v, uvlong *vmax, int)
+{
+ *v = m->devswap[Reclaim];
+ *vmax = m->devswap[Maxreclaim];
+ if(*vmax == 0)
+ *vmax = 1;
+}
+
+void
kernval(Machine *m, uvlong *v, uvlong *vmax, int)
{
*v = m->devswap[Kern];
@@ -1327,6 +1358,9 @@ main(int argc, char *argv[])
case 'p':
addgraph(Mtlbpurge);
break;
+ case 'r':
+ addgraph(Mreclaim);
+ break;
case 's':
addgraph(Msyscall);
break;