2009-05-26 304 views

回答

1

如果您在處理第一個請求時發佈日誌的內容,那麼或許我們可以弄清楚是什麼讓它變得如此緩慢。例如,這是我的日誌作爲第一個用戶訪問該網站

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。如果這個請求花了很長時間,我的第一個停靠港就是與登錄屏幕相關的意見和幫助者。

如果你確實有一個系統需要很長時間才能在第一個請求上初始化自己,那麼爲什麼不偷偷編寫自己的啓動程序,它首先運行rails,然後通過curl發送一個假請求。這樣你的用戶就不會看到問題。

Chris

+0

感謝您的提示。這裏是我的日誌文件:http://pastie.org/private/ih2mpcmjpofp5jmfsvw 有時候,它會持續比1600毫秒更長的時間來回答我的請求。我真的沒有線索...... – Stefan 2009-05-26 13:33:27

1

這可能是同樣的理由,我們的應用程序需要很長的時間,我們第一次踢他們關在WebSphere。

當安裝新版本的應用程序(或重新啓動WAS)時,WAS必須做許多初始工作來設置容器。

我們使用的解決方法是修改安裝腳本和WAS啓動腳本,以便它們在運行後立即自動瀏覽到應用程序(主頁面和選定的其他頁面)。這樣,第一次真正的訪問是全速。

我不知道如何用Ruby來做到這一點,甚至是否有可能。你必須找出一個。

+0

這是可能的 - 你可以使用一個簡單的腳本來使用curl/wget從所有的rails應用程序請求一個頁面來達到同樣的效果。 – Petesh 2009-05-26 08:30:11

1

我猜你正在使用Ferret進行全文搜索?可能是雪貂連接需要一段時間才能初始化?當我檢查你的日誌時,似乎db和view都需要一段正常的時間,但總數仍然是10秒。所以我一定是別的,這就是爲什麼我猜測費雷特可能是問題所在。

1

這可能是因爲你是:

  • 要求,並加載了一些 插件和寶石

  • 使得外部 服務的連接(然後緩存)

  • 緩存自己的頁面,並且只有在第一次請求後纔會發生 ,除非 「加熱」緩存

其中任何一個都不可避免地會增加第一個請求的響應時間。

0

也許你需要在apache conf中調整PassengerPoolIdleTime var。將其設置爲0永不停止您的導軌進程。

相關問題