Стеллажи с медленными рейками

Когда я запустил

сервер rails

или

rake -T

или некоторые другие рельсы script, требуется много времени, около 1 минуты. Каков наилучший способ определить, что именно так медленно? Как можно улучшить скорость?

Rails v - это 3.0.3 run trough ruby ​​1.9.2 (RVM) - Linux

Ответы

Ответ 1

Это тоже беспокоит меня, так как я переключился на Rails 3.

К вашему второму вопросу: я обнаружил, выкапывая через фреймворк, что инициализаторы берут примерно половину времени простого рейка или рейла, прежде чем он начнет выполнять свою задачу.

Если вы поместите эти простые линии синхронизации в цикл вызовов инициализатора в $GEM_PATH/gems/railties-3.0.3/lib/rails/initializable.rb (или поменяйте его, если хотите):

def run_initializers(*args)
  return if instance_variable_defined?(:@ran)
  t0 = Time.now
  initializers.tsort.each do |initializer|
    t = Time.now
    initializer.run(*args)        
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t])
  end
  puts "%60s: %.3f sec" % ["for all", Time.now - t0]
  @ran = true
end

РЕДАКТИРОВАТЬ: Или, для рельсов 4.2.1:

def run_initializers(group=:default, *args)
  return if instance_variable_defined?(:@ran)
  t0 = Time.now
  initializers.tsort.each do |initializer|
    t = Time.now
    initializer.run(*args) if initializer.belongs_to?(group)
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t])
  end
  puts "%60s: %.3f sec" % ["for all", Time.now - t0]
  @ran = true
end

... вы можете следить за тем, что происходит. В моей системе, которая является 2.4 Core 2 Duo MacBook, инициализаторы занимают около 7 секунд.

Есть несколько, которые особенно медленны в моей системе. Когда я фильтрую все ниже секунды, я получаю этот результат в своей системе:

                load_active_support: 1.123 sec
active_support.initialize_time_zone: 1.579 sec
                       load_init_rb: 1.118 sec
                set_routes_reloader: 1.291 sec

Я уверен, что кто-то (это я?) займет некоторое время, чтобы начать там и оптимизировать.

Ответ 2

Время запуска нашего Rails 3.1 составляло почти 1 минуту (с большим количеством драгоценных камней)

Затем мы узнали о некоторых настройках Ruby 1.9.3 для reddit: http://www.reddit.com/r/ruby/comments/wgtqj/how_i_spend_my_time_building_rails_apps/c5daer4

export RUBY_HEAP_MIN_SLOTS=800000
export RUBY_HEAP_FREE_MIN=100000
export RUBY_HEAP_SLOTS_INCREMENT=300000
export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
export RUBY_GC_MALLOC_LIMIT=79000000

поместите это в среду оболочки /profile/bashrc, и все готово.

Мы увеличили наш запуск с 1 минуты до 9 секунд

Ответ 3

Одним из способов решения этой проблемы является предварительная загрузка среды рельсов с помощью rails-sh. Таким образом, только первая команда rails/rake работает медленно, а остальные довольно быстрые. Написал более полный ответ на него в этом вопросе.

Еще один способ, который я попробовал совсем недавно и совместим с первым, - это установка исправленного рубина (с rvm или rubyenv или из исходного кода) и корректировка переменных среды (см. ответ @stwienert). Патч falcon и patchsexpress патчи оба, похоже, набирают значительную производительность в рубине 1.9. Проверьте rvm/rubyenv на то, как установить с ними исправленные рубины.

Ответ 4

Я использовал robokopp отзыв здесь, чтобы узнать, что большую часть времени использовалось для шагов build_middleware_stack и load_config_initializers для меня. Это потому, что я использую камень omniauth, который добавляет middlewares и, возможно, имеет тяжелые шаги инициализации. Я на Rails 3.1.rc1, и моя инициализация занимает почти 13 секунд (я на ruby ​​1.9.2p180).

Даже для новых рельсов 3.1.rc1, инициализация занимает ~ 3,6 секунды, при этом максимальное время занимает load_config_initializers.

Итак, я предлагаю вам искать драгоценные камни/собственный код, которые имеют тяжелые инициализаторы или добавляют слишком много посредников.