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 }