Phusion PassengerとRailsを使用するとサーバーの初期起動が遅くなる


87

Phusion Passengerのワゴンに飛び乗るために、小さなRailsアプリ用にステージングサーバーをセットアップして、物事をテストしました。

これまでのところ、非常に使いやすく、アプリのインストール、設定、デプロイが簡単に行えます。問題は、私たちが使用しているサイトが頻繁にアクセスされず、バックグラウンドでサーバーをシャットダウンしているように見えることです。つまり、誰かがサイトにアクセスすると、リクエストを処理するために新しいサーバーを起動するまで、非常に長い待機が必要になります。ドキュメントを読み、かなりの数の異なるセットアップ(smart / smart-lv2モード、passengeridletimeなど)を試しても、実際の解決策はまだ見つかりませんでした。

Googleの結果を調べた後、私たちは本当に有用な情報を見つけることができません。現在、サーバーを稼働させ続けるために、リクエストを作成するcronジョブがあります。

他にこの問題が発生している人はいますか?修正についてアドバイスはありますか?


:私はまた、旅客ドクサイト上で、このナゲットを見つけmodrails.com/documentation/...
dewrich

@dewrich私はあなたの
cronjob

回答:


119

タイムアウトが発生したため、アプリケーションまたはApplicationSpawnerがシャットダウンしています。新しいリクエストを処理するために、Passengerはアプリケーションの新しいコピーを起動する必要があります。これは、高速マシンでも数秒かかる場合があります。この問題を解決するために、アプリケーションを存続させるために使用できるApache構成オプションがいくつかあります。

具体的には、私が自分のサーバーで行ったことです。PassengerSpawnMethodおよびPassengerMaxPreloaderIdleTimeは、状況で最も重要な構成オプションです。

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

「スマート」スポーンモードを使用してPassengerMaxPreloaderIdleTimeをオフにすることにより、Passengerは常に(Apacheを起動した後の最初のリクエストの後)アプリケーションの1つのコピーをメモリに保持します。個々のApplicationリスナーはforkこのコピーから編集されます。これは非常に安価な操作です。これは非常に迅速に発生するため、アプリケーションがリスナーを生成する必要があったかどうかを判断できません。

アプリがスマートスポーンと互換性がない場合は、大きなPassengerPoolIdleTimeを維持し、curlとcronjobまたはmonitなどを使用して定期的にサイトにアクセスして、リスナーが確実に存続するようにすることをお勧めします。

旅客ユーザーガイドは、これらの多くの設定オプションのための素晴らしいリファレンスです。

編集:アプリがスマートスポーンと互換性がない場合、非常に便利な新しいオプションがいくつかあります

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

したがって、PassengerPreStartとPassengerMinInstancesを組み合わせた場合、PassengerはApacheのロード直後に3つのインスタンスを起動し、常に少なくとも3つのインスタンスを起動したままにするため、ユーザーが遅延することはほとんどありません。

または、PassengerMaxPreloaderIdleTime 0すでにスマートスポーン(推奨)を使用している場合は、追加PassengerPreStartしてすぐに起動できるという追加の利点を得ることができます。

phusion.nlのヒーローに感謝します


ご回答どうもありがとうございました。私たちはそれらの設定のほとんどを試したと思いますが、おそらく正しい組み合わせではありません。明日テストを受けて元に戻ります。
tsdbrown 2009年

これは素晴らしいです。Nginx / Phusion Passengerのインストールで同じ問題が発生していましたが、これは非常に役立ちました。
スコットアンダーソン、

私はこの設定を試してみましたが、パフォーマンスの向上は見られませんが、私たちのアプリはRMagickを使用しています。これの回避策はありますか?RMagickで動作しないのはなぜですか?
チップキャッスル

1
RailsSpawnMethodPassengerSpawnMethod modrails.com/documentation/…の採用
paulus

こんにちは、私は同じ問題を抱えています。その構成を試したいのですが、その構成をどこに配置する必要があるのか​​わかりません。ありがとう!
joseramonc 2013年

41

この質問に遭遇したnginxサーバーユーザーがいる場合に備えて、「PassengerMaxRequests」と「PassengerStatThrottleRate」の両方のディレクティブはnginxに変換されません。しかし、他の人はします:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDIT rails_spawn_methodはパッセンジャー3では廃止予定です。代わりに

passenger_spawn_method smart; 

他のすべては日付までちょうどいいです。


7
これをありがとう。注意すべきことの1つは、レールが有効になっている特定のサイト構成だけでなく、メインのnginx.confのpassenger_pool_idle_timeに他のグローバル設定を詰め込む必要があったことです。
スコットアンダーソン、

しかし乗客4のエラー:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk

4

PassengerMinInstancesを使用することもできます。

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

これはPassengerPreStartと組み合わせることができます


ドキュメントから:「Webサイトが長時間アイドル状態になった後、起動時間が長くなる可能性を回避するには、このオプションをゼロ以外の値に設定する必要があります。」OPの質問に対する完全な回答のようです。
チャック

2

RE:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

追加するだけで、役に立つかもしれません。

現在のリリースのデフォルトのspawnメソッドは「smart-lv2」で、フレームワークのスポーナーをスキップするため、明示的にspawnメソッドを「smart」に設定しない限り、フレームワークのスポーナータイムアウトを設定しても効果はありません。

出典:http : //groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


1

ホストが私のような共有サーバーである場合、設定を変更できず、cronジョブでスタックします。


この特定のアプリケーションではありがたいことにそうではありません。しかし、将来の感謝のためにそれを心に留めておきます。
tsdbrown 2009年

1

私にもこの問題がありましたが、このファイルへの書き込み権限がないため、乗客の設定を変更できませんでした。ツールを見つけました(http://www.wekkars.comアプリの応答を高速に保つ)。多分これはあなたのための解決策にもなります。


0

乗客のバージョンを確認してください。それはRailsS​​pawnMethodでした<string>古いバージョンでした。

その場合(正しく覚えている場合)、すべての構成ディレクティブでPassengerをRailsに置き換えるか、詳細については古いPassengerのドキュメントを探してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.