web-dev-qa-db-ja.com

Phusion PassengerおよびRailsを使用する場合の初期サーバー起動が遅い

Phusion Passengerの時流に乗るために、小さなRailsアプリをテストするためのステージングサーバーをセットアップしました。

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

Googleの結果を調べた後、有用な情報を見つけることができません。現在、サーバーを実行し続けるために、頻繁にリクエストを行うcronジョブがあります。

この問題を経験している人はいますか?また、修正のためのアドバイスはありますか?

87
tsdbrown

何が起こっているのかというと、アプリケーションやApplicationSpawnerがタイムアウトのためにシャットダウンしているということです。新しいリクエストを処理するには、パッセンジャーはアプリケーションの新しいコピーを起動する必要があります。これは、高速マシンでも数秒かかる場合があります。この問題を解決するために、アプリケーションを存続させるために使用できる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は常にアプリケーションのコピーをメモリに1つ保持します(Apacheの起動後の最初の要求後)。個々のApplicationリスナーは、このコピーからforkedされます。これは非常に安価な操作です。アプリケーションがリスナーを生成する必要があるかどうかを判断できません。

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

Passenger User Guide は、これらおよびその他の設定オプションの素晴らしいリファレンスです。

edit:アプリがスマートスポーンと互換性がない場合、いくつかの新しいオプションがありますそれはとてもいいです

# 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 !のヒーローに感謝します。

118
John Douthat

この質問に出くわした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!

編集Rails_spawn_methodは、代わりにパッセンジャー3で非推奨です

passenger_spawn_method smart; 

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

40
Gav

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

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

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

4
Josh

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

2
Shuoling Liu

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

1
tim inman

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

1
SteenhouwerD

乗客のバージョンを確認してください。 RailsS​​pawnMethod <string>古いバージョンの場合。

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

0
JmJ