Hatena::ブログ(Diary)

北海道苫小牧市出身のPGが書くブログ RSSフィード Twitter

Fork me on GitHub

2010-04-27(火)

Server::Starter の --interval オプションは大切

最近、Server::Starterを使い始めたのですが、いつでも簡単にサーバを再起動でき、とても便利で安心です。詳しい解説は、kazuhoさんの去年のAdvent Calendarのエントリがわかりやすいと思います。

さて、start_server コマンドには --interval ってオプションがあるのですが、このオプションが結構重要です。--helpから引用すると以下の通りです。

  --interval=seconds       minimum interval to respawn the server process
                           (default: 1)

Server::StarterがHUPシグナルを受け取った際、--interval の間にサーバがエラー終了しないと、サーバの立ち上げに成功したと見なして新しいサーバにディスパッチを開始してしまいます*1。よって、立ち上げに1秒以上時間がかかるサーバを運用する場合、このオプションを指定していないとエラーの検知ができない上に、接続ができない時間が発生してしまいます。

簡単な例で検証してみます。Starmanにて*2、立ち上げに時間がかかるapp.psgiをサーブしてみましょう。

% cat app.psgi
sleep 10;
sub{ [200, [], ["Hi\n"] ] }

% start_server --port=8080 -- plackup -s Starman

この状態で start_server に kill -HUP すると、その1秒後から http://localhost:8080 へ接続ができなくなり、その後も9秒間の間接続することはできません。

これを防ぐためには、サーバの起動にかかる時間を --interval に渡してあげます。

% start_server --port=8080 --interval=10 -- plackup -s Starman

この状態だと、 kill -HUP を送っても http://localhost:8080 に接続できないタイミングは発生しないはずです。

*1:ざっくり読んだだけなので、違ったらすみません!

*2:plackupではなくstarmanコマンドを使う場合は、0.2000 以降はデフォルトではapp.psgiが遅延ロードされるため、このアプリの起動に時間がかかることはありません。

aoruaoru 2010/04/27 16:39 どうもtaniです。
Catalystには標準でその機能があり、1つのサーバーでポート別にいくつもサーバーを起動させたり、
どのファイルを変更したり追加したかなども自動で管理してくれて、
スクリプトにエラーがあればapacheが起動しないようになっていたり、
非常に便利なのですが、ファイルをアップするごとに再読み込みして数秒かかるのが難点です。
なのでCatalystのランタイムでも、この再読み込み時間の短縮ができたらいいなぁと思ったわけです。
接続できないタイミングに関しても同様に発生してしまいます。

本番にアップして再起動するときは、ロードバランサーで負荷分散しているため、
振り分けを1台ずつ止めながらやれるので、その点はあまり気にしていないんですけどね。

本題とはずれている内容だったらすみませんw

hiratarahiratara 2010/04/27 17:05 start_serverは後発のサーバが起動するまで重複して起動させておくだけなので、ダウンタイムを0にはできますが再起動時間の短縮にはならないです。

Catalyst を(Apache + mod_perl ではなく) start_server + starman で起動したければ、以下のエントリが参考になるかと思います。

http://yusukebe.com/archives/10/02/17/142334.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証