2014-04-20 37 views
1

嗨我建立了一个非常简单的HTTP服务器,只做POE模块的压力测试。嗯,IO ::异步甚至不能处理10k连接?

以下是我测试过它:

for x in {1..10000}; do 
    curl xxxxx:12342 --retry-delay 5 --retry 3 -d randombytes$x 
done 

当我这样做,我看到多个“连接重置”的对等消息,所以这个10K的连接我失去了总共约1200请求。

反正有改善它的表现吗?在同一台服务器上测试nginx,在此期间没有更改内核参数,根本没有连接重置消息。

编辑

我已经增加最多的fileno /每用户最大的fileno,前者fs.file-max = 3246455,而后者是10240

附源代码:

use strict; 
use warnings; 
use feature 'say'; 

use Net::Async::HTTP::Server; 
use IO::Async::Loop; 

use HTTP::Request; 
use HTTP::Response; 
use Data::Dumper; 

my $loop = IO::Async::Loop->new(); 

my $httpserver = Net::Async::HTTP::Server->new(
    on_request => sub { 
     my ($self, $req) = @_; 
     my ($code, $result) = (200, "It works\n"); 

     my $response = HTTP::Response->new ($code); 
     $response->add_content ($result); 
     $response->content_type ("application/json"); 
     $response->content_length (length $response->content); 

     $req->respond($response); 
    }, 
); 

$loop->add($httpserver); 

$httpserver->listen(
    addr => { family => "inet", socktype => "stream", port => 8080 }, 
    on_listen_error => sub { die "Cannot listen - $_[-1]\n" }, 
); 

say 'Listening normally on ', 8080; 

$loop->run; 
+0

标签说POE,说明和代码说IO :: Async。我会重复 – LeoNerd

+0

@LeoNerd嗯我只是没有找到io :: async标签,谢谢 – daisy

回答

4

你可能会发现你正在为“每个进程的文件描述符”限制。默认情况下,这是1024

$ ulimit -n 
1024 

如果你要处理10000个并发连接,那么显然你需要每个连接至少一个文件描述符。考虑到这个过程需要额外的一些额外的空间,并且对于过时的空间需要一些额外的空间,你可能希望将其设置为大约11k。

只有root可以增加FD限制:

$ sudo -s 
Password: 
# ulimit -n 11000 
# ulimit -n 
11000 

在这一点上,你现在可以运行你的服务器。 (不要忘记切换回所需的UID,以免以root身份运行)。

当通过IO::Async运行这样一个大量的连接,你可能会想使用的东西比内置pollselect基于循环默认更好。例如,在Linux上,您可能需要安装epoll循环以及linux循环,以便自动加载。

$ cpan IO::Async::Loop::Epoll 
$ cpan IO::Async::Loop::linux 
+0

ulimit显示10240(这是调整之前,这种压力测试),我增加到65535无论如何 – daisy

+0

此外,我怎么知道如果这两个模块是“被选中”的?我有他们安装 – daisy

+0

my $ loop = IO :: Async :: Loop-> new;说ref($ loop)#将打印你实际拥有的循环种类 – LeoNerd