стек медленных рельсов - PullRequest
       4

стек медленных рельсов

15 голосов
/ 16 декабря 2010

Когда я запускаю

сервер rails

или

рейк -T

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

Rails v 3.0.3 работает через ruby ​​1.9.2 (RVM) - Linux

Ответы [ 4 ]

16 голосов
/ 31 декабря 2010

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

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

Если вы поместите эти простые строки синхронизации в цикл вызовов инициализатора в $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

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

14 голосов
/ 17 июля 2012

Время запуска нашего 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 секунд

2 голосов
/ 16 июля 2012

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

Другой способ, который я попробовал совсем недавно и совместим с первым, - это установка пропатченного ruby ​​(с помощью rvm или rubyenv или из исходного кода) и настройка переменных среды (см. Ответ @ stwienert). Похоже, что патч «Сокол» и «Рельсэкспресс» набрали значительную производительность в ruby ​​1.9. Прочтите rvm / rubyenv о том, как установить с ними исправленные рубины.

0 голосов
/ 05 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...