MonocerosやPlack/PSGIサーバの話で、YAPC::Asia 2013のトークに応募したので興味があればLikeボタンをぽちっとお願いします
http://yapcasia.org/2013/talk/show/1ae09aba-c8d5-11e2-a1f8-59856aeab6a4
その Monoceros ですが、少しずつアップデートしていて、0.13と0.14で 最大保持コネクション数を制限するオプションとMonocerosのステータスを表示するミドルウェアが付きました。
https://metacpan.org/release/Monoceros
まず、最大保持コネクション数ですが、—max-keepalive-connectionというオプションで指定します。デフォルトはオープンできるファイル数(POSIX::SCOPEN_MAX)の半分になってます。Monocerosのコネクション管理プロセスが保持する接続がこの数値以上になると、新規の接続からKeepAliveが無効となり、既存の接続も積極的にKeepAlive接続を切って行くようになります。そしてしばらくすると戻ります。
この機能をつけたのは、オープンできるファイル数の上限に達してしまうと、リクエストを処理するworkerから管理プロセスに対してソケットを渡す事ができなくなってしまい、動作が安定しなくなってしまうからです。安全をとって上限の半分をデフォルトとしています。もっとKeepAliveしたいんだ!という場合はulimitもご確認くださいませ。
指定の仕方は起動時に
$ carton exec -- plackup -E production --max-keepalive-connection=10000 \
--port=5000 --max-workers=10 -s Monoceros --max-reqs-per-child=500 -a app.psgi
という感じです。daemontoolsを使っている場合は softlimit コマンドを使うといいですね
もうひとつのステータスを表示するミドルウェアですが、現在の接続数をみたり、—max-keepalive-connectionに達していないかを確認するのに便利です。Plack::Middleware::MonocerosStatusがMonocerosのパッケージに含まれているので、こんな風に使えます。
use Plack::Builder;
builder {
enable "MonocerosStatus",
path => '/monoceros-status',
allow => [ '127.0.0.1', '192.168.0.0/16' ],
$app;
};
Plack::Middleware::ServerStatusと似たインターフェイスとなっています。
表示は
% curl http://server:port/monoceros-status
Processing: 2
Waiting: 98
Queued: 0
となります。各項目についてですが、
Processing: workerで処理中のソケット数
Waiting: KeepAliveなど次のリクエストの到着をまっているソケット数
Queued: workerで処理されるのを待っているソケット数
Queuedが多いようであればworker数を増やすなどの対応が必要になりそうですね。
さて、どこかサービスで使えないかなー