私のRailsアプリへの(作業中のセッションの)最初のリクエストは常に遅れています。本番モードに切り替えても役に立ちません。
私は mongrel を使用しており、他のリクエストは許容できる速度で処理されます。
どうすれば速くなりますか?
よろしく
私のRailsアプリへの(作業中のセッションの)最初のリクエストは常に遅れています。本番モードに切り替えても役に立ちません。
私は mongrel を使用しており、他のリクエストは許容できる速度で処理されます。
どうすれば速くなりますか?
よろしく
最初のリクエストが処理されたときにログの内容を投稿すると、何がそんなに遅くなっているのかを突き止めることができるかもしれません。たとえば、これは最初のユーザーがサイトにアクセスしたときのログです
Booting Mongrel (use 'script/server webrick' to force WEBrick)
Rails 2.1.0 application starting on http://0.0.0.0:3000
Debugger enabled
Call with -d to detach
Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment...
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/mime_type.rb:66: warning: already initialized constant CSV
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart).
** Rails signals registered. HUP => reload (without restart). It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:3000
** Use CTRL-C to stop.
Processing SessionsController#new (for 127.0.0.1 at 2009-05-26 12:26:00) [GET]
Session ID: de2acf074759026e1ed6205724f547a9
Parameters: {"action"=>"new", "controller"=>"sessions"}
Rendering sessions/new
Completed in 0.00587 (170 reqs/sec) | Rendering: 0.00298 (50%) | DB: 0.00092 (15%) | 200 OK [http://localhost/]
私たちのアプリでは 170 リクエスト/秒で十分だと思いますが、他のアプリでは遅いと感じるかもしれません。Rails が提供する統計から、必要な時間の半分が応答のレンダリング (この場合はログイン画面の HTML の生成) に費やされていることがわかります。このリクエストに時間がかかっていた場合、私の最初の呼び出し先は、ログイン画面に関連付けられたビューとヘルパーです。
最初のリクエストで自分自身を初期化するのに長い時間がかかるシステムがある場合は、こっそりと、最初にレールを実行してからcurl経由で偽のリクエストを送信する独自のスタートアッププログラムを作成してみませんか. そうすれば、ユーザーが問題に気付くことはありません。
クリス
あなたが次のような理由である可能性があります。
多数のプラグインと gem を要求してロードする
外部サービスへの接続の作成 (その後のキャッシュ)
独自のページをキャッシュし、キャッシュを「ウォーム」しない限り、最初のリクエストの後にのみ発生します
これらのいずれかが最初の要求の応答時間を必然的に増加させます。
全文検索にFerretを使用していると思いますか?フェレット接続の初期化に時間がかかる可能性がありますか? ログを確認すると、データベースとビューの両方に通常の時間がかかるようですが、合計はまだ 10 秒です。だから私はフェレットが問題かもしれないと推測している理由です。
これは、アプリケーションを Websphere で初めて起動するときに時間がかかるのと同じ理由かもしれません。
WAS は、アプリケーションの新しいバージョンがインストールされる (または WAS が再起動される) ときに、コンテナーをセットアップするために多くの初期作業を行う必要があります。
私たちが使用した回避策は、インストール スクリプトと WAS スタートアップ スクリプトを変更して、アプリケーションが実行されるとすぐにアプリケーション (メイン ページと選択された他のページ) を自動的に参照するようにすることでした。そうすれば、最初の実際のアクセスは全速力でした。
Rubyでこれを行う方法、またはそれが可能かどうかさえわかりません。あなたはそれを理解する必要があります。
PassengerPoolIdleTime
apache confの var を調整する必要があるかもしれません。Rails プロセスを停止しないようにするには、0 に設定します。