#!/usr/bin/perl -w # # dnscachedist.pl version 0.92 # # 2001/04/29 0.9 - First Release # 2001/04/29 0.91 - Handles extremes and is configurable # 2001/04/30 0.92 - Fixes variable re-use bug # # This program is Copyright (C) 2001, FibreSpeed Inc. # It was authored by Michael T. Babcock # It is released under the GPL version 2. # # Note: inspired by a similar program in PHP by Florin Andrei # use strict; my $DETAILS=0; # Be very verbose my $SUBMIN=0.0; # Minimum to consider my $SUBVAL1=1.0; # Keep sub-second stats below this many seconds my $SUBVAL2=10.0; # Keep per-second stats up to this many seconds my %query; my @subdiffs; my @secdiffs; my $querycnt = 0; while () { /@.*(\w{16}) (query|sent) (\d+) / or next; my $tai64n = $1; my $action = $2; my $querynum = $3; if ($action eq "query") { $query{$querynum} = $tai64n; } else { if ($query{$querynum}) { my $diff = tai64ndiff($query{$querynum}, $tai64n); $DETAILS && print "Query #$querynum done in $diff seconds.\n"; $querycnt++; if ($diff < $SUBMIN) { $subdiffs[int($SUBMIN*100)]++; } elsif ($diff < $SUBVAL1) { $subdiffs[int($diff*100)]++; } elsif ($diff > $SUBVAL2) { $secdiffs[int($SUBVAL2)]++; } else { $secdiffs[int($diff)]++; } } else { $DETAILS && print "Unknown query #$querynum.\n"; } } } print "Secs Count Percent Overall\n"; my $i = 0; my $percent; my $totpercent; for ($i = int($SUBMIN*100); $i < int($SUBVAL1*100); $i++) { $subdiffs[$i] or next; $percent=($subdiffs[$i]/$querycnt)*100; $totpercent+=$percent; printf "%.2f: %4d %5.2f%% %5.1f%%", ($i/100), $subdiffs[$i], $percent, $totpercent; print "\n"; } for ($i = int($SUBVAL1); $i < int($SUBVAL2); $i++) { $secdiffs[$i] or next; $percent=($secdiffs[$i]/$querycnt)*100; $totpercent+=$percent; printf "%4d: %4d %5.2f%% %5.1f%%", $i, $secdiffs[$i], $percent, $totpercent; print "\n"; } print "$SUBVAL2 or more seconds: ".$secdiffs[int($SUBVAL2)]."\n"; sub tai64ndiff { my $val1 = shift(@_); my $val2 = shift(@_); my $sec1 = substr($val1, 0, 8); my $sub1 = substr($val1, 8, 8); my $sec2 = substr($val2, 0, 8); my $sub2 = substr($val2, 8, 8); # print "sec1: $sec1 sec2: $sec2\n"; # print "sub1: $sub1 sub2: $sub2\n"; $sec1 = hex $sec1; $sec2 = hex $sec2; $sub1 = hex $sub1; $sub2 = hex $sub2; $val1 = $sec1 + ($sub1 / 1000000000.0); $val2 = $sec2 + ($sub2 / 1000000000.0); return $val2 - $val1; }