2014-04-20 38 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