[code] #!/usr/bin/perl -w use LWP::Parallel::UserAgent; use Time::HiRes qw(gettimeofday tv_interval); use strict; ### # Configuration ### my $nof_parallel_connections = 1; my $nof_requests_total = 1; my $timeout = 10; my $maxurls = 2; my @urls; my @tmpurls; my $linkadressen = "links.dat"; my $cnt=0; my $zufall; ################################################## # Derived Class for latency timing ################################################## package MyParallelAgent; @MyParallelAgent::ISA = qw(LWP::Parallel::UserAgent); use strict; ## zufaellige url auswahl open(TXT,$linkadressen); while () { push (@tmpurls, $_); #packe alle urls aus der textdatei in das array @tmpurls } close (TXT); while ($cnt < $maxurls) { $zufall = int(rand(@tmpurls +1)); #print "<<< $zufall >>>\n"; push (@urls, ($tmpurls[$zufall])); #suche zufaellig eine url aus dem array und haenge das in die url liste $cnt++; } ### # Is called when connection is opened ### sub on_connect { my ($self, $request, $response, $entry) = @_; $self->{__start_times}->{$entry} = [Time::HiRes::gettimeofday]; } ### # Are called when connection is closed ### sub on_return { my ($self, $request, $response, $entry) = @_; my $start = $self->{__start_times}->{$entry}; $self->{__latency_total} += Time::HiRes::tv_interval($start); } sub on_failure { on_return(@_); # Same procedure } ### # Access function for new instance var ### sub get_latency_total { return shift->{__latency_total}; } ################################################## package main; ################################################## ### # Init parallel user agent ### my $ua = MyParallelAgent->new(); $ua->agent("pounder/1.0"); $ua->max_req($nof_parallel_connections); $ua->redirect(0); # No redirects ### # Register all requests ### foreach (1..$nof_requests_total) { foreach my $url (@urls) { my $request = HTTP::Request->new('GET', $url); $ua->register($request); } } ### # Launch processes and check time ### my $start_time = [gettimeofday]; my $results = $ua->wait($timeout); my $total_time = tv_interval($start_time); ### # Requests all done, check results ### my $succeeded = 0; my %errors = (); foreach my $entry (values %$results) { my $response = $entry->response(); if($response->is_success()) { $succeeded++; # Another satisfied customer } else { # Error, save the message $response->message("TIMEOUT") unless $response->code(); $errors{$response->message}++; } } ### # Format errors if any from %errors ### my $errors = join(',', map "$_ ($errors{$_})", keys %errors); $errors = "NONE" unless $errors; ### # Format results ### #@urls = map {($_,".")} @urls; my @P = ( "URL(s)" => join("\n\t\t ", @urls), "Total Requests" => $nof_requests_total * @urls, "Parallel Agents" => $nof_parallel_connections * @urls, "Succeeded" => sprintf("$succeeded (%.2f%%)\n", $succeeded * 100 / ( $nof_requests_total * @urls ) ), "Errors" => $errors, "Total Time" => sprintf("%.2f secs\n", $total_time), "Throughput" => sprintf("%.2f Requests/sec\n", ( $nof_requests_total * @urls ) / $total_time), "Latency" => sprintf("%.2f secs/Request", ($ua->get_latency_total() || 0) / ( $nof_requests_total * @urls ) ), ); my ($left, $right); ### # Print out statistics ### format STDOUT = @<<<<<<<<<<<<<<< @* "$left:", $right . while(($left, $right) = splice(@P, 0, 2)) { write;