2011-10-21 60 views
2

我想提高我的應用程序的性能,並開始閱讀http://guides.rubyonrails.org/performance_testing.html。我的問題在這個「我如何開始」的演講結束時。提高Rails 3應用程序的性能:最佳工作流程?

於是我開始簡單的用

class BrowsingTest < ActionDispatch::PerformanceTest 
    self.profile_options = { :runs => 5, :metrics => [:wall_time, :process_time], 
         :output => 'tmp/performance', :formats => [:flat] } 
    def test_homepage 
    get '/' 
    end 
end 

bundle exec rake test:profile 

在終端輸出

BrowsingTest#test_homepage (909 ms warmup) 
      wall_time: 341 ms 
     process_time: 517 ms 

和process_time平面文件,它開始像

Thread ID: 70299857145540 
Total: 2.589931 

%self  total  self  wait child calls name 
12.45  0.32  0.32  0.00  0.00  110 BasicObject#method_missing 
10.59  0.28  0.27  0.00  0.01  415 Kernel#raise 
    7.79  0.20  0.20  0.00  0.00  1350 <Class::Dir>#[] 

不知道該怎麼做,我開始尋找一些使用method_missing的東西。我發現我用來轉換指標的一個庫(Alchemist)會這樣做,並將其自身包含在Numeric類中。

由於主頁並不真的需要,我只是刪除了該庫並重新運行了分析測試。 這一次我得到了以下

BrowsingTest#test_homepage (856 ms warmup) 
      wall_time: 321 ms 
     process_time: 482 ms 

而平面文件沒有method_missing的再

Thread ID: 70185893711560 
Total: 2.420023 

%self  total  self  wait child calls name 
12.05  0.29  0.29  0.00  0.00  5 ActionView::Base#helpers 
    8.32  0.20  0.20  0.00  0.00  1350 <Class::Dir>#[] 
    5.12  0.12  0.12  0.00  0.00  5925 String#gsub 

我跑了第二次,獲得了

BrowsingTest#test_homepage (856 ms warmup) 
      wall_time: 321 ms 
     process_time: 482 ms 

Thread ID: 70231460630220 
Total: 2.411142 

%self  total  self  wait child calls name 
14.18  1.49  0.34  0.00  1.16  3265 Array#each 
    8.26  0.20  0.20  0.00  0.00  1350 <Class::Dir>#[] 
    4.94  0.12  0.12  0.00  0.00  205 Kernel#caller 

如此看來,不使用庫會節省約35ms的處理時間,這與平面文件所說的相似。我想我應該嘗試做些什麼,尤其是因爲它似乎經常被稱爲數字包含。

現在,這裏是我的問題:

  • 是不是正確的做法?有沒有更好的方法開始?
  • 什麼是要找準類/方法多數民衆贊成降低性能的最佳方式(對我下一步將尋找利用風向的東西,但有使用它的一個以上的地方)
  • 什麼是可以接受的處理時間?
  • 我跑了測試:配置文件連續幾次,「String#gsub」的自我時間從0.04變爲0.12。會發生什麼?

謝謝!

回答

1

我喜歡你如何熟悉這些工具以及如何閱讀結果。 New Relic是監控這些東西的好工具,但如果您不想長期支付新的文物,request_log_analyzer也是如此。

  1. 使用YSlow的或網頁速度來分析你的整個頁面,而不僅僅是HTML下載
  2. 優化頁面,一個它是如何加載/緩存資源
  3. 找到你最慢的行動,並找出他們在做什麼(慢代碼或慢查詢?)
  4. 優化查詢,添加需要的地方索引,緩存數據
  5. 刪除或更新舊庫
  6. 離線昂貴的過程(背景下,cron作業等)
  7. 調整你的架構(你不需要Rails的一切,跳上JRuby和利用強大的Java庫,線程和運行時)

監控是非常重要的,所以你知道當一個問題小兵

- 約翰麥卡弗裏

1

我真的不覺得這些頁面性能基準是必要的。我發現,儘早部署幷包含某種形式的應用程序監視(如新建文件RPM)非常重要。您可以通過它識別出您的應用程序的所有瓶頸,並隨着應用程序的增長而逐漸修復它們。