Skip to content

Instantly share code, notes, and snippets.

@yuryu
Last active June 2, 2021 21:52
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save yuryu/7264293 to your computer and use it in GitHub Desktop.
Save yuryu/7264293 to your computer and use it in GitHub Desktop.
ELB Warm-up tool
#!perl
use strict;
use warnings;
use Parallel::ForkManager;
use POSIX;
use String::Random;
my $c_start = 1;
my $c_end = 64;
my $interval = 10 * 60;
my $delta = 1.25;
my $user = 'ec2-user';
my @hosts = ('ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com', 'ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com');
my $nhosts = scalar @hosts;
my $url = 'http://ELB-ADDESS.us-east-1.elb.amazonaws.com/1m';
my $nrequests = 100;
sub ab {
my ($host, $concurrency, $requests, $url) = @_;
my $command = "/usr/bin/ab -c $concurrency -n $requests $url";
print "EXEC[$host] $command\n";
system("ssh", "$user\@$host", $command);
}
my $pm = new Parallel::ForkManager($nhosts);
our @pids;
$SIG{TERM} = $SIG{INT} = sub {
kill 'TERM', @pids;
$pm->wait_all_children;
};
foreach my $host (@hosts) {
my $pid = $pm->start;
if($pid) {
# parent
unshift @pids, $pid;
next;
}
# child
$SIG{TERM} = $SIG{INT} = sub { $pm->finish };
my $start = time;
my $c = $c_start;
srand(time ^ ($$ + ($$ << 15)));
my $rs = new String::Random;
while(1) {
if(time - $start > $interval) {
$c = ceil($c * $delta);
$c = $c_end if $c > $c_end;
$start = time;
}
ab($host, $c, $nrequests, $url . "?" . $rs->randregex('[a-zA-Z0-9]{16}'));
}
$pm->finish;
}
$pm->wait_all_children;
@yuryu
Copy link
Author

yuryu commented Nov 1, 2013

1m っていうのは 1MB のダミーファイルです。

@matsubo
Copy link

matsubo commented Mar 20, 2014

+1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment