213 lines
4.0 KiB
C
213 lines
4.0 KiB
C
#include "stdinc.h"
|
|
#include "dat.h"
|
|
#include "fns.h"
|
|
|
|
int collectstats = 1;
|
|
|
|
/* keep in sync with dat.h:/NStat */
|
|
Statdesc statdesc[NStat] =
|
|
{
|
|
{ "rpc total", },
|
|
{ "rpc reads", },
|
|
{ "rpc reads ok", },
|
|
{ "rpc reads failed", },
|
|
{ "rpc read bytes", },
|
|
{ "rpc read time", },
|
|
{ "rpc read cached", },
|
|
{ "rpc read cached time", },
|
|
{ "rpc read uncached", },
|
|
{ "rpc read uncached time "},
|
|
|
|
{ "rpc writes", },
|
|
{ "rpc writes new", },
|
|
{ "rpc writes old", },
|
|
{ "rpc writes failed", },
|
|
{ "rpc write bytes", },
|
|
{ "rpc write time", },
|
|
{ "rpc write new time", },
|
|
{ "rpc write old time", },
|
|
|
|
{ "lump cache hits", },
|
|
{ "lump cache misses", },
|
|
{ "lump cache reads", },
|
|
{ "lump cache writes", },
|
|
{ "lump cache size", },
|
|
{ "lump cache stall", },
|
|
{ "lump cache read time", },
|
|
|
|
{ "disk cache hits", },
|
|
{ "disk cache misses", },
|
|
{ "disk cache lookups", },
|
|
{ "disk cache reads", },
|
|
{ "disk cache writes", },
|
|
{ "disk cache dirty", },
|
|
{ "disk cache size", },
|
|
{ "disk cache flushes", },
|
|
{ "disk cache stalls", },
|
|
{ "disk cache lookup time", },
|
|
|
|
{ "disk block stalls", },
|
|
{ "lump stalls", },
|
|
|
|
{ "index cache hits", },
|
|
{ "index cache misses", },
|
|
{ "index cache reads", },
|
|
{ "index cache writes", },
|
|
{ "index cache fills", },
|
|
{ "index cache prefetches", },
|
|
{ "index cache dirty", },
|
|
{ "index cache size", },
|
|
{ "index cache flushes", },
|
|
{ "index cache stalls", },
|
|
{ "index cache read time", },
|
|
|
|
{ "bloom filter hits", },
|
|
{ "bloom filter misses", },
|
|
{ "bloom filter false misses", },
|
|
{ "bloom filter lookups", },
|
|
{ "bloom filter ones", },
|
|
{ "bloom filter bits", },
|
|
{ "bloom filter lookup time", },
|
|
|
|
{ "arena block reads", },
|
|
{ "arena block read bytes", },
|
|
{ "arena block writes", },
|
|
{ "arena block write bytes", },
|
|
|
|
{ "isect block reads", },
|
|
{ "isect block read bytes", },
|
|
{ "isect block writes", },
|
|
{ "isect block write bytes", },
|
|
|
|
{ "sum reads", },
|
|
{ "sum read bytes", },
|
|
};
|
|
|
|
QLock statslock;
|
|
Stats stats;
|
|
Stats *stathist;
|
|
int nstathist;
|
|
ulong statind;
|
|
ulong stattime;
|
|
|
|
void
|
|
statsproc(void *v)
|
|
{
|
|
USED(v);
|
|
|
|
for(;;){
|
|
stats.now = time(0);
|
|
stathist[stattime%nstathist] = stats;
|
|
stattime++;
|
|
sleep(1000);
|
|
}
|
|
}
|
|
|
|
void
|
|
statsinit(void)
|
|
{
|
|
nstathist = 90000;
|
|
stathist = MKNZ(Stats, nstathist);
|
|
vtproc(statsproc, nil);
|
|
}
|
|
|
|
void
|
|
setstat(int index, long val)
|
|
{
|
|
qlock(&statslock);
|
|
stats.n[index] = val;
|
|
qunlock(&statslock);
|
|
}
|
|
|
|
void
|
|
addstat(int index, int inc)
|
|
{
|
|
if(!collectstats)
|
|
return;
|
|
qlock(&statslock);
|
|
stats.n[index] += inc;
|
|
qunlock(&statslock);
|
|
}
|
|
|
|
void
|
|
addstat2(int index, int inc, int index1, int inc1)
|
|
{
|
|
if(!collectstats)
|
|
return;
|
|
qlock(&statslock);
|
|
stats.n[index] += inc;
|
|
stats.n[index1] += inc1;
|
|
qunlock(&statslock);
|
|
}
|
|
|
|
void
|
|
printstats(void)
|
|
{
|
|
}
|
|
|
|
void
|
|
binstats(long (*fn)(Stats *s0, Stats *s1, void *arg), void *arg,
|
|
long t0, long t1, Statbin *bin, int nbin)
|
|
{
|
|
long t, xt0, te, v;
|
|
int i, j, lo, hi, m, oj;
|
|
vlong tot;
|
|
Statbin *b;
|
|
|
|
t = stats.now;
|
|
|
|
/* negative times mean relative to now. */
|
|
if(t0 <= 0)
|
|
t0 += t;
|
|
if(t1 <= 0)
|
|
t1 += t;
|
|
/* ten minute range if none given */
|
|
if(t1 <= t0)
|
|
t0 = t1 - 60*10;
|
|
if(0) fprint(2, "stats %ld-%ld\n", t0, t1);
|
|
|
|
/* binary search to find t0-1 or close */
|
|
lo = stattime;
|
|
hi = stattime+nstathist;
|
|
while(lo+1 < hi){
|
|
m = (lo+hi)/2;
|
|
if(stathist[m%nstathist].now >= t0)
|
|
hi = m;
|
|
else
|
|
lo = m;
|
|
}
|
|
xt0 = stathist[lo%nstathist].now;
|
|
if(0) fprint(2, "bsearch found %ld\n", xt0);
|
|
if(xt0 >= t1){
|
|
/* no samples */
|
|
memset(bin, 0, nbin*sizeof bin[0]);
|
|
return;
|
|
}
|
|
|
|
hi = stattime+nstathist;
|
|
te = t0;
|
|
j = lo+1;
|
|
for(i=0; i<nbin; i++){
|
|
t = te;
|
|
te = t0 + (t1-t0)*i/nbin;
|
|
b = &bin[i];
|
|
memset(b, 0, sizeof *b);
|
|
tot = 0;
|
|
oj = j;
|
|
for(; j<hi && stathist[j%nstathist].now<te; j++){
|
|
v = fn(&stathist[(j-1)%nstathist], &stathist[j%nstathist], arg);
|
|
if(b->nsamp==0 || v < b->min)
|
|
b->min = v;
|
|
if(b->nsamp==0 || v > b->max)
|
|
b->max = v;
|
|
tot += v;
|
|
b->nsamp++;
|
|
}
|
|
if(0) fprint(2, "bin%d: %ld to %ld; %d to %d - %d samples\n", i, t, te, oj, j, b->nsamp);
|
|
if(b->nsamp)
|
|
b->avg = tot / b->nsamp;
|
|
if(b->nsamp==0 && i>0)
|
|
*b = bin[i-1];
|
|
}
|
|
}
|