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
StarmanやMonocerosとだいたい同じ動きをするようになっていると思われます。
なお、導入にあたっては、リバースプロキシ等と組み合わせた場合の動作パターンが変わる場合があるので、確認してからの本番投入をお願いします。問題等があればgithubのissueでお知らせください
ベンチマーク
これでStarman、Starlet、MonocerosがHTTP/1.1に対応したのでweighttpやwrkなど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のトーク宣伝
さて。結果
Starletがかなり良い数字となりました。”OK”を返すだけのベンチマークではStarmanの2倍程度、app.psgiでも差が出ていますね。
このあたりのなぜStarletが速いのか、Starmanとどこか違うのかについてはYAPC::Asia 2013 Tokyo の僕のセッションで触れようと思うので興味がある方もない方もぜひ聞きに来てくださいませ!