2008-08-26 3 views
4

My RubyOnRailsアプリケーションは、Apache構成の背後にある通常の雑種パックでセットアップされています。私たちは、Mongrel Webサーバーのメモリ使用量が特定の操作でかなり大きくなることに気付きました.Mongrelの選択されたプロセスをいつでも動的に再起動することができます。Mongrel Webサーバーを正常にシャットダウンするには

しかし、私はここには入りません。時にはとなる可能性があります。リクエストを処理している間に雑種を中断しないことが重要なので、 。

理想的には、私はMongrelに「あなたが何をしていても終了し、それ以上の接続を受け入れる前に終了する」という信号を送信したいと考えています。

これには標準的な手法やベストプラクティスがありますか?

答えて

12

私たちのメモリフットプリントを削減しましたグレースフルシャットダウンを行うので、私は結局特別な手続きを必要としません。

これは、リクエストを処理している間にMongrelを強制終了したときに出力されるログから確認できます。例:

** TERM signal received. 
Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown' 
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown' 
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application 
+0

もう一方を受け入れない場合は、少なくとも最初に「正しく」発注されます。 – Otto

+0

あなた自身の答えを受け入れることができるようですので、私は持っています – AndrewR

0

は、使用してみてください:

mongrel_cluster_ctl stop 

を使用することもできます:

mongrel_cluster_ctl restart 
1

より良い質問は、それは随時雑種を再起動する必要がありますように多くのメモリを消費してアプリを維持する方法であります。

www.modrails.comは、私は雑種のソースに、もう少し調査をやったし、それが標準的なプロセスのkill(TERM)をキャッチする雑種犬はシグナルハンドラをインストールすることが判明し、大幅

+0

modrailsは合計メモリフットプリントを減らすだけです。おそらく、雑種を再開する必要がある根本的な原因であるメモリリークは解決されません。 – ryantm

5

monitを使用します。メモリまたはCPU使用率に基づいてmongrelを動的に再起動できます。ここに私のクライアントのために書いた設定ファイルの行があります。

check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid 
    start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000" 
    stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000" 

    if totalmem is greater than 150.0 MB for 5 cycles then restart  # eating up memory? 
    if cpu is greater than 50% for 8 cycles then alert     # send an email to admin 
    if cpu is greater than 80% for 5 cycles then restart    # hung process? 
    if loadavg(5min) greater than 10 for 3 cycles then restart   # bad, bad, bad 
    if 3 restarts within 5 cycles then timeout       # something is wrong, call the sys-admin 

    if failed host 192.168.106.53 port 8000 protocol http request /monit_stub 
     with timeout 10 seconds 
     then restart 
    group mongrel 

次に、すべてのmongrelクラスタインスタンスに対してこの設定を繰り返します。 monit_stub行は、monitがダウンロードしようとする空のファイルです。できない場合は、インスタンスを再起動しようとします。

注:リソース監視は、DarwinカーネルのOS Xでは動作しないようです。

0

は/ usr/local/bin/mongrel_railsクラスター何が起こるか疑問

:: --only 8000を起動がトリガされてしまいましたか?

は、この特定のプロセスによって配信されるすべてのリクエストです。またはそれらは打ち切られますか?あなたは一つのプロセスを実行している場合は、それが正常にシャットダウンされます

(サービスのすべて:

私は好奇心旺盛この全体の起動/再起動の事は、エンドユーザーに影響を与えずに行うことができるかどうか...

1

ボギーそのキュー内のリクエストは、適切なロードバランシングを使用している場合にのみ1にする必要があります)。問題は、古いものがなくなるまで新しいサーバを起動できないため、ユーザがロードバランサにキューイングされることです。私が成功したことは、雑種の「カスケード」またはロールバックの再開です。それらをすべて停止してそれらをすべて開始するのではなく(したがって、1つの雑菌が完了、停止、再開して接続を受け入れるまで要求をキューイングする)、各雑種を停止してから、次の雑種を再開するためにバックアップ(/ステータスコントローラへの実際のHTTPチェックを使用)。あなたの雑種が動くにつれて、一度に1つだけダウンし、2つのコードベースにまたがってサービスしています。これができない場合は、1分間メンテナンスページを投げてください。 capistranoやデプロイツールが何であれ、これを自動化できるはずです。

私は3つのタスクを持っています: cap:deploy - 従来の再起動と同時に、保守ページを作成してHTTPチェック後に削除するフックを使用します。 cap:deploy:rolling - これはマシンを横断してカスケードします(iClassifyから、特定のマシン上の雑菌数を知るために保守ページなし)。 cap deploy:マイグレーション - メンテナンスページ+マイグレーションはマイグレーションを実行するのが悪いので、マイグレーションは「ライブ」です。

関連する問題