之前有一个AnyEvent和Fork写的http压测工具,评论里有大神教导说用Coro控制并发更有效更方便。于是改写了下面的版本。从被压测的nginx server上,可以看到ESTABLISHED的数量确实大大增加,“”并发”两个字算是做到了。

先上普通的Coro::Semaphore控制并发的代码:

# 之前的fork和count部分完全一致,不重复帖了。
sub coro_get {
    my ($count, $urls) = @_;
    my $data;
    my @coros;
    my $semaphore= Coro::Semaphore->new(1);
    my $ua  = FurlX::Coro->new();
    for (1 .. $count) {
        my $url = $urls->[int(rand($#{$urls}+1))];
        push @coros, async {
            my $guard = $semaphore->guard;
            my $res = $ua->get($url);
            $data->{'code'}->{$res->code}++;
        };
    }
    $_->join for @coros;
    return $data;
}

然后贴的是用async_pool的代码,从perldoc来看据说是比async还快一倍。

sub coro_pool_get {
    my ($count, $urls) = @_;
    my $sem = Coro::Semaphore->new( 1 - $Coro::POOL_SIZE );
    my $ua = new FurlX::Coro;
    my $data;
    for( 1 .. $count ){
        my $url = $urls->[int(rand($#{$urls}+1))];
        async_pool { my $res = $ua->get("$url"); $data->{'code'}->{$res->status}++; $sem->up; }; 
    };
    $sem->down;
    return $data;
};

在两个函数中,只要修改$semaphore或者$limit的构造参数,就可以获得并发ESTABLISHED的效果。同样是4核nginx,基本在设置init var为100的情况下,最后整个脚本带来的是3000+的ESTABLISHED,然后可能出现少量的非200响应。