Стеллажи с медленными рейками
Когда я запустил
сервер 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
.
Итак, я предлагаю вам искать драгоценные камни/собственный код, которые имеют тяжелые инициализаторы или добавляют слишком много посредников.