Skip to content

Instantly share code, notes, and snippets.

@wogsland
Created August 21, 2014 16:23
Show Gist options
  • Save wogsland/9f331ef9b5bd2241ec82 to your computer and use it in GitHub Desktop.
Save wogsland/9f331ef9b5bd2241ec82 to your computer and use it in GitHub Desktop.
Memcache Connection Tester
#! /usr/bin/perl
# Written by Dormando.
# PUBLIC DOMAIN.
# No guarantees it won't eat your cat.
# From http://consoleninja.net/code/memcached/mc_conn_tester.pl via https://code.google.com/p/memcached/wiki/Timeouts
use warnings;
use strict;
use IO::Socket::INET;
use Time::HiRes qw/time sleep/;
use FindBin;
my $debug = 0;
@ARGV == 0 or @ARGV == 3
or die "Usage: $FindBin::Script [HOST:PORT] [iterations] [timeout]\n";
my $addr = $ARGV[0] || "127.0.0.1:11211";
my $count = $ARGV[1] || 100_000_000;
my $timeout = $ARGV[2] || 1;
my $average_conn = 0;
my $average_set = 0;
my $average_get = 0;
$SIG{INT} = sub {
printf "Averages: (conn: %.8f) (set: %0.8f) (get: %.8f)\n",
$average_conn, $average_set, $average_get;
exit;
};
$|++;
for my $run (1 .. $count) {
my $conn_time = 0;
my $set_time = 0;
my $get_time = 0;
my $start = 0;
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm $timeout;
$start = time();
my $sock = IO::Socket::INET->new(PeerAddr => $addr,
Timeout => $timeout + 1);
die "$!\n" unless $sock;
$conn_time = time();
my $len = length($run);
for (1 .. 3) {
print $sock "set foo 0 0 $len\r\n$run\r\n";
my $res = <$sock>;
}
$set_time = time();
for (1 .. 6) {
print $sock "get foo\r\n";
my $val = <$sock>;
}
$get_time = time();
};
alarm 0;
my $end_time = time();
# Note for this round.
my $conn_elapsed = $conn_time ? ($conn_time - $start) : 0;
my $set_elapsed = $set_time ? ($set_time - $conn_time) : 0;
my $get_elapsed = $get_time ? ($get_time - $set_time) : 0;
my $elapsed = $end_time - $start;
if ($@) {
if ($@ eq "alarm\n") {
printf "Fail: (timeout: $timeout) (elapsed: %.8f) (conn: %.8f)"
. " (set: %0.8f) (get: %.8f)\n", $elapsed, $conn_elapsed,
$set_elapsed, $get_elapsed;
} else {
print "Failed for some other reason: $@ - looping\n";
}
} elsif ($debug) {
printf "loop: (timeout: $timeout) (elapsed: %.8f) (conn: %.8f)"
. " (set: %0.8f) (get: %.8f)\n", $elapsed, $conn_elapsed,
$set_elapsed, $get_elapsed;
}
# Sum up the averages.
if ($conn_elapsed) {
$average_conn += $conn_elapsed;
$average_conn /= 2;
}
if ($set_elapsed) {
$average_set += $set_elapsed;
$average_set /= 2;
}
if ($get_elapsed) {
$average_get += $get_elapsed;
$average_get /= 2;
}
# Sleep a short time inbetween.
sleep 0.1;
}
print "\nDone\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment