11

8 GB の RAM を搭載した 2011 Macbook Pro で Ruby on Rails を実行しています。オプションなしで Rails を起動するのに 2 秒かかり、コンソールをロードするのに 12 秒かかります。この時期、Rails は何をしているのでしょうか。12秒かかるなんて信じられない。私のアプリはそれほど大きくありません –appフォルダー内に 10,607 行あります。

$ time rails > /dev/null

real    0m2.830s
user    0m2.751s
sys 0m0.076s

$ time echo exit | rails console > /dev/null

real    0m12.825s
user    0m11.779s
sys 0m0.898s

Ruby 1.9.3 と Rails 3.2 を実行しています。

$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.0.0]
$ rails -v
Rails 3.2.11
$ wc -l `find app -name *.rb`
10607 total

編集:

空の Rails プロジェクト (単に ) で同じことを行うrails new:

marc@menasor ~/dev/rails_empty $ time rails > /dev/null
real    0m2.192s
marc@menasor ~/dev/rails_empty $ time echo exit | rails c > /dev/null
real    0m3.807s

つまり、空の Rails プロジェクトを開始するのに 4 秒近くかかります。この 4 秒間に何が起こっているのでしょうか。

以下は、4GB RAM の SSD を搭載した Macbook Air でオリジナルの Rails プロジェクトを開始するタイミングです。

$ time rails
real    0m1.161s
$ time echo exit | rails console
real    0m20.356s

そのため、SDD によって Rails の起動時間が 2 秒近く短縮されたので、多くの IO を実行していると思います。ただし、Rails コンソールを起動する時間は長くなりました。

編集:

レックの提案の後にプロファイリング データを追加する:

Total: 404 samples
 116  28.7%  28.7%      116  28.7% garbage_collector
  62  15.3%  44.1%      258  63.9% Kernel#require
  12   3.0%  47.0%       28   6.9% Journey::Visitors::Each#visit
  12   3.0%  50.0%       12   3.0% Regexp#===
   9   2.2%  52.2%       52  12.9% Module#class_eval
   9   2.2%  54.5%       12   3.0% Module#module_eval
   9   2.2%  56.7%        9   2.2% Module#remove_method
   8   2.0%  58.7%        9   2.2% Module#enable
   7   1.7%  60.4%       24   5.9% Journey::Visitors::Visitor#visit
   6   1.5%  61.9%      255  63.1% Kernel#tap
   5   1.2%  63.1%      237  58.7% BasicObject#instance_exec
   5   1.2%  64.4%        5   1.2% Psych::Nodes::Scalar#initialize
   4   1.0%  65.3%        8   2.0% Array#uniq
   4   1.0%  66.3%       11   2.7% Enumerable#inject
   4   1.0%  67.3%       71  17.6% Kernel#load
   4   1.0%  68.3%       61  15.1% Kernel.load
4

3 に答える 3

7

Rails のブート シーケンスをプロファイリングして、そこから何かを学べるかどうかを確認できます。

  • gemfileに追加gem 'perftools.rb'します (「.rb」ビットはタイプミスではありません)。
  • 走るbundle install
  • require 'perftools'の先頭に追加/environments/development.rb
  • PerfTools::CpuProfiler.start('/tmp/dev_prof')の構成ブロックに追加しますdevelopment.rb
  • アプリ内で簡単にアクセスできる URL を選択してください。私の場合、URL は localhost:3000/games です。
  • その URL 呼び出しを処理するコントローラー メソッドを見つけます。私の場合は、GamesController の index メソッドです。
  • require 'perftools'GamesController の先頭に追加します
  • PerfTools::CpuProfiler.stopGamesController の index メソッドに追加します。

「rails s」で Rails 開発環境を起動します。

  • rails が読み込まれたら、localhost:3000/games にアクセスしてください。これにより、プロファイラーが /tmp/dev_prof に書き込みます。
  • /tmp フォルダーに移動し、'pprof.rb --tex /tmp/dev_prof | を実行します。以下'

上部の呼び出しは、最も時間がかかるものです。ガベージ コレクタにかなりの時間が費やされていることに気付くでしょう。幸いなことに、これを改善できます。

  • 「エクスポートRUBY_GC_MALLOC_LIMIT=60000000」を実行します
  • 「エクスポートRUBY_FREE_MIN = 200000」を実行します

プロファイリングをやり直すと、ガベージ コレクターにかかる時間が大幅に短縮されます。詳細については、 http://whalesalad.com/posts/reduce-rails-boot-time-by-30-40-percentを参照してください。

Before:
  82  35.8%  35.8%       82  35.8% garbage_collector
  30  13.1%  48.9%      131  57.2% Kernel#require
   9   3.9%  52.8%        9   3.9% Regexp#===
   6   2.6%  55.5%       25  10.9% Module#class_eval
   5   2.2%  57.6%        8   3.5% Module#module_eval
   4   1.7%  59.4%        9   3.9% Journey::Visitors::Visitor#visit
   4   1.7%  61.1%      129  56.3% Kernel#tap
   4   1.7%  62.9%       33  14.4% Kernel.load
   4   1.7%  64.6%        4   1.7% Module#enable
   3   1.3%  65.9%        3   1.3% Enumerable#any?
   3   1.3%  67.2%       20   8.7% EventMachine.run_machine

After:
  33  18.1%  18.1%       33  18.1% garbage_collector
  31  17.0%  35.2%      137  75.3% Kernel#require
   5   2.7%  37.9%        6   3.3% Module#enable
   5   2.7%  40.7%        6   3.3% Module#module_eval
   5   2.7%  43.4%        5   2.7% Regexp#===
   4   2.2%  45.6%      125  68.7% BasicObject#instance_exec
   4   2.2%  47.8%       20  11.0% EventMachine.run_machine
于 2013-02-03T21:54:07.093 に答える
2

私のラップトップは4歳でRAMは4GBしかありませんが、同じ問題を抱えていましたが、現在これを使用しています: https://github.com/thedarkone/rails-dev-boost

私にとっては、環境をロードする時間が数秒 (3/4) に短縮されました。うまくいけば、それはあなたを助けるかもしれません

于 2013-01-28T17:46:11.527 に答える
1

開発環境でレールを実行している可能性があります。開発環境と本番環境の違いについては、こちらを参照してください - Rails の開発環境と本番環境の間には、どのような重要な違いがありますか?

于 2013-01-28T13:25:41.740 に答える