Starlet が HTTP/1.1 に対応しました。これによりでnginxのupstream keepaliveなどが捗ると思われます

https://metacpan.org/release/Starlet
https://github.com/kazuho/Starlet

ながらくStarletはHTTP/1.0 + keepaliveなサーバでしたが、version 0.20にてHTTP/1.1に対応しました。具体的に対応したスペックは以下。

  • HTTP/1.1 keepalive
  • Transfer-Encoding: chunked (Request & Response)
  • Expect
  • HTTP Pipelining

StarmanMonocerosとだいたい同じ動きをするようになっていると思われます。

なお、導入にあたっては、リバースプロキシ等と組み合わせた場合の動作パターンが変わる場合があるので、確認してからの本番投入をお願いします。問題等があればgithubのissueでお知らせください

ベンチマーク

これでStarman、Starlet、MonocerosがHTTP/1.1に対応したのでweighttpwrkなどHTTP/1.1対応のベンチマークツールを使ってベンチマーク・比較が出来ます。そこで今回はwrkを試してみました

今回ベンチマークに使った各ソフトウェアのバージョンは以下になります

You have Starman (0.4006)
You have Starlet (0.20)
You have Monoceros (0.19)
You have EV (4.15)
You have Guard (1.022)
You have Plack (1.0029)
You have HTTP::Parser::XS (0.16)

サーバは以前と同じXeon L5630 2.13GHz 4コア/8スレッド を2つ積んだサーバ。

それぞれ以下のオプションで起動します。MonocerosとStarmanは1接続あたりのKeepAliveリクエスト数の上限設定がありません。

[Starman] plackup -s Starman -E produnction --workers=16 --max-requests 10000  -a app.psgi
[Starlet] plackup -s Starlet -E produnction --max-workers 16 --max-keepalive-reqs 10000 --max-reqs-per-child 10000  -a app.psgi
[Monoceros] plackup -s Monoceros -E produnction --max-workers 16 --max-reqs-per-child 10000 --max-readahead-reqs 500 -a app.psgi

もうひとつ、”OK”を返すベンチマークもしました

[Starman] plackup -s Starman -E produnction --workers=16 --max-requests 10000 -e 'sub{[200,[],["OK"]]}'

Starlet、Monocerosもapp.psgiのみ変更

app.psgiの中身は

use Plack::Builder;
use Plack::Request;
my $length = 12;
my $body = 'x'x$length;
builder {
    enable 'AccessLog', logger => sub { };
    sub {
        my $env = shift;
        my $req = Plack::Request->new($env);
        my @params = $req->param('foo');   
        [200, ['Content-Type'=>'text/plain'],[$body]]
    }
};

となっています。

ベンチマークに使った wrk のオプションは

$ wrk -c 15 -t 5 -d 10 'http://x.x.x.x:5000/foo?foo=bar&bar=baz&baz=hoge&hoge=foo'

です。5スレッド起動し、合計15接続で10秒間リクエストを送信します。keepaliveは有効です。

ベンチマーク結果とYAPC::Asiaのトーク宣伝

さて。結果

starlet020.png

Starletがかなり良い数字となりました。”OK”を返すだけのベンチマークではStarmanの2倍程度、app.psgiでも差が出ていますね。

このあたりのなぜStarletが速いのか、Starmanとどこか違うのかについてはYAPC::Asia 2013 Tokyo の僕のセッションで触れようと思うので興味がある方もない方もぜひ聞きに来てくださいませ!

このブログ記事について

このページは、Masahiro Naganoが2013年8月26日 15:56に書いたブログ記事です。

ひとつ前のブログ記事は「YAPC::Asia Tokyo 2013 にて「PSGI/Plack・Monocerosで学ぶハイパフォーマンスWebアプリケーションサーバの作り方」というはなしをします #yapcasia」です。

次のブログ記事は「G-WANはなぜ速いのか?をnginxと比べながら検証してみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja