Skip to content

Instantly share code, notes, and snippets.

@skreuzer
Created February 21, 2015 04:19
Show Gist options
  • Save skreuzer/17cdaa24b5fa74d22a1e to your computer and use it in GitHub Desktop.
Save skreuzer/17cdaa24b5fa74d22a1e to your computer and use it in GitHub Desktop.
Measure latency of DNS requests
#!/usr/bin/perl -w
use strict;
use Net::DNS::Resolver;
use Time::HiRes qw(gettimeofday tv_interval);
use Getopt::Long;
my $nameserver;
my $query;
my $duration = 10;
my $type = "A";
my $options = GetOptions
(
"n|ns=s" => \$nameserver,
"q|query=s" => \$query,
"d|duration:i" => \$duration,
"t|type=s" => \$type
);
my @elapsed;
my $i = 0;
my $res = Net::DNS::Resolver->new(nameservers => [$nameserver]);
my $starttime = [gettimeofday];
while((tv_interval($starttime, [gettimeofday])) < $duration) {
my $now = [gettimeofday];
my $query = $res->query($query, $type);
if($query) {
$elapsed[$i] = int(tv_interval($now, [gettimeofday]) * 1000);
$i++;
} else {
print STDERR "OMGWTFBBQ\n";
}
}
my @sorted = sort {$a <=> $b} @elapsed;
my $median;
my $mid = scalar(@elapsed) >> 1;
if ($mid & 1) {
$median = $elapsed[$mid];
} else {
$median = ($elapsed[$mid - .5] + $elapsed[$mid + .5]) / 2;
}
my $average = int mean(\@elapsed);
print "min:$sorted[0] med:$median avg:$average max:$sorted[$#sorted] iter:$i\n";
sub mean {
my ($arrayref) = shift;
my $result;
foreach (@$arrayref) { $result += $_ }
return $result / @$arrayref;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment