use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
use Parallel::ForkManager;
-use LWP::Simple;
+use LWP::UserAgent;
use Time::HiRes qw(sleep gettimeofday);
usage() if (@ARGV == 0);
'i|inputfile=s' => \ my $file,
'c|concurrency=i' => \ my $concurrency,
'n|loops=i' => \ my $loops,
+ 'd|duration=i' => \ my $duration,
'w|wait=f' => \ my $wait,
) or usage();
$concurrency ||= 1;
$loops ||= 1;
+$duration ||= 0;
$wait ||= 0;
my @urls = file2urls($file) if ($file);
push @urls, @ARGV;
my $num = scalar @urls;
-warn "$num urls with $concurrency clients, $loops loops\n";
-warn "Total: ", $num * $concurrency * $loops, " requests\n";
+my $l = ($duration) ? "$duration seconds loops" : "$loops loops";
+warn "$num urls with $concurrency clients, $l\n";
+warn "Total: ", $num * $concurrency * $loops, " requests\n" if (! $duration);
warn "wait for $wait second between requests\n" if ($wait);
-
+my $ua = LWP::UserAgent->new(
+ ssl_opts => { verify_hostname => 0 },
+);
my $transfer = 0;
my $pm = Parallel::ForkManager->new($concurrency);
$pm->run_on_finish(
);
my ($startsec, $startmicro) = gettimeofday();
-{
+for (my $child = 0; $child < $concurrency; $child++) {
use bytes;
- for (my $child = 0; $child < $concurrency; $child++) {
- if ($pm->start) {
- warn "forks $child/$concurrency child ...\n";
- next;
- }
- my $transfer = 0;
- for (my $i = 0; $i < $loops; $i++) {
- print STDERR "processing $i/$loops loop\r";
- foreach my $url (@urls) {
- my $res = get($url) or print STDERR "\nfail: $url";
- if ($res) {
- $transfer += length($res);
- }
- sleep($wait);
+ if ($pm->start) {
+ # parent
+ warn "forks $child/$concurrency child ...\n";
+ }
+ else {
+ # child
+ my $transfer = 0;
+ my $i = 0;
+ while (1) {
+ if ($duration) {
+ last if (time() - $startsec > $duration);
+ }
+ else {
+ last if ($i >= $loops);
+ }
+
+ print STDERR "processing $i/$loops loop\r";
+ foreach my $url (@urls) {
+ my $res = $ua->get($url);
+ if ($res->is_success) {
+ $transfer += length($res->content);
}
+ else {
+ print STDERR "\nfail: $url";
+ }
+ sleep($wait);
}
+
+ $i++;
+ }
$pm->finish(0, \$transfer);
}
- $pm->wait_all_children;
}
+$pm->wait_all_children;
my ($endsec, $endmicro) = gettimeofday();
my $elapsed = ($endsec - $startsec) + ($endmicro - $startmicro) / 10**6;
my $bytepersec = $transfer / $elapsed;