aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/srv/stats.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-12 15:23:36 +0000
committerrsc <devnull@localhost>2005-07-12 15:23:36 +0000
commita0d146edd7a7de6236a0d60baafeeb59f8452aae (patch)
treeb55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/stats.c
parent88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff)
downloadplan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip
return of venti
Diffstat (limited to 'src/cmd/venti/srv/stats.c')
-rw-r--r--src/cmd/venti/srv/stats.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/stats.c b/src/cmd/venti/srv/stats.c
new file mode 100644
index 00000000..874f7d27
--- /dev/null
+++ b/src/cmd/venti/srv/stats.c
@@ -0,0 +1,212 @@
+#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];
+ }
+}