ref: 163dccbac04a3c9ab132005ebb4a96a0e0baec0b
dir: /sys/src/cmd/venti/srv/clumpstats.c/
#include "stdinc.h" #include "dat.h" #include "fns.h" int count[VtMaxLumpSize][VtMaxType]; Config conf; enum { ClumpChunks = 32*1024 }; static int readarenainfo(Arena *arena) { ClumpInfo *ci, *cis; u32int clump; int i, n, ok; if(arena->memstats.clumps) fprint(2, "reading directory for arena=%s with %d entries\n", arena->name, arena->memstats.clumps); cis = MKN(ClumpInfo, ClumpChunks); ok = 0; for(clump = 0; clump < arena->memstats.clumps; clump += n){ n = ClumpChunks; if(n > arena->memstats.clumps - clump) n = arena->memstats.clumps - clump; if((i=readclumpinfos(arena, clump, cis, n)) != n){ seterr(EOk, "arena directory read failed %d not %d: %r", i, n); ok = -1; break; } for(i = 0; i < n; i++){ ci = &cis[i]; if(ci->type >= VtMaxType || ci->uncsize >= VtMaxLumpSize) { fprint(2, "bad clump: %d: type = %d: size = %d\n", clump+i, ci->type, ci->uncsize); continue; } count[ci->uncsize][ci->type]++; } } free(cis); if(ok < 0) return TWID32; return clump; } static void clumpstats(Index *ix) { int ok; ulong clumps, n; int i, j, t; ok = 0; clumps = 0; for(i = 0; i < ix->narenas; i++){ n = readarenainfo(ix->arenas[i]); if(n == TWID32){ ok = -1; break; } clumps += n; } if(ok < 0) return; print("clumps = %ld\n", clumps); for(i=0; i<VtMaxLumpSize; i++) { t = 0; for(j=0; j<VtMaxType; j++) t += count[i][j]; if(t == 0) continue; print("%d\t%d", i, t); for(j=0; j<VtMaxType; j++) print("\t%d", count[i][j]); print("\n"); } } void usage(void) { fprint(2, "usage: clumpstats [-B blockcachesize] config\n"); threadexitsall(0); } void threadmain(int argc, char *argv[]) { u32int bcmem; bcmem = 0; ARGBEGIN{ case 'B': bcmem = unittoull(ARGF()); break; default: usage(); break; }ARGEND readonly = 1; if(argc != 1) usage(); if(initventi(argv[0], &conf) < 0) sysfatal("can't init venti: %r"); if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16)) bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16); if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem); initdcache(bcmem); clumpstats(mainindex); threadexitsall(0); }