2011-10-21 12 views
2

私は自分のアプリのパフォーマンスを改善したいと思い、http://guides.rubyonrails.org/performance_testing.htmlを読み始めました。私の質問は、この「どのように私が始まったか」の末尾にあります。レール3アプリケーションのパフォーマンスを改善する:ベストワークフロー?

だから私は、端末内

bundle exec rake test:profile 

の出力は

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

とprocess_timeフラットファイルである、それはその

のように起動し

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 

でシンプル開始

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クラスにそれ自体を含めることを発見しました。

ホームページには本当に必要ないので、私はlibを削除してプロファイリングテストを再実行しました。 私は、次の

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

を持って、フラット・ファイルはもう

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 

をmethod_missing持っていなかった私はそれをもう一度実行し、だからと思われ

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の処理時間が節約されます。これは、フラットファイルの内容とかなり一致しているようです。私はそれについて何かしようとしなければならないと思う、特にそれはNumericの包含のためにとても頻繁に呼ばれるようである。

今ここに私の質問は以下のとおりです。それは正しいアプローチ

  • ですか?そこから始める方がいいですか?
  • パフォーマンスを低下させるクラス/メソッドを特定する最良の方法は何ですか(私の次のステップはDirを使用することですが、複数の場所が使用されています)
  • 許容される処理時間はどのくらいですか?
  • テストを実行しました:プロファイルを複数回連続して実行し、 "String#gsub"のセルフタイムが0.04から0.12になりました。何が起こるか?

ありがとう!

答えて

1

私はあなたがツールに精通してどのように結果を読み取るのが好きです。 New Relicは、このようなものを監視するための素晴らしいツールですが、長期的に新しい遺物を支払うことを望まない場合は、request_log_analyzerもそうです。あなたの完全なページをプロファイルする

  1. 使用YSlowのか、ページのスピードだけではなく、HTMLのダウンロード
  2. は、ページを最適化し、それは/キャッシュリソース
  3. はあなたの最も遅い行動を見つけ、彼らが何をしているかを見つけ出すロードする方法(遅いコードまたはスロークエリ?)
  4. 最適化クエリ、必要なインデックス、キャッシュデータ
  5. 削除を追加または更新古いライブラリ
  6. オフライン高価なプロセス(バックグラウンド、cronジョブなど)
  7. あなたが知っているので、問題は

    を這い上がるとき

  8. チューンあなたのアーキテクチャは、

モニタリングが重要である(あなたはJRubyと、レバレッジの強力なJavaライブラリ、スレッドとランタイムに乗り、すべてのためにレールを必要としません) -John McCaffrey

1

これらのページのパフォーマンスベンチマークが必要だとは思われません。私は、早期に展開し、何らかの形のアプリケーション監視(新しい遺跡RPMのような)を含めることだけが重要であることを発見しました。あなたはそれを通してアプリケーションのすべてのボトルネックを特定し、アプリケーションが成長するにつれてそれらを修正することができます。

関連する問題