2 # Copyright (c) 2002-2003
\r
3 # The President and Fellows of Harvard College.
\r
5 # Redistribution and use in source and binary forms, with or without
\r
6 # modification, are permitted provided that the following conditions
\r
8 # 1. Redistributions of source code must retain the above copyright
\r
9 # notice, this list of conditions and the following disclaimer.
\r
10 # 2. Redistributions in binary form must reproduce the above copyright
\r
11 # notice, this list of conditions and the following disclaimer in the
\r
12 # documentation and/or other materials provided with the distribution.
\r
13 # 3. Neither the name of the University nor the names of its contributors
\r
14 # may be used to endorse or promote products derived from this software
\r
15 # without specific prior written permission.
\r
17 # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
\r
18 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\r
20 # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
\r
21 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
22 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
\r
23 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
\r
24 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
\r
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
\r
26 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
\r
29 # $Id: latency.pl,v 1.8 2003/07/28 14:27:16 ellard Exp $
\r
48 # Bugs: might not recognize the actual response packets. It's an
\r
52 my ($key, $proto, $op, $xid, $client, $now) = @_;
\r
54 my $uxid = "$client-$xid";
\r
56 if ($proto eq 'C3' || $proto eq 'C2') {
\r
57 $PendingOps{$uxid} = $now;
\r
59 elsif (exists $PendingOps{$uxid}) {
\r
60 my $elapsed = $now - $PendingOps{$uxid};
\r
62 $KeysSeen{$key} = 1;
\r
64 $OpTime{"$key,$op"} += $elapsed;
\r
65 $OpCount{"$key,$op"}++;
\r
67 $OpTime{"$key,TOTAL"} += $elapsed;
\r
68 $OpCount{"$key,TOTAL"}++;
\r
70 $OpTime{"$key,INTERESTING"} += $elapsed;
\r
71 $OpCount{"$key,INTERESTING"}++;
\r
73 delete $PendingOps{$uxid};
\r
81 foreach $k ( keys %OpTime ) {
\r
84 foreach $k ( keys %OpCount ) {
\r
92 my $str = "#L time client euid egid fh";
\r
94 foreach my $op ( @OpList ) {
\r
95 $str .= " $op-cnt $op-lat";
\r
103 my ($start_time, $out) = @_;
\r
104 my ($k, $str, $op, $nk, $latms, $cnt);
\r
106 my @allkeys = sort keys %KeysSeen;
\r
108 foreach $k ( @allkeys ) {
\r
109 my $tot = "$k,TOTAL";
\r
111 if ($main::OMIT_ZEROS &&
\r
112 (! exists $OpCounts{$tot} || $OpCounts{$tot} == 0)) {
\r
116 $str = sprintf ("L %s %s", $start_time, &key::key2str ($k));
\r
118 foreach $op ( @OpList ) {
\r
121 if (exists $OpCount{$nk}) {
\r
122 $cnt = $OpCount{"$k,$op"};
\r
129 $latms = 1000 * $OpTime{$nk} / $cnt;
\r
135 $str .= sprintf (" %d %.4f", $cnt, $latms);
\r
138 print $out "$str\n";
\r
142 # Purge all the pending XID records dated earlier than $when (which is
\r
143 # typically at least $PRUNE_INTERVAL seconds ago). This is important
\r
144 # because otherwise missing XID records can pile up, eating a lot of
\r
150 foreach my $uxid ( keys %PendingOps ) {
\r
151 if ($PendingOps{$uxid} < $when) {
\r
152 delete $PendingOps{$uxid};
\r