diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-01-05 00:52:14 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-01-05 00:52:14 +0100 |
commit | b437065950b5d0234358fcfe8495f6bdb0bf3003 (patch) | |
tree | dbed53ff75256bc401b50cd3b18ad14b321d10c4 /sys/src | |
parent | d3e54ff2d9039c67f6fe7d99349e1c83b696b7ae (diff) |
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.
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/port/devswap.c | 6 | ||||
-rw-r--r-- | sys/src/9/port/portfns.h | 1 | ||||
-rw-r--r-- | sys/src/9/port/segment.c | 13 | ||||
-rw-r--r-- | sys/src/cmd/stats.c | 76 |
4 files changed, 74 insertions, 22 deletions
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; |