金利0無利息キャッシング – キャッシングできます

 | 

2009-06-05

lighttpd + FastCGI + FCGI::Asyncを試す

17:02 | lighttpd + FastCGI + FCGI::Asyncを試す - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - lighttpd + FastCGI + FCGI::Asyncを試す - 金利0無利息キャッシング – キャッシングできます

FastCGI使ったこと無いけど、

http://angelos.g.hatena.ne.jp/dann/20090603/1244029646

を読んで。

Apache内部で処理するmod_perlと違い、イベントベースでFastCGIのプロセスを動かすようにしておけば1つのプロセス内で1つのリクエストが終わらない間に別のリクエスト処理とかできるよね。

cometみたいな処理やるなら必須、mod_perlだとこれは無理なんじゃないかと。

というわけでlighttpd + FCGI::Async試してみた。

lighttpd.confはこんな感じで

fastcgi.server             = ( "/fastcgi-async/" =>
                               ( "localhost" =>
                                 (
                                   "host" => "127.0.0.1",
                                   "port" => 1234,
                                   "check-local" => "disable"
                                 )
                               )
                            )

1234で待ち受けるFCGI::Asyncプロセス。QUERY_STRINGで指定した秒数だけIO::Async::Timerでwaitして結果を返す。

同時に受けるリクエスト数を増やすには、queuesizeを増やす必要がありました。

#!/usr/local/bin/perl

use strict;
use FCGI::Async;
use IO::Async::Loop;
use Data::Dumper;
use IO::Async::Timer;

my $loop = IO::Async::Loop->new();
my $fcgi = FCGI::Async->new(
    loop => $loop,
    service => 1234,
    queuesize => 10000,
    on_request => sub {
        my ( $fcgi, $req ) = @_;
        warn "accepted!";
        # warn Dumper $req->params;
        my $query = $req->param( "QUERY_STRING" );
        my $output = sub {
            warn "process output";
            $req->print_stdout( "Status: 200 OK\r\n" .
                                "Content-type: text/plain\r\n" .
                                "\r\n" .
                                "timer: ". $query );
            $req->finish();
        };
        my $timer = IO::Async::Timer->new(
             mode => "countdown",
             delay => $query,
             on_expire => $output,
        );
        $loop->add($timer);
        $timer->start;
        return 1;
    }
);

$loop->loop_forever;

100件並列してリクエストしてもApache benchが1秒で終わる。abの制限で100並列以上無理だった。もっといけるはず。

./ab -n100 -c100 http://localhost:81/fastcgi-async/?1
Concurrency Level:      100
Time taken for tests:   1.194 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      15300 bytes
HTML transferred:       800 bytes
Requests per second:    83.76 [#/sec] (mean)
Time per request:       1193.920 [ms] (mean)
Time per request:       11.939 [ms] (mean, across all concurrent requests)
Transfer rate:          12.51 [Kbytes/sec] received

LinaLina2011/11/01 18:00Free knowledge like this doesn't just help, it promote decmaorcy. Thank you.

dkwhobxbyndkwhobxbyn2011/11/01 23:30Gz57R5 <a href="http://azgfngsygtsj.com/">azgfngsygtsj</a>

trtlmsrgelctrtlmsrgelc2011/11/03 23:43pYhfwv , [url=http://vfeqzeeelwyz.com/]vfeqzeeelwyz[/url], [link=http://flrqxygjarcm.com/]flrqxygjarcm[/link], http://hkzsmijgckqp.com/

jxcaainqjxcaainq2011/11/07 21:42BDN2JY , [url=http://xsflcsqukbyb.com/]xsflcsqukbyb[/url], [link=http://gaujolqbjloo.com/]gaujolqbjloo[/link], http://wyskgoagdbyj.com/

 |