Comment déboguer un Rails de l'actif précompiler qui est insupportablement lent

Je travaille sur des Rails 3.2 projet et les actifs ont augmenté un peu juste dans les derniers mois, bien que je ne considère pas le projet d'être grand. Les actifs sont constitués de JS (pas de café-script), et les fichiers SASS; nous avons assez peu d'images, mais elles ont été là plus ou moins depuis le début des jours je ne pense pas qu'ils sont un important facteur. L'on peut avoir sur une douzaine de libs et la plupart sont de petite taille, le plus grand est l'INTERFACE utilisateur de Jquery JS. Le déploiement s'effectue via Capistrano et il a commencé à devenir évident que le déploiement de mise en scène a été nettement plus rapide que pour la production. Pour illustrer tout en évitant les facteurs de sur de différents serveurs et les effets de réseau, j'ai tout simplement manqué les trois commandes suivantes dans l'ordre sur mon ordinateur portable comme suit:

$ time RAILS_ENV=production bundle exec rake assets:precompile
^Crake aborted!
[Note I aborted this run as I felt it was getting stupidly long...]
real    52m33.656s
user    50m48.993s
sys 1m42.165s

$ time RAILS_ENV=staging bundle exec rake assets:precompile
real    0m41.685s
user    0m38.808s
sys 0m2.803s

$ time RAILS_ENV=development bundle exec rake assets:precompile
real    0m12.157s
user    0m10.567s
sys 0m1.531s

Donc je suis parti me gratter la tête. Pourquoi il y a ces énormes différences entre les différents environnements? Je peux comprendre l'écart entre l'élaboration et la mise en scène, mais nos configs pour la mise en scène et la production sont identiques. (Je tiens à souligner que la production de la compilation sera complète après environ 2h de route!)

Tandis que le résultat final est l'obtention de mon précompiler pour être plus rapide, je veux accomplir ce par le fait de comprendre où tous le temps va et pourquoi il y a tant de grandes différences entre les Rails environnements. J'ai vu d'autres posts sur l'utilisation de compresseurs différents et similaires, mais je ne peux pas trouver toutes les informations sur la façon de déboguer ces râteau tâches de travail où le temps est passé et d'identifier les paramètres qui peuvent être à l'origine de ces différences dramatiques.

Je ne sais pas quelles informations supplémentaires doivent donc sera mise à jour si et quand les commentaires de demander. TIA

Mise à jour: informations complémentaires fournies ci-dessous

config/environments/production.rb et config/environments/staging.rb (elles sont identiques):

MyRailsApp::Application.configure do
  # Code is not reloaded between requests
  config.cache_classes = true

  # Full error reports are disabled and caching is turned on
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Disable Rails's static asset server (Apache or nginx will already do this)
  config.serve_static_assets = true
  config.static_cache_control = "public, max-age=31536000"
  config.action_controller.asset_host = "//#{MyRailsApp::CONFIG[:cdn]}"

  # Compress JavaScripts and CSS
  config.assets.compress = true

  # Don't fallback to assets pipeline if a precompiled asset is missed
  config.assets.compile = false

  # Generate digests for assets URLs
  config.assets.digest = true

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation can not be found)
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners
  config.active_support.deprecation = :notify
end

La base de config/application.rb est:

require File.expand_path('../boot', __FILE__)
require 'rails/all'
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
module MyRailsApp
CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'config.yml'))[Rails.env]
class Application < Rails::Application
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += %W(#{config.root}/app/workers)
# Configure the default encoding used in templates for Ruby 1.9.
config.encoding = "utf-8"
# Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password]
# Enable the asset pipeline
config.assets.enabled = true
# Stop precompile from looking for the database
config.assets.initialize_on_precompile = false
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
# Fix fonts in assets pipeline
# http://stackoverflow.com/questions/6510006/add-a-new-asset-path-in-rails-3-1
config.assets.paths << Rails.root.join('app','assets','fonts')
config.middleware.insert 0, 'Rack::Cache', {
:verbose     => true,
:metastore   => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/meta"),
:entitystore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/body")
} # unless Rails.env.production?  ## uncomment this 'unless' in Rails 3.1,
## because it already inserts Rack::Cache in production
config.middleware.insert_after 'Rack::Cache', 'Dragonfly::Middleware', :images
config.action_mailer.default_url_options = { :host => CONFIG[:email][:host] }
config.action_mailer.asset_host = 'http://' + CONFIG[:email][:host]
end
end

Gem fichier:

source 'http://rubygems.org'
gem 'rails', '3.2.13'   
gem 'mysql2'
gem 'dragonfly', '>= 0.9.14'
gem 'rack-cache', :require => 'rack/cache'
gem 'will_paginate'
gem 'dynamic_form'
gem 'amazon_product' # for looking up Amazon ASIN codes of books
gem 'geoip'
gem 'mobile-fu'
gem 'airbrake'
gem 'newrelic_rpm'
gem 'bartt-ssl_requirement', '~>1.4.0', :require => 'ssl_requirement'
gem 'dalli' # memcache for api_cache
gem 'api_cache'
gem 'daemons'
gem 'delayed_job_active_record'
gem 'attr_encrypted'
gem 'rest-client'
gem 'json', '>= 1.7.7'
gem 'carrierwave' # simplify file uploads
gem 'net-scp'
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'therubyracer'
gem 'sass-rails',   '~> 3.2.3'
gem 'compass', '~> 0.12.alpha'
gem 'uglifier', '>= 1.0.3'
gem 'jquery-fileupload-rails'
end
gem 'jquery-rails'
gem 'api_bee', :git => 'git://github.com/ismasan/ApiBee.git', :ref => '3cff959fea5963cf46b3d5730d68927cebcc59a8'
gem 'httparty', '>= 0.10.2'
gem 'twitter'
# Auth providers
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-identity'
gem 'omniauth-readmill'
gem 'bcrypt-ruby', "~> 3.0.0" # required for omniauth-identity
gem 'mail_view'
# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'
# Deploy with Capistrano
group :development do
gem 'capistrano'
gem 'capistrano-ext'
gem 'capistrano_colors'
gem 'rvm-capistrano'
# requirement for Hoof, Linux equivalent of Pow
gem 'unicorn'
end
group :test, :development do  
gem 'rspec-rails'
gem 'pry'
gem 'pry-rails'
end
group :test do
gem 'factory_girl_rails'
gem 'capybara'
gem 'cucumber-rails'
gem 'database_cleaner'
gem 'launchy'
gem 'ruby-debug19'
# Pretty printed test output
gem 'shoulda-matchers'
gem 'simplecov', :require => false
gem 'email_spec'
gem 'show_me_the_cookies'
gem 'vcr'
gem 'webmock', '1.6'
end
  • Ne passage d'un --trace drapeau de vous dire quelque chose d'intéressant?
  • Vous pouvez publier vos fichiers pour config/environments/production.rb et config/environments/staging.rb?
  • J'ai mis à jour le post pour y inclure l'environnement config. Notez que la mise en scène et la production de configs sont identiques.
  • Avez-vous vérifié qu'elles sont identiques en utilisant diff? Souvent, ces types de problèmes venu jusqu'à eux, qui ont besoin d'être identiques, mais ne pas être identiques pour une raison quelconque.
  • Ils sont en effet identiques selon diff.
  • Bizarre... Ne yo ont des endroits dans votre application, où vous faire quelque chose de différent si vous êtes dans la production? if Rails.env.production? ...
  • dans application_controller.rb j'ai une ligne qui entre en jeu si la production OU la mise en scène. J'ai aussi un couple de points de vue, lorsqu'une balise meta est sortie uniquement sur la production. Ceux-ci ont été à la base de code à partir de très tôt donc, semble peu probable coupable.
  • Pourriez-vous localiser le commettre, quand elle a commencé?
  • Pourriez-vous développer votre commentaire? J'ai peur de ne pas comprendre ce que tu veux dire. Merci.
  • signifie que si vous n'utilisez git bisect de savoir d'où l'asset pipeline commencé à prendre autant de temps.
  • Vous pouvez essayer de restauration par plusieurs commits en arrière et de vérifier si des éléments d'actif de la compilation prend beaucoup de temps. Vous pouvez également utiliser git bisect pour elle. Peut-être que certains mauvais de l'actif est à blâmer pour tout. Aussi essayez de désactiver les actifs rake assets:clean
  • Ne donne pas beaucoup d'infos. Semble passer beaucoup de temps dans la Execute assets:precompile:primary tâche.
  • Oh, je vois. Oui, j'ai fait de la bissectrice et trouvé un couple de petits contribuant actifs variations. Cependant, ce n'est pas vraiment la poussée de ma question. Comment puis-je découvrir ce râteau actifs:précompiler est en train de faire? Qu'est ce qu'il appel et sur quoi? Puis-je l'obtenir pour vous connecter c'est un progrès? Et même si j'ai trouvé un coupable fichier, comment puis-je savoir pourquoi il y a une telle différence entre mise en scène et de la production?
  • J'ai une idée, mais @arooaroo pourriez-vous aussi poster vos Gemfile dans l'intervalle?
  • Gemfile ajouté à la question d'origine.

InformationsquelleAutor arooaroo | 2013-10-11