2011-07-20 6 views
5

Iセットアップこのような迅速なMojoliciousのサーバー:Perl Mojolicious - 一度に複数の接続を処理する方法

use Mojolicious::Lite; 

get '/' => sub { 
    my $self = shift; 

    sleep 5; #sleep here, I'm testing multiple connections at once 

    $self->render_text('Hello World!'); 
}; 

app->start; 

私は、その後でそれを起動します。

time curl https://127.0.0.1:3000/ -k

それはそうです:perl Mojolicious.pl daemon --listen=https://127.0.0.1:3000

問題は、私は同時に、このコマンドを実行した場合、あります一度に複数のリクエストを作成すると、5秒以上の時間がかかります。あたかもキューイングされているかのようです。

ここに何か不足していますか?私はMojolicousを使用したいと思っていますが、一度に複数のクライアントを処理できる場合に限ります。

答えて

9

mojo daemonは、本番用ではなく開発用のスタンドアロンHTTPサーバーであり、単一のスレッドのみを実行します。生産のために私はファインマニュアルを読むことをお勧めしますfastcgiオプションおよびFastCGI支持ウェブサーバを使用するか、またはStarmanまたはStarletまたはPlack::Handler::FCGIまたはFastpassのような素敵なPSGI互換サーバーをインストールして

plackup -s Starman --port 3000 Mojolicious.pl 
+0

私はこれをたとえばApacheで実行するように設定しています。それはまったく問題にならないだろうか?私は 'fork'を呼び出すことに気付き、デーモンの下で動くようにしています。 – jonathanpeppers

+0

追加の質問、これがFastCGI用に設定されている場合、リクエストごとに新しいプロセスが実行されますか? – jonathanpeppers

3

を行うにはいずれかのでしょうMojoliciousです。ガイドは非常に重要です。具体的には、Hypnotoadに関するセクション - 組み込みのpre-forking Webサーバー。

2
use AnyEvent; 
use Mojolicious::Lite; 

my @stack =(); 

get '/' => sub { 
    my $self = shift; 

    $self->render_later; 
    push @stack, AnyEvent->timer (after => 5, cb => sub { 
     $self->render_text('Hello World!'); 
    }); 
}; 

app->start; 
0

一度に複数の接続を達成するための痛みのない方法は、(それがhypnotoadより良い作品でもあります) "のprefork" のために交換する "デーモン" することです:

から:

app->start('daemon', '-l', 'http://*:8000'); 

へ:

app->start('prefork', '-l', 'http://*:8000'); 

あなたはでそれを自分でテストすることができます

#!/usr/bin/perl -wl 

use Mojolicious::Lite; 

get '/' => sub { 
    my $self = shift; 
    for(my $wait = 10; $wait > 0; $wait--) { 
     sleep(1); 
    } 
    $self->render(text => "OK"); 
}; 

# Uncomment to test hypnotoad. execute: hypnotoad ./this_script.pl 
#app->config(hypnotoad => {listen => ['http://*:8000']}); 
#app->start; 

# Test Daemon: (Uncomment next line) 
#app->start('daemon', '-l', 'http://*:8000'); 

# Test Prefork: (Uncomment next line) 
app->start('prefork', '-l', 'http://*:8000'); 

これはベンチマークです:

$ ab -n 10 -c 10 -s 120 http://localhost:8000/ : 

結果:

(totals)   min mean[+/-sd] median max  total time 
daemon:   11008 92020 28464.5 101021 101022 101.022 seconds 
hypnotoad:  10017 31525 18811.0 49030 49033 49.036 seconds 
prefork:  20018 24020 5165.0 20020 30022 30.029 seconds 

理想的には、それは合計時間が10秒に近くなることでしょう...しかし、私は避難所」それらの時間を改善する方法を見つける(まだ)。

関連する問題