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.
This commit is contained in:
parent
d3e54ff2d9
commit
b437065950
5 changed files with 85 additions and 29 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -296,6 +296,19 @@ found:
|
|||
return i;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
||||
|
@ -746,6 +768,15 @@ swapval(Machine *m, uvlong *v, uvlong *vmax, int)
|
|||
*vmax = 1;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -1327,6 +1358,9 @@ main(int argc, char *argv[])
|
|||
case 'p':
|
||||
addgraph(Mtlbpurge);
|
||||
break;
|
||||
case 'r':
|
||||
addgraph(Mreclaim);
|
||||
break;
|
||||
case 's':
|
||||
addgraph(Msyscall);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue