plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

stats.c (4014B)


      1 #include "stdinc.h"
      2 #include "dat.h"
      3 #include "fns.h"
      4 
      5 int collectstats = 1;
      6 
      7 /* keep in sync with dat.h:/NStat */
      8 Statdesc statdesc[NStat] =
      9 {
     10 	{ "rpc total", },
     11 	{ "rpc reads", },
     12 	{ "rpc reads ok", },
     13 	{ "rpc reads failed", },
     14 	{ "rpc read bytes", },
     15 	{ "rpc read time", },
     16 	{ "rpc read cached", },
     17 	{ "rpc read cached time", },
     18 	{ "rpc read uncached", },
     19 	{ "rpc read uncached time "},
     20 
     21 	{ "rpc writes", },
     22 	{ "rpc writes new", },
     23 	{ "rpc writes old", },
     24 	{ "rpc writes failed", },
     25 	{ "rpc write bytes", },
     26 	{ "rpc write time", },
     27 	{ "rpc write new time", },
     28 	{ "rpc write old time", },
     29 
     30 	{ "lump cache hits", },
     31 	{ "lump cache misses", },
     32 	{ "lump cache reads", },
     33 	{ "lump cache writes", },
     34 	{ "lump cache size", },
     35 	{ "lump cache stall", },
     36 	{ "lump cache read time", },
     37 
     38 	{ "disk cache hits", },
     39 	{ "disk cache misses", },
     40 	{ "disk cache lookups", },
     41 	{ "disk cache reads", },
     42 	{ "disk cache writes", },
     43 	{ "disk cache dirty", },
     44 	{ "disk cache size", },
     45 	{ "disk cache flushes", },
     46 	{ "disk cache stalls", },
     47 	{ "disk cache lookup time", },
     48 
     49 	{ "disk block stalls", },
     50 	{ "lump stalls", },
     51 
     52 	{ "index cache hits", },
     53 	{ "index cache misses", },
     54 	{ "index cache reads", },
     55 	{ "index cache writes", },
     56 	{ "index cache fills", },
     57 	{ "index cache prefetches", },
     58 	{ "index cache dirty", },
     59 	{ "index cache size", },
     60 	{ "index cache flushes", },
     61 	{ "index cache stalls", },
     62 	{ "index cache read time", },
     63 	{ "index cache lookups" },
     64 	{ "index cache summary hits" },
     65 	{ "index cache summary prefetches" },
     66 
     67 	{ "bloom filter hits", },
     68 	{ "bloom filter misses", },
     69 	{ "bloom filter false misses", },
     70 	{ "bloom filter lookups", },
     71 	{ "bloom filter ones", },
     72 	{ "bloom filter bits", },
     73 
     74 	{ "arena block reads", },
     75 	{ "arena block read bytes", },
     76 	{ "arena block writes", },
     77 	{ "arena block write bytes", },
     78 
     79 	{ "isect block reads", },
     80 	{ "isect block read bytes", },
     81 	{ "isect block writes", },
     82 	{ "isect block write bytes", },
     83 
     84 	{ "sum reads", },
     85 	{ "sum read bytes", },
     86 
     87 	{ "cig loads" },
     88 	{ "cig load time" },
     89 };
     90 
     91 QLock statslock;
     92 Stats stats;
     93 Stats *stathist;
     94 int nstathist;
     95 ulong statind;
     96 ulong stattime;
     97 
     98 void
     99 statsproc(void *v)
    100 {
    101 	USED(v);
    102 
    103 	for(;;){
    104 		stats.now = time(0);
    105 		stathist[stattime%nstathist] = stats;
    106 		stattime++;
    107 		sleep(1000);
    108 	}
    109 }
    110 
    111 void
    112 statsinit(void)
    113 {
    114 	nstathist = 90000;
    115 	stathist = MKNZ(Stats, nstathist);
    116 	vtproc(statsproc, nil);
    117 }
    118 
    119 void
    120 setstat(int index, long val)
    121 {
    122 	qlock(&statslock);
    123 	stats.n[index] = val;
    124 	qunlock(&statslock);
    125 }
    126 
    127 void
    128 addstat(int index, int inc)
    129 {
    130 	if(!collectstats)
    131 		return;
    132 	qlock(&statslock);
    133 	stats.n[index] += inc;
    134 	qunlock(&statslock);
    135 }
    136 
    137 void
    138 addstat2(int index, int inc, int index1, int inc1)
    139 {
    140 	if(!collectstats)
    141 		return;
    142 	qlock(&statslock);
    143 	stats.n[index] += inc;
    144 	stats.n[index1] += inc1;
    145 	qunlock(&statslock);
    146 }
    147 
    148 void
    149 printstats(void)
    150 {
    151 }
    152 
    153 void
    154 binstats(long (*fn)(Stats *s0, Stats *s1, void *arg), void *arg,
    155 	long t0, long t1, Statbin *bin, int nbin)
    156 {
    157 	long xt0, t, te, v;
    158 	int i, j, lo, hi, m;
    159 	vlong tot;
    160 	Statbin *b;
    161 
    162 	t = stats.now;
    163 
    164 	/* negative times mean relative to now. */
    165 	if(t0 <= 0)
    166 		t0 += t;
    167 	if(t1 <= 0)
    168 		t1 += t;
    169 	/* ten minute range if none given */
    170 	if(t1 <= t0)
    171 		t0 = t1 - 60*10;
    172 	if(0) fprint(2, "stats %ld-%ld\n", t0, t1);
    173 
    174 	/* binary search to find t0-1 or close */
    175 	lo = stattime;
    176 	hi = stattime+nstathist;
    177 	while(lo+1 < hi){
    178 		m = (lo+hi)/2;
    179 		if(stathist[m%nstathist].now >= t0)
    180 			hi = m;
    181 		else
    182 			lo = m;
    183 	}
    184 	xt0 = stathist[lo%nstathist].now;
    185 	if(xt0 >= t1){
    186 		/* no samples */
    187 		memset(bin, 0, nbin*sizeof bin[0]);
    188 		return;
    189 	}
    190 
    191 	hi = stattime+nstathist;
    192 	j = lo+1;
    193 	for(i=0; i<nbin; i++){
    194 		te = t0 + (t1-t0)*i/nbin;
    195 		b = &bin[i];
    196 		memset(b, 0, sizeof *b);
    197 		tot = 0;
    198 		for(; j<hi && stathist[j%nstathist].now<te; j++){
    199 			v = fn(&stathist[(j-1)%nstathist], &stathist[j%nstathist], arg);
    200 			if(b->nsamp==0 || v < b->min)
    201 				b->min = v;
    202 			if(b->nsamp==0 || v > b->max)
    203 				b->max = v;
    204 			tot += v;
    205 			b->nsamp++;
    206 		}
    207 		if(b->nsamp)
    208 			b->avg = tot / b->nsamp;
    209 		if(b->nsamp==0 && i>0)
    210 			*b = bin[i-1];
    211 	}
    212 }