G'Day Folks, On Fri, Jan 18, 2008 at 04:52:58PM -0500, Bryan Cantrill wrote: > > On Fri, Jan 18, 2008 at 04:33:17PM -0500, Colin Burgess wrote: > > I see Intel has released a new tool. Oh, it requires some patches to > > the kernel to record > > latency times. Good thing people don't mind patching their kernels, eh? > > > > So who can write the equivalent latencytop.d the fastest? ;-) > > Brendan, I'm sure -- if he hasn't by the time I'm writing this...
Aw, come on - I've barely had half an hour since I saw the message - couldn't you have waited a bit longer before tempting me to reply? :) It has about 40 statically defined trace points and I've coded 8 so far. A bunch of these are specific to Linux, so I'd need to think of what was the closest useful match for Solaris. Anyway, here's where I'm at: # ./latencytop.d Tracing... Hit Ctrl-C to end. Cause Count Maximum Average mutex lock 10 80 usec 30 usec Reading from file 450 22822 usec 1900 usec Cause Count Maximum Average mutex lock 2 11 usec 10 usec Reading from file 474 26716 usec 1836 usec Cause Count Maximum Average mutex lock 2 85 usec 48 usec Reading from file 392 29972 usec 2312 usec Cause Count Maximum Average mutex lock 19 1379 usec 574 usec Writing to file 162 43011 usec 1655 usec Reading from file 302 80847 usec 2945 usec Cause Count Maximum Average mutex lock 1 8 usec 8 usec Reading from file 468 22978 usec 1813 usec [...] Yes, I added a "Count" column since it proved of limited use without one. Of course, bounding this to Count/Maximum/Average is also of limited use - I'd really like to include distribution plots as well. Source so far is (hot off the keyboard, so beware of typos): -------------------------------------------------------------- #!/usr/sbin/dtrace -Cs #pragma D option quiet #define RW_READER 0x1 dtrace:::BEGIN { printf("Tracing... Hit Ctrl-C to end.\n"); } /* * Reading from file * Writing to file */ io:::start { start[args[0]->b_edev, args[0]->b_blkno] = timestamp; } io:::done /start[args[0]->b_edev, args[0]->b_blkno]/ { this->delta = timestamp - start[args[0]->b_edev, args[0]->b_blkno]; this->cause = args[0]->b_flags & B_READ ? "Reading from file" : "Writing to file"; @lcount[this->cause] = count(); @lmax[this->cause] = max(this->delta); @lavg[this->cause] = avg(this->delta); } /* * mutex lock */ lockstat:::adaptive-block { @lcount["mutex lock"] = count(); @lmax["mutex lock"] = max(arg1); @lavg["mutex lock"] = avg(arg1); } /* * rwsem read lock * rwsem write lock */ lockstat:::rw-block { this->cause = arg2 == RW_READER ? "rwsem read lock" : "rwsum write lock"; @lcount[this->cause] = count(); @lmax[this->cause] = max(arg1); @lavg[this->cause] = avg(arg1); } /* * Unlinking file */ syscall::unlink:entry { self->start_unlink = timestamp; } syscall::unlink:return /self->start_unlink/ { this->delta = timestamp - self->start_unlink; @lcount["Unlink file"] = count(); @lmax["Unlink file"] = max(this->delta); @lavg["Unlink file"] = avg(this->delta); self->start_unlink = 0; } /* * sync system call */ syscall::syssync:entry { self->start_syssync = timestamp; } syscall::syssync:return /self->start_syssync/ { this->delta = timestamp - self->start_syssync; @lcount["sync system call"] = count(); @lmax["sync system call"] = max(this->delta); @lavg["sync system call"] = avg(this->delta); self->start_syssync = 0; } /* * fsync system call */ syscall::fdsync:entry { self->start_fdsync = timestamp; } syscall::fdsync:return /self->start_fdsync/ { this->delta = timestamp - self->start_fdsync; @lcount["fsync system call"] = count(); @lmax["fsync system call"] = max(this->delta); @lavg["fsync system call"] = avg(this->delta); self->start_fdsync = 0; } /* * Print output summary */ profile:::tick-1s, dtrace:::END { normalize(@lmax, 1000); normalize(@lavg, 1000); printf(" %-32s %12s %14s %14s\n", "Cause", "Count", "Maximum", "Average"); printa(" %-32s [EMAIL PROTECTED] [EMAIL PROTECTED] usec [EMAIL PROTECTED] usec\n", @lcount, @lmax, @lavg); printf("\n"); trunc(@lcount); trunc(@lmax); trunc(@lavg); } -------------------------------------------------------------- I'll add some more later - I have other work to be doing right now. :) If anyone would like to work on some of the other metrics, please do and post the bits here. > (Of course, that said it's a pretty lame tool. Isn't obvious that this > is providing such paltry information that it's raising more questions than > answers? Fine, better than nothing -- but not much better...) Yes, not that impressive. Although getting customers to look and think about latency is certainly worthwhile, and the start of the road to DTrace. Brendan -- Brendan [CA, USA] _______________________________________________ dtrace-discuss mailing list dtrace-discuss@opensolaris.org