Rails 3 - ускорение загрузки консоли - PullRequest
44 голосов
/ 19 января 2011

Мне интересно, есть ли относительно простой способ ускорить загрузку моей консоли, которая начинает приближаться к 30 секундам.У меня есть много подклассов, на методы которых reload!, похоже, не влияют методы, поэтому я часто открываю и закрываю консоль.IRB заряжает молниеносно.

У меня слишком много драгоценных камней?Как мне рассчитать время загрузки задач, чтобы увидеть, что занимает больше всего времени?Как видите, я уже попробовал гем dev-boost безрезультатно.Приложение прекрасно в Passenger, просто загрузка консоли выводит меня из себя.Работает на MBP OSX 10.6.6 с 2,4 ГГц и 4 ГБ оперативной памяти.Не используя RVM.

Версии:

Ovid$ rails -v
Rails 3.0.3
Ovid$ ruby -v
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10]

Память:

Ovid$ vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                         118818.
Pages active:                       341320.
Pages inactive:                      99490.
Pages speculative:                  310576.
Pages wired down:                   112527.
"Translation faults":             23097323.
Pages copy-on-write:               1270961.
Pages zero filled:                13836659.
Pages reactivated:                      36.
Pageins:                            165761.
Pageouts:                                0.
Object cache: 28 hits of 760846 lookups (0% hit rate)

Gemfile:

source 'http://rubygems.org'

gem 'rails', '3.0.3'
gem 'mysql2'
gem 'foreigner'
gem 'haml'
gem 'capistrano'
gem 'nokogiri'

#web services
gem 'yammer4r'
gem 'ruby-freshbooks'

#authentication gems from nifty generator
gem "bcrypt-ruby", :require => "bcrypt"
gem "mocha", :group => :test
gem 'authlogic'

#dev
group :development do
  gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost'
end

#testing
group :test do
  gem 'database_cleaner'
  gem 'cucumber-rails'
  gem 'cucumber'
  gem 'rspec-rails'
  gem 'spork'
  gem 'launchy'
  gem 'machinist'
  gem 'faker'
  gem 'capybara'
end

Большое спасибо!

Ответы [ 6 ]

59 голосов
/ 21 февраля 2011

Я наконец-то нашел узкие места своего стартапа с помощью Benchmark.В частности, перейдите к гему компоновщика и в lib / bundler / runtime.rb найдите строку, которая выполняет Kernel.require, и оберните ее так:

puts Benchmark.measure("require #{file}") {
  Kernel.require file
}.format("%n: %t %r")

Возможно, вам придется добавить require 'benchmark'где-то в вашем приложении, как в config / boot.rb.Это покажет вам, сколько времени потребуется, чтобы потребовать каждый драгоценный камень.Я не могу гарантировать, что ваши результаты будут соответствовать моим, но у меня было несколько драгоценных камней, которые загружались за секунду, по сравнению с субмиллисекундами для большинства.Некоторые были драгоценными камнями, которые мне не нужны были для разработки , но мне действительно нужно было для некоторых задач в среде разработки, например, capistrano, musta.Я протестировал другие области запуска (инициализаторы и т. Д.), Но не смог найти каких-либо существенных узких мест.

Я пока не нашел чистого способа настройки приложения для загрузки только тех задач, где они находятся.действительно необходимо.Возможно, я мог бы создать среду под названием: speedy и использовать RAILS_ENV = speedy rails s / c для запуска, когда я знаю, что мне не нужны эти драгоценные камни.Затем в Gemfile я мог использовать group: speedy для исключения этих драгоценных камней в некоторых случаях.

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

20 голосов
/ 07 ноября 2012

Слегка адаптированная форма с возможностью копирования, вставки всех необходимых данных и вывода с сортировкой:

# Add this to the top of boot.rb
require 'benchmark'
def require(file)
  puts Benchmark.measure("") {
    super
  }.format("%t require #{file}")
end

Затем вы можете выполнить no-op, чтобы увидеть их:

rails runner 1

Или сортируй их и показывай топ 50:

rails runner 1 | sort -nr | head -n 50
7 голосов
/ 22 августа 2011

Вы можете ускорить его, добавив: require => nil к медленным записям Gemfile и потребуйте их вручную. например,

gem 'jammit', :require => nil

Я также обратился к этой проблеме на встрече, которую я провел. Это похоже на ошибку в ruby ​​1.9.2 (см. Комментарии к этому патчу: https://gist.github.com/1008945)

Вы можете исправить это, пропатчив свой 1.9.2 по только что связанному мною или обновив его до 1.9.2-head или 1.9.3-head.

1 голос
/ 20 декабря 2012

Это определенно касается очистки вашего кода и выявления узких мест, но как только вы сделаете эту экономию, стоит взглянуть на что-то вроде Zeus, чтобы ускорить ваше время разработки.

gem install zeus

https://github.com/burke/zeus (документы)

Это не без ошибок и иногда требует перезагрузки, но я все еще наблюдаю общее увеличение времени разработки благодаря быстрой перезагрузке сервера и консоли после небольших изменений кода.

1 голос
/ 19 января 2011

Я могу только предложить надеть лабораторный халат и разобрать проблему пополам. Посмотрите, ускоряет ли комментирование все ваши требования к гемам (возможно, это также будет включать комментирование фрагментов кода, которые полагаются на эти гемы). Если это так, закомментируйте половину за раз и т. Д.

Извините, это ненастоящий ответ. Полагаю, вы можете попробовать ruby-prof, например, вызвав его с rails runner и сценарием no-op.

Я попробовал ruby-prof script/rails runner 'nil' на своем Mac, но, похоже, он только что упал: -)

EDIT

Если вы используете git для своего приложения, вы также можете попробовать использовать его команду bisect и посмотреть, есть ли конкретный момент времени, когда дела идут медленно, а не просто раздувание.

0 голосов
/ 19 января 2011

Обновить!была проблема в течение некоторого времениПосмотрите на это .Есть несколько патчей, которые вы можете использовать, и несколько советов о том, как вы можете обойти вашу проблему.

Сам метод перезагрузки выглядит следующим образом.

# reloads the environment
def reload!(print=true)
  puts "Reloading..." if print
  ActionDispatch::Callbacks.new(lambda {}, false).call({})
  true
end

Вы всегда можете добавить среду к этому методу, чтобы переопределить его функцию и принудительно выполнить необходимую перезагрузку.

Этоработал для меня, поэтому дайте нам знать, если это работает для вас.Всего наилучшего.

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