簡體   English   中英

我怎么弄清楚為什么我的rails 3應用程序,使用mod_rails,是如此之慢?

[英]How do I figure out why my rails 3 app, using mod_rails, is so slow?

我使用Rails 3.0.0和Ruby 1.9.2開發了一個小型Rails應用程序。 在測試期間,在我的個人計算機上,它的性能很好。 我把它放在我的VPS上進行制作,使用Apache和mod_rails,有時表現很糟糕。

這是production.log中的一個例子:

在2010-11-21 21:49:56 -0500開始為XX.XX.XX.XX獲取“/ tracker”
由FleetsController處理#index為HTML
渲染布局/ _stylesheets.html.haml(0.8ms)
渲染的布局/ _header.html.haml(1.0ms)
渲染布局/ _footer.html.haml(0.0ms)
在布局/應用程序中呈現頁面/ about.html.haml(4.5ms)
在15ms完成200 OK(瀏覽次數:14.3ms | ActiveRecord:0.0ms)

在2010-11-21 21:50:02 -0500開始為XX.XX.XX.XX獲取“/ tracker /”
由FleetsController處理#index為HTML
渲染布局/ _stylesheets.html.haml(0.7ms)
渲染布局/ _header.html.haml(1.1ms)
渲染布局/ _footer.html.haml(0.0ms)
在布局/應用程序中渲染fleets / index.html.haml(7.8ms)
1901年完成200 OK(瀏覽次數:7.8ms | ActiveRecord:1.5ms)

在2010-11-21 21:50:06 -0500開始為XX.XX.XX.XX獲取“/ tracker / fleets / XXXXXXXXX”
由FleetsController處理#顯示為HTML
參數:{“id”=>“XXXXXXXXX”}
渲染艦隊/ _details_inner.html.haml(1.2ms)
渲染艦隊/ _details.html.haml(2.1ms)
渲染艦隊/ _summary.html.haml(3.5ms)
渲染艦隊/ _scouts_inner.html.haml(1.3ms)
渲染艦隊/ _scouts.html.haml(3.5ms)
呈現報告/ _report.html.haml(0.5ms)
渲染艦隊/ _reports.html.haml(3.0ms)
渲染艦隊/ _recon_form.html.haml(39.9ms)
渲染艦隊/ _recon.html.haml(40.8ms)
呈現的用戶/ _user.html.haml(1.2ms)
渲染艦隊/ _pilots.html.haml(1.9ms)
渲染布局/ _stylesheets.html.haml(0.5ms)
渲染布局/ _header.html.haml(0.9ms)
渲染布局/ _footer.html.haml(0.0ms)
在布局/應用程序中渲染艦隊/ show.html.haml(60.2ms)
在495ms完成200 OK(瀏覽次數:59.1ms | ActiveRecord:2.9ms)

第一次點擊沒有任何數據庫訪問權限。 第二個確實有一個數據庫訪問,但視圖只需要7.8ms生成,而數據庫只需1.5ms,但整個頁面幾乎不會完成2分鍾! 這是一個非常常見的例子,但我有一些頁面響應的日志條目超過14秒。 不,這不是在重啟后的初始rails負載期間。

什么可能占用那個時間?

1)我是否誤解了ActiveRecord時間報告,這實際上只是代碼時間,但實時數據庫時間是時間的流逝?

2)我正在使用sqlite。 我知道最終我可能不得不切換到MySQL,因為我會遇到並發問題,因為(大多數)每次點擊都會導致數據庫寫入。 但是現在,我幾乎沒有任何交通; 網站上最多可能同時有15個人。 在上面的日志示例中,每次只有一次命中,每次命中之間有4-6秒。 我認為sqlite可以處理...

3)我在共享的VPS上。 這意味着VPS上的其他用戶可能同時做了一些導致服務器速度變慢的用戶。 大多數時候,我的VPS具有非常低的CPU負載,但有可能是我運氣不好而且在那個時刻發生了一些事情。 但我已經看到這種情況經常發生,我不會將其作為答案。

4)VPS只有512 + 512MB的內存。 我顯示有150MB免費,但是我可能只是達到了內存限制,這是頁面交換還是什么?

5)我還在日志中看到了一些BusyException。 我將database.yml超時提升到15秒(從5開始),看看是否有幫助。 從未做過真正的測試,看它是否真的。

我知道我可能沒有提供足夠的信息讓你真正告訴我發生了什么,所以真正的問題是,我怎么開始嘗試追蹤這個?

所以有兩件事......

  1. 使用New Relic來幫助診斷緩慢的代碼
  2. 基於日志記錄,我敢打賭你正在做一些數組操作或者在FleetsController #index中返回一大堆項目......看起來你的應用程序代碼正在那里做。

http://www.newrelic.com/

如果看起來不對,請在FleetsController #index中發布代碼。 但是NewRelic可以幫助您找出您在慢速Web請求中花費周期的確切位置。

SQLite根本不做並發。 我想也許數據庫上的連接被阻止了。 實際的查詢很好,但我懷疑SQLite db文件在另一個查詢運行時被鎖定。

你真的需要轉移到像MySQL或PostgreSQL這樣的實際服務器數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM