#!/usr/sbin/dtrace -qs self long t; self string sc; /* name of syscall */ int report; long t0; BEGIN{ t0 = timestamp; test[1] = "Writing with putc()"; test[2] = "Writing intelligently"; test[3] = "Rewriting"; test[4] = "Reading with getc"; test[5] = "Reading intelligently"; test[6] = "Create files in sequential order"; test[7] = "Stat files in sequential order"; test[8] = "Delete files in sequential order"; test[9] = "Create files in random order"; test[10] = "Stat files in random order"; test[11] = "Delete files in random order"; } syscall:::entry /(execname=="bonnie++") && self->trace == 0/{ self->trace = 1; self->sc = probefunc; self->t = timestamp; } syscall:::return /(execname=="bonnie++") && self->trace == 0/{ self->trace = 1; self->sc = execname; self->t = timestamp; } syscall:::entry /self->trace/ { @a[self->sc]=sum(timestamp-self->t); @aa[pid, self->sc]=sum(timestamp-self->t); self->t=timestamp; self->sc=probefunc; @b[self->sc]=count(); @bb[pid, self->sc]=count(); } syscall:::return /self->trace/ { @a[self->sc]=sum(timestamp-self->t); @aa[pid, self->sc]=sum(timestamp-self->t); self->t=timestamp; self->sc=execname; /* syscall == bonnie++ */ } off-cpu/self->trace/ { @a[self->sc]=sum(timestamp-self->t); @aa[pid, self->sc]=sum(timestamp-self->t); self->t=timestamp; } on-cpu/self->trace/ { @a[self->sc]=sum(timestamp-self->t); @aa[pid, self->sc]=sum(timestamp-self->t); @c[self->sc]=sum(timestamp-self->t); @cc[pid, self->sc ]=sum(timestamp-self->t); self->t=timestamp; } /* * Our cue to start reporting. * Decrement_and_wait is run by main bonnie after each test * except the last one */ pid$target::_ZN12CGlobalItems18decrement_and_waitEi:entry, pid$target::_Z10TestDirOpsiiiiR12CGlobalItems:return/report > 0/ { normalize(@a,1000000); /* nanosec to msec */ normalize(@c,1000000); trunc(@a,10); trunc(@b,10); trunc(@c,10); printf("\n"); printf("Run [%s] took: %d ms elapse\n\n",test[report],((timestamp-t0)>>20)); printf("%12s %12s %12s %12s\n","syscall","count","elapse ms", "wait"); printa("%12s %@12d %@12d (%@12d ) \n",@b,@a,@c); clear(@a); clear(@b); clear(@c); t0=timestamp; report++; } /* Our cue to start accounting */ pid$target::_ZN12CGlobalItems18decrement_and_waitEi:entry/report == 0/ { report = 1; clear(@a); clear(@b); clear(@c); t0=timestamp; } END{ normalize(@aa,1000000); normalize(@cc,1000000); trunc(@aa,20); trunc(@bb,20); trunc(@cc,20); printf("%12s %12s %12s (%12s) %12s \n","pid", "syscall", "Count", "elapse", "wait"); printa("%12d %12s %@12d (%@12d) %@10d \n", @bb, @aa, @cc); }