Mongrel Web サーバーを正常にシャットダウンするにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/27743

  •  09-06-2019
  •  | 
  •  

質問

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

ただし、ここでは詳しく説明しませんが、理由により、次のような場合もあります。 とても Mongrel がリクエストを処理している間は中断しないことが重要なので、単純なプロセスの強制終了は解決策ではないと思います。

理想的には、雑種犬に「やっていることをすべて終えて、それ以上の接続を受け入れる前に終了してください」という信号を送りたいと思っています。

これに関する標準的なテクニックやベストプラクティスはありますか?

役に立ちましたか?

解決

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

他のヒント

monit の使い方を見てください。メモリまたは CPU 使用率に基づいて mongrel を動的に再起動できます。これは、私のクライアント用に書いた構成ファイルの 1 行です。

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

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

注記:リソース監視は、Darwin カーネルを備えた OS X では機能しないようです。

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

www.modrails.com はメモリ使用量を大幅に削減しました

ボギー:

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

したがって、私には 3 つのタスクがあります。cap:deploy - メンテナンス ページを作成し、HTTP チェック後にページを削除するフックを使用して、従来のすべてを同時に再起動する方法を実行します。cap:deploy:rolling - メンテナンス ページを使用せずに、これをマシン全体にカスケード実行します (特定のマシン上にどれだけの雑種が存在するかを知るために iClassify から取得します)。capdeploy:migrations - 移行を「ライブ」で実行するのは通常悪い考えであるため、メンテナンスページと移行を実行します。

使ってみてください:

mongrel_cluster_ctl stop

次のものも使用できます。

mongrel_cluster_ctl restart

質問がありました

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

すべてのリクエストは、この特定のプロセスによって最後まで処理されますか?それとも打ち切られているのでしょうか?

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top