2011-09-13 17:48:33 +00:00
|
|
|
#!/usr/sbin/dtrace -qs
|
|
|
|
/*
|
2012-11-14 20:13:24 +00:00
|
|
|
* Copyright (c) 2011, 2012 Oracle and/or its affiliates. All rights reserved.
|
2011-09-13 17:48:33 +00:00
|
|
|
*
|
|
|
|
* cache.d - Display DB cache activity
|
|
|
|
*
|
|
|
|
* usage: cache.d { -p <pid> | -c "<program> [<args]" } \
|
|
|
|
* [interval=1#seconds)] [iterations=60] [delay #seconds]
|
|
|
|
*
|
|
|
|
* For each 'interval' seconds display overall and per-file cache stats:
|
|
|
|
* hits
|
|
|
|
* misses
|
|
|
|
* evictions
|
|
|
|
* Empty lines are displayed when nothing happened for that file & counter
|
|
|
|
* during that interval.
|
|
|
|
*
|
|
|
|
* The delay parameter delays the start of sampling until that many
|
|
|
|
* seconds have passed.
|
|
|
|
*
|
|
|
|
* Static probes used:
|
|
|
|
* mpool-miss(unsigned misses, char *file, unsigned pgno)
|
|
|
|
* mpool-hit(unsigned hits, char *file, unsigned pgno)
|
|
|
|
* mpool-evict(char *file, unsigned pgno, BH *buf)
|
|
|
|
*/
|
|
|
|
#pragma D option defaultargs
|
|
|
|
|
|
|
|
dtrace:::BEGIN
|
|
|
|
{
|
|
|
|
interval = $1 != 0 ? $1 : 10;
|
|
|
|
maxtick = $2 != 0 ? $2 : 60;
|
|
|
|
warmup = $3 != 0 ? $3 : 0;
|
|
|
|
hits = misses = evictions = 0;
|
|
|
|
secs = interval;
|
|
|
|
|
|
|
|
tick = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* mpool-miss(unsigned misses, char *file, unsigned pgno)
|
|
|
|
*/
|
|
|
|
bdb$target:::mpool-miss
|
|
|
|
/tick >= warmup/
|
|
|
|
{
|
|
|
|
misses++;
|
|
|
|
@misses[/*arg1 == 0 ? "<null!>" : */copyinstr(arg1)] = count();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* mpool-hit(unsigned hits, char *file, unsigned pgno) */
|
|
|
|
bdb$target:::mpool-hit
|
|
|
|
/tick >= warmup/
|
|
|
|
{
|
|
|
|
hits++;
|
|
|
|
@hits[arg1 == 0 ? "<null!>" : copyinstr(arg1)] = count();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* mpool-evict(char *file, unsigned pgno, BH *buf */
|
|
|
|
bdb$target:::mpool-evict
|
|
|
|
/tick >= warmup/
|
|
|
|
{
|
|
|
|
evictions++;
|
|
|
|
@evictions[arg0 == 0 ? "<null!>" : copyinstr(arg0)] = count();
|
|
|
|
}
|
|
|
|
|
|
|
|
profile:::tick-1sec
|
|
|
|
{
|
|
|
|
tick++;
|
|
|
|
secs--;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Print a banner when starting the measurement period.
|
|
|
|
*/
|
|
|
|
profile:::tick-1sec
|
|
|
|
/tick == warmup/
|
|
|
|
{
|
|
|
|
printf("Cache info: %8s %8s %8s starting @ %Y\n", "hits", "misses",
|
|
|
|
"evictions", walltimestamp);
|
|
|
|
secs = interval;
|
|
|
|
}
|
|
|
|
|
|
|
|
profile:::tick-1sec
|
|
|
|
/secs == 0 && tick >= warmup/
|
|
|
|
{
|
|
|
|
printf(" %6d %8d %8d %8d\n", tick, hits, misses, evictions);
|
|
|
|
hits = misses = evictions = 0;
|
|
|
|
printa("Hits for %20s %@u\n", @hits);
|
|
|
|
printa("Misses for %20s %@u\n", @misses);
|
|
|
|
printa("Evictions for %20s %@u\n", @evictions);
|
|
|
|
trunc(@hits);
|
|
|
|
trunc(@misses);
|
|
|
|
trunc(@evictions);
|
|
|
|
secs = interval;
|
|
|
|
}
|
|
|
|
|
|
|
|
profile:::tick-1sec
|
|
|
|
/tick == maxtick/
|
|
|
|
{
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
dtrace:::END
|
|
|
|
{
|
|
|
|
printf("\n");
|
|
|
|
printa("Hits for %20s %@u\n", @hits);
|
|
|
|
printa("Misses for %20s %@u\n", @misses);
|
|
|
|
printa("Evictions for %20s %@u\n", @evictions);
|
|
|
|
}
|