Perl-скрипт с AnyEvent работает недостаточно быстро

Вот небольшой скрипт, который я создал для выполнения HTTP-транзакций из файла со списком URL-адресов. Проблема в том, что он не может выполнять HTTP-транзакции так быстро, как мне бы хотелось. Точнее, я установил скорость в 200 / секунд, но она могла отправлять только около 50 в секунду. Сервер достаточно мощный, чтобы обрабатывать 100 / секунду.

Он был запущен на мощном ПК с процессором E5-1650 и 64 ГБ оперативной памяти под рабочим столом Ubuntu 14.04. Когда скрипт выполняется, загрузка процессора составляет всего около 12%. Команда, которую я использовал, была perl httpStresser.pl urlList rate 200,

Есть идеи почему?

use AnyEvent;
use EV;
use AnyEvent::HTTP;
use AnyEvent::Handle;
use Time::HiRes qw( gettimeofday );
my $expectedRespCode = 200;
my $rate = 1;
my @urls = ();
readUrls(shift);
my $numOfUrls = $#urls;
my $start = time();
my $printed = 0; #have we printed the completion msg.
my $gId = 0;

my $spawned;
my @ctx = ();
my $i;

for ($i=0; $i<=$#ARGV; $i++) {
    if ($ARGV[$i] =~ /^expect/) {
        $expectedRespCode = $ARGV[$i+1];
        $i++;
    } elsif ($ARGV[$i] =~ /^rate/) {
        $rate = $ARGV[$i+1];
        print "rate is now $rate\n";
        $i++;
    } elsif ($ARGV[$i] =~ /^skip/) {
        $gId = $ARGV[$i+1];
        $i++;
    } else {
        die "only max, stayup are supported\n";
    } 
}
my $spawned = 0;
my $w = AnyEvent->condvar;
$| = 1;
my $start = getTS();
my $_timer;
$_timer = AnyEvent->timer(after => 0, interval => 0.001, cb => ::timeoutHandler);
$w->recv;

sub kickoff {
    my $id = $gId ++;
    if ($id > $numOfUrls) { 
        if ($printed == 0) {
            print "done!!\n"; $printed = 1;
        }
        return;
    }
    #print "$id\n";
    http_get $urls[$id], headers => { }, sub { 
        my $statusCode = $_[1]->{Status};
        #printf "status $statusCode %d\n", time() - $start;
        if (($id % 100) == 0) {
            print "$id\n";
        }
        if ($statusCode != $expectedRespCode) {
            print "unexpected resp code $id:$statusCode $urls[$id]\n";
        }
    };
}

sub timeoutHandler {
    #print time(), "|\n";
    if (! defined $start) {
        $start = getTS(); kickoff(); $spawned = 1; return;
    }
    my $delta = getTS() - $start;
    my $target = $delta * $rate;
    #printf "%.4f %4d $spawned\n", $delta, $target;
    for (; $spawned <= $target; $spawned++) {
        kickoff();
    }
    if ($delta >= 1.0 ) {
        $start += 1.0; $spawned = 0;
    }
}

sub readUrls {
    my $fname = shift;
    my $line;
    open FD, $fname || die "Failed to open $fname $!\n";
    while (<FD>) {
        chomp($line = $_);
        push @urls, $line;
    }
    close FD;
}

sub getTS {
    my ($seconds, $microseconds) = gettimeofday;
    return $seconds + (0.0+ $microseconds)/1000000.0;
}

0 ответов

Другие вопросы по тегам