Hateburo: kazeburo hatenablog

Operations Engineer / Site Reliability / 運用系小姑 / Perl Monger

Starlet + Server::Stater で UNIX domain socketに対応しました

Starlet-0.21がリリースされました。

Starlet-0.21 - a simple, high-performance PSGI/Plack HTTP server - metacpan.org - Perl programming language

このバージョンからServer::Staterとの組み合わせでUNIX domain socketをListenすることができるようになりました。

$ start_server --path /tmp/app.sock -- plackup -s Starlet app.psgi

Server::Stater は以前からUNIX domain socketをサポートしていたのですが、Starlet側でうまくハンドリングできていなかったのを修正したのが今回のリリースです。

ベンチマーク

#plackconでの発表にもある通り、UNIX domain socketを使うとTCPで接続するよりもよいベンチマーク結果が得られます。

f:id:kazeburo:20131126002528p:plain

このベンチマークはEC2のm3.2xlargeを使い、nginxとStarletを以下のように起動してwrkを使って計測しました。

wrkの起動はこんな感じ。

$ ./wrk -c 300 -t 4 -d 10 http://localhost:8080/
TCPの場合

Starletの起動

$ start_server --port 5000 -- carton exec -- plackup -E production \
  -s Starlet --max-reqs-per-child 5000 --min-reqs-per-child 4000 \
  --max-workers 10 -a app.psgi

nginx.conf

upstream apps {
     server 127.0.0.1:5000;
}
server {
    listen 8080;
    server_name _;
    etag off;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://apps;
    }
}
UNIX domain socketの場合

Starletの起動

$ start_server --path /tmp/app.sock -- carton exec -- plackup -E production \
  -s Starlet --max-reqs-per-child 5000 --min-reqs-per-child 4000 \
  --max-workers 10 -a app.psgi

nginx.conf

upstream apps {
     server unix:/tmp/app.sock;
}
server {
    listen 8080;
    server_name _;
    etag off;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://apps;
    }
}

どうぞご利用くださいませ