set editor to 'vim'
[lab.git] / misc / httpbench.pl
index 6f2e04d..5fdd9fb 100755 (executable)
@@ -6,7 +6,7 @@ use utf8;
 
 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);
@@ -16,6 +16,7 @@ GetOptions(
     '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();
 
@@ -23,17 +24,21 @@ usage() if $help;
 
 $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(
@@ -46,28 +51,42 @@ $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;