4

私の RubyOnRails アプリは、Apache 構成の背後にある雑種の通常のパックでセットアップされています。Mongrel Web サーバーのメモリ使用量が特定の操作で非常に大きくなる可能性があることに気付きました。選択した Mongrel プロセスをいつでも動的に再起動できるようにしたいと考えています。

ただし、ここでは説明しませんが、Mongrel がリクエストを処理しているときに割り込みを行わないことが非常に重要な場合があるため、単純なプロセスの強制終了では答えにならないことがあると思います。

理想的には、Mongrel に「現在行っていることをすべて終了し、それ以上の接続を受け入れる前に終了する」というシグナルを送信したいと考えています。

このための標準的な手法またはベストプラクティスはありますか?

4

6 に答える 6

12

Mongrel のソースをもう少し調べてみたところ、Mongrel はシグナル ハンドラーをインストールして標準のプロセス キル (TERM) をキャッチし、正常なシャットダウンを実行することがわかったので、結局、特別な手順は必要ありません。

これは、リクエストの処理中に 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
于 2008-08-28T02:38:06.320 に答える
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 では機能しないようです。

于 2008-08-29T03:12:19.820 に答える
1

より良い質問は、アプリが大量のメモリを消費して、時々雑種を再起動する必要がないようにする方法です。

www.modrails.comは、メモリフットプリントを大幅に削減しました

于 2008-08-27T00:18:05.620 に答える
1

ボギー:

実行中のプロセスが 1 つある場合、そのプロセスは正常にシャットダウンされます (適切な負荷分散を使用している場合は、キュー内のすべてのリクエストが 1 になるはずです)。問題は、古いサーバーが停止するまで新しいサーバーを起動できないため、ユーザーがロード バランサーにキューイングされることです。私が成功したのは、雑種の「カスケード」またはローリング再起動です。それらをすべて停止してすべてを開始する代わりに (したがって、1 つの雑種が完了し、停止し、再開し、接続を受け入れるまで要求をキューに入れる)、各雑種を順番に停止して開始し、前の雑種が完了するまで次の雑種を再起動する呼び出しをブロックすることができます。バックアップします (/status コントローラーに対して実際の HTTP チェックを使用します)。雑種が転がるにつれて、一度に 1 つだけがダウンし、2 つのコード ベースにまたがってサービスを提供しています。これを行うには、メンテナンス ページを 1 分間表示する必要があります。カピストラーノまたは展開ツールが何であれ、これを自動化できるはずです。

したがって、私には 3 つのタスクがあります: cap:deploy - メンテナンス ページを表示し、HTTP チェック後にそれを削除するフックを使用して、従来の方法ですべて同時に再起動します。cap:deploy:rolling - メンテナンス ページなしで、マシン全体にこのカスケードを実行します (iClassify から取得して、特定のマシンにある雑種の数を把握します)。cap deploy:migrations - マイグレーションを「ライブ」で実行するのは通常悪い考えであるため、メンテナンス ページ + マイグレーションを実行します。

于 2009-02-05T19:21:19.360 に答える
0

使用してみてください:

mongrel_cluster_ctl stop

以下も使用できます。

mongrel_cluster_ctl restart
于 2008-08-26T11:35:41.070 に答える
0

質問があります

/usr/local/bin/mongrel_rails cluster::start --only 8000 がトリガーされるとどうなりますか?

この特定のプロセスによって処理されたすべてのリクエストは、最後まで処理されますか? またはそれらは中止されますか?

エンドユーザーに影響を与えることなく、この開始/再起動全体を実行できるかどうかに興味があります...

于 2008-12-14T11:20:35.133 に答える