Advertisement
printing

stress_test_http.pl

Jun 19th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.76 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use IO::Socket;
  4. use Time::HiRes qw(time);
  5. my $host = "127.0.0.1";
  6. my $fout;
  7. my $fres;
  8. main();
  9.  
  10. sub okr2 { return int($_[0] * 100 + 0.5)/100; }
  11. sub s2ms { return okr2( $_[0] * 1000 )}
  12.  
  13. sub get_multiple_url {
  14.     my $url_base = shift;
  15.     my $url_count = shift;
  16.     my $ret = "";
  17.     foreach my $i ( @$url_count ) {
  18.         my $socket = IO::Socket::INET->new(
  19.                 PeerAddr => $host, PeerPort => 80,
  20.                 Proto => 'tcp', Timeout => 10, # only connection timeout
  21.                 ) or die;
  22.         my $req = "GET http://".$host.$url_base. $i ."\r\n\r\n";
  23.         #warn $req;
  24.         print $socket $req or die $!;
  25.         my $data;
  26.         while(read($socket, $data, 1024) > 0) {
  27.             $ret .= $data;
  28.         }
  29.         die unless defined $data; # at least 1 read
  30.         $socket->close();
  31.     }
  32.     return $ret;
  33. }
  34.  
  35.  
  36. sub test
  37. {
  38.     my ($test, $procs, $perproc) = @_;
  39.     # Warm up fcgi and check
  40.     my $url = $test;
  41.     $url = "/cgi/".$url unless $url =~ /\//;
  42.     $url .= "?i=";
  43.     my $r = get_multiple_url($url, [ 0 ]);
  44.     if($r =~ /<title>40[0-9]|404 Not Found|<title>500/) {
  45.         die substr($r, 0, 300);
  46.     }
  47.     return unless $procs and $perproc;
  48.     my @child;
  49.     my $t1 = time;
  50.     for( 1..$procs ) {
  51.         my $pid = fork;
  52.         defined $pid or die $!;
  53.         if($pid) {
  54.             push @child, $pid;
  55.         } else {
  56.             my $r = get_multiple_url($url, [ 1 .. $perproc ]);
  57.             print $fout $r or die $!;
  58.             exit 0;
  59.         }
  60.     }
  61.     foreach ( @child ) {
  62.         waitpid($_,0);
  63.         die "Failed pid ".$_.": ".$? if $?;
  64.     }
  65.     my $t3 = time;
  66.     # 10 exec of curl takes 50ms
  67.     # 10 perl fork takes 2ms
  68.     my $ret = s2ms(($t3 - $t1)/$procs/$perproc);
  69.     my $parsec = int( $procs * $perproc / ($t3 - $t1) + 0.5 );
  70.     my $str = "RES\t".$ret." ms/req x ".$procs." x ".$perproc." = ".s2ms($t3 - $t1)."ms, ".$parsec." req/s\n";
  71.     print $fres $str;
  72.     print $str;
  73.     return $ret;
  74. }
  75.  
  76. sub test_suite {
  77.     #my (undef, $procs, $perproc) = @_;
  78.     #$procs = 2 unless $procs;
  79.     #$perproc = 2 unless $perproc;
  80.  
  81.     my @plan = (
  82.                  ["testC",        20, 32,32],
  83.                  ["test0.cgi",    20, 32,32],
  84.                  ["test0.fcgi",   30, 10,10], # 5x5 both pass w/o apache fork and with fork on multi core
  85.                  ["test3000.cgi", 10, 10,10],
  86.                  ["test3000.fcgi",30, 10,10],
  87.                  ["test10000.cgi",10, 10,10],
  88.                  ["test10000.fcgi",30,10,10]
  89.     );
  90.     foreach ( @plan ) {
  91.         my ($test, $repeats, @params) = @$_;
  92.         print $test." ".join(" x ",$repeats, @params)."\n";
  93.         my @res;
  94.         foreach(1..$repeats)
  95.         {
  96.             push @res, test($test, @params);
  97.         }
  98.         my ($avg, $d) = get_avg_deviation(@res);
  99.         my $str = "PLAN ".$test." ".$params[0]."x".$params[1].": ";
  100.         if($d < $avg/4) {
  101.             $str .= "avg=".okr2($avg)." +-".okr2($d)."ms std deviation; ".$repeats." runs: ".join(" ",@res)."\n";
  102.         } else {
  103.             my @reslow  = grep { $_ < $avg } @res;
  104.             my @reshigh = grep { $_ >=$avg } @res;
  105.             my ($avg1,$d1) = get_avg_deviation(@reslow);
  106.             my ($avg2,$d2) = get_avg_deviation(@reshigh);
  107.             $str .= "avgLow=". okr2($avg1)." +-".okr2($d1)."ms for ".scalar(@reslow)." runs; ".
  108.                     "avgHigh=".okr2($avg2)." +-".okr2($d2)."ms for ".scalar(@reshigh)." runs; ".
  109.                     join(" ",@reslow, @reshigh)."\n";
  110.         }
  111.         print $fres $str;
  112.         print $str;
  113.     }
  114. }
  115. sub get_avg_deviation {
  116.     my @res = @_;
  117.     my $avg = 0; map { $avg += $_ } @res; $avg /= @res;
  118.     my $d = 0; map { $d += ($_ - $avg) ** 2 } @res; $d = sqrt($d / @res);
  119.     return ($avg, $d);
  120.  
  121.     return okr2($avg)." +-".okr2($d)." std deviation; ".scalar(@res)." runs: ".join(" ",@res);
  122. }
  123.  
  124. sub main {
  125.     die $0." test.cgi proc_num perproc" unless @ARGV > 0;
  126.     my $fname = "test.".$ARGV[0];
  127.     $fname =~ s/\/.*\///;
  128.     mkdir "out";
  129.     -d "out" or die;
  130.     open $fout,">", "out/".$fname.int(time) or die $fname.": ".$!;
  131.     open $fres,">>", $fname.".results" or die $!;
  132.  
  133.     if($ARGV[0] eq "--test-suite") {
  134.         test_suite();
  135.     } else {
  136.         test(@ARGV);
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement