2014-04-20 4 views
1

안녕하세요, 저는 매우 간단한 HTTP 서버를 만들었고 POE 모듈에 대한 스트레스 테스트 만했습니다.흠, IO :: 비동기도 10k 연결을 처리 할 수 ​​없습니까?

는 여기에 내가 그것을 테스트하는 방법은 다음과 같습니다

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

나는이 10,000 연결에 내가 총 약 1,200 요청을 잃었다 그래서, 피어 메시지가 여러 "연결 재설정"을 참조하십시오 그렇게

.

어쨌든 성능을 향상시킬 수 있습니까? 동일한 서버에서 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 

10,000 개의 동시 연결을 처리하려면 당연히 연결 당 하나 이상의 파일 설명자가 필요합니다. 프로세스에 대한 추가 비용과 부실 항목에 대한 추가 헤드 룸 비용을 고려하면이 값을 약 11k로 설정하는 것이 좋습니다. 지금 서버를 실행할 수있는이 시점에서

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

:

만 루트는 FD 제한을 늘릴 수 있습니다. root로 실행하지 않도록 필요한 UID로 다시 전환하는 것을 잊지 마십시오.

IO::Async을 통해 이렇게 많은 수의 연결을 실행하는 경우 기본 제공되는 poll 또는 select 기반 루프보다 나은 것을 사용하는 것이 좋습니다. 예를 들어 리눅스에서는 linux 루프와 마찬가지로 epoll 루프를 설치하려고하므로 자동으로로드됩니다.

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

ulimit은 10240 (이 스트레스 테스트 이전에 조정 됨)을 보여 주므로 어쨌든 653535로 증가 시켰습니다. – daisy

+0

또한 어떻게 알 수 있습니까? 이 두 모듈이 "선택"되어 있습니까? 나는 그들을 설치했다 – daisy

+0

my $ loop = IO :: Async :: Loop-> new; ref ($ loop) # 당신이 실제로 가지고있는 종류의 루프를 인쇄 할 것입니다. – LeoNerd

관련 문제