2013-03-19 6 views
20

Questa mattina, ho aggiornato i binari dal 3.2.12 al 3.2.13, il che ha comportato un notevole ritardo nel caricamento dei miei punti di vista. Questo è il caricamento mia home page:Ciò che causa l'estrema lentezza quando si passa da un binario 3.2.12 a 3.2.13

Rails 3.2.12: 
Completed 200 OK in 387ms (Views: 339.0ms | ActiveRecord: 27.1ms) 

Rails 3.2.13: 
Completed 200 OK in 4416ms (Views: 4361.2ms | ActiveRecord: 28.7ms) 

L'unica differenza tra i due commit che la versione di Rails, che naturalmente ha anche tradursi in un sacco di altre gemme aggiornato ... Questa è la differenza nel Gemfile.lock:

GEM 
    remote: https://rubygems.org/ 
    specs: 
- actionmailer (3.2.12) 
-  actionpack (= 3.2.12) 
-  mail (~> 2.4.4) 
- actionpack (3.2.12) 
-  activemodel (= 3.2.12) 
-  activesupport (= 3.2.12) 
+ actionmailer (3.2.13) 
+  actionpack (= 3.2.13) 
+  mail (~> 2.5.3) 
+ actionpack (3.2.13) 
+  activemodel (= 3.2.13) 
+  activesupport (= 3.2.13) 
     builder (~> 3.0.0) 
     erubis (~> 2.7.0) 
     journey (~> 1.0.4) 
@@ -14,19 +14,19 @@ GEM 
     rack-cache (~> 1.2) 
     rack-test (~> 0.6.1) 
     sprockets (~> 2.2.1) 
- activemodel (3.2.12) 
-  activesupport (= 3.2.12) 
+ activemodel (3.2.13) 
+  activesupport (= 3.2.13) 
     builder (~> 3.0.0) 
- activerecord (3.2.12) 
-  activemodel (= 3.2.12) 
-  activesupport (= 3.2.12) 
+ activerecord (3.2.13) 
+  activemodel (= 3.2.13) 
+  activesupport (= 3.2.13) 
     arel (~> 3.0.2) 
     tzinfo (~> 0.3.29) 
- activeresource (3.2.12) 
-  activemodel (= 3.2.12) 
-  activesupport (= 3.2.12) 
- activesupport (3.2.12) 
-  i18n (~> 0.6) 
+ activeresource (3.2.13) 
+  activemodel (= 3.2.13) 
+  activesupport (= 3.2.13) 
+ activesupport (3.2.13) 
+  i18n (= 0.6.1) 
     multi_json (~> 1.0) 
    airbrake (3.1.7) 
     activesupport 
@@ -129,7 +129,7 @@ GEM 
    hashr (0.0.22) 
    hike (1.2.1) 
    honeypot-captcha (0.0.2) 
- i18n (0.6.4) 
+ i18n (0.6.1) 
    journey (1.0.4) 
    jquery-rails (2.2.0) 
     railties (>= 3.0, < 5.0) 
@@ -146,7 +146,7 @@ GEM 
    kgio (2.8.0) 
    listen (0.7.2) 
    lumberjack (1.0.2) 
- mail (2.4.4) 
+ mail (2.5.3) 
     i18n (>= 0.4.0) 
     mime-types (~> 1.16) 
     treetop (~> 1.4.8) 
@@ -155,7 +155,7 @@ GEM 
    mime-types (1.21) 
    mocha (0.10.5) 
     metaclass (~> 0.0.1) 
- multi_json (1.6.1) 
+ multi_json (1.7.1) 
    mysql2 (0.3.11) 
    nested_form (0.3.1) 
    net-scp (1.0.4) 
@@ -180,14 +180,14 @@ GEM 
     rack 
    rack-test (0.6.2) 
     rack (>= 1.0) 
- rails (3.2.12) 
-  actionmailer (= 3.2.12) 
-  actionpack (= 3.2.12) 
-  activerecord (= 3.2.12) 
-  activeresource (= 3.2.12) 
-  activesupport (= 3.2.12) 
+ rails (3.2.13) 
+  actionmailer (= 3.2.13) 
+  actionpack (= 3.2.13) 
+  activerecord (= 3.2.13) 
+  activeresource (= 3.2.13) 
+  activesupport (= 3.2.13) 
     bundler (~> 1.0) 
-  railties (= 3.2.12) 
+  railties (= 3.2.13) 
    rails_admin (0.4.3) 
     bootstrap-sass (~> 2.2) 
     builder (~> 3.0) 
@@ -202,9 +202,9 @@ GEM 
     rails (~> 3.1) 
     remotipart (~> 1.0) 
     sass-rails (~> 3.1) 
- railties (3.2.12) 
-  actionpack (= 3.2.12) 
-  activesupport (= 3.2.12) 
+ railties (3.2.13) 
+  actionpack (= 3.2.13) 
+  activesupport (= 3.2.13) 
     rack-ssl (~> 1.3.2) 
     rake (>= 0.8.7) 
     rdoc (~> 3.4) 
@@ -212,7 +212,7 @@ GEM 
    raindrops (0.10.0) 
    rake (10.0.3) 
    rb-fsevent (0.9.1) 
- rdoc (3.12.1) 
+ rdoc (3.12.2) 
     json (~> 1.4) 
    remotipart (1.0.2) 
    rest-client (1.6.7) 
@@ -266,7 +266,7 @@ GEM 
     eventmachine (>= 0.12.6) 
     rack (>= 1.0.0) 
    thor (0.17.0) 
- tilt (1.3.4) 
+ tilt (1.3.6) 
    tire (0.5.4) 
     activemodel (>= 3.0) 
     hashr (~> 0.0.19) 
@@ -280,7 +280,7 @@ GEM 
     actionpack (>= 3.1) 
     execjs 
     railties (>= 3.1) 
- tzinfo (0.3.35) 
+ tzinfo (0.3.37) 
    uglifier (1.3.0) 
     execjs (>= 0.3.0) 
     multi_json (~> 1.0, >= 1.0.2) 
@@ -325,7 +325,7 @@ DEPENDENCIES 
    nested_form 
    newrelic_rpm (~> 3.5.5.38) 
    pry 
- rails (= 3.2.12) 
+ rails (= 3.2.13) 
    rails_admin 
    rb-fsevent (= 0.9.1) 
    rmagick 

Altri poi questi due file non è cambiato nulla.

Dalla lettura Diagnosing the cause of slow view rendering Capisco che roba nella pipeline di asset può rallentarlo, ma non vedo una differenza quando cambio il valore di "config.assets.debug = false" all'interno di development.rb.

Suppongo di avere molte risorse nella mia pipeline di asset che devo ancora pulire, cosa che farò prima della distribuzione in produzione, ma mi chiedo perché questo abbia improvvisamente causato il ritardo dopo l'aggiornamento di Rails. La domanda è: che cosa sta causando e posso fare qualcosa al riguardo?

Fatemi sapere se avete bisogno di maggiori informazioni. Qualsiasi aiuto è molto apprezzato.

EDIT: Ho anche creato un problema su github.com/rails/rails, che sembra essere stato rilevato come una regressione: https://github.com/rails/rails/issues/9803.

+0

hai provato in esecuzione il server con 'RACK_ENV = production' – Maz

+0

? L'ho fatto ora .. Nessuna differenza (Completato 200 OK in 4566ms (Visualizzazioni: 4510.4ms | ActiveRecord: 28.8ms)), bu t grazie per il suggerimento. – Fritzz

+0

Nessuna differenza per la mia applicazione di produzione dopo l'aggiornamento. – Intrepidd

risposta

10

Abbiamo avuto gli stessi problemi con Discourse. Ho estratto le correzioni rilevanti in una patch scimmia è possibile applicare a un Rails 3.2 applicazione:

module HTML 
    class WhiteListSanitizer 
     # Sanitizes a block of css code. Used by #sanitize when it comes across a style attribute 
    def sanitize_css(style) 
     # disallow urls 
     style = style.to_s.gsub(/url\s*\(\s*[^\s)]+?\s*\)\s*/, ' ') 

     # gauntlet 
     if style !~ /\A([:,;#%.\sa-zA-Z0-9!]|\w-\w|\'[\s\w]+\'|\"[\s\w]+\"|\([\d,\s]+\))*\z/ || 
      style !~ /\A(\s*[-\w]+\s*:\s*[^:;]*(;|$)\s*)*\z/ 
     return '' 
     end 

     clean = [] 
     style.scan(/([-\w]+)\s*:\s*([^:;]*)/) do |prop,val| 
     if allowed_css_properties.include?(prop.downcase) 
      clean << prop + ': ' + val + ';' 
     elsif shorthand_css_properties.include?(prop.split('-')[0].downcase) 
      unless val.split().any? do |keyword| 
      !allowed_css_keywords.include?(keyword) && 
       keyword !~ /\A(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)\z/ 
      end 
      clean << prop + ': ' + val + ';' 
      end 
     end 
     end 
     clean.join(' ') 
    end 
    end 
end 

module HTML 
    class WhiteListSanitizer 
    self.protocol_separator = /:|(&#0*58)|(&#x70)|(&#x0*3a)|(%|&#37;)3A/i 

    def contains_bad_protocols?(attr_name, value) 
     uri_attributes.include?(attr_name) && 
     (value =~ /(^[^\/:]*):|(&#0*58)|(&#x70)|(&#x0*3a)|(%|&#37;)3A/i && !allowed_protocols.include?(value.split(protocol_separator).first.downcase.strip)) 
    end 
    end 
end 

module ActiveRecord 
    class Relation 

    def where_values_hash 
     equalities = with_default_scope.where_values.grep(Arel::Nodes::Equality).find_all { |node| 
     node.left.relation.name == table_name 
     } 

     Hash[equalities.map { |where| [where.left.name, where.right] }].with_indifferent_access 
    end 

    end 
end 

module ActiveRecord 
    class PredicateBuilder # :nodoc: 
    def self.build_from_hash(engine, attributes, default_table, allow_table_name = true) 
     predicates = attributes.map do |column, value| 
     table = default_table 

     if allow_table_name && value.is_a?(Hash) 
      table = Arel::Table.new(column, engine) 

      if value.empty? 
      '1 = 2' 
      else 
      build_from_hash(engine, value, table, false) 
      end 
     else 
      column = column.to_s 

      if allow_table_name && column.include?('.') 
      table_name, column = column.split('.', 2) 
      table = Arel::Table.new(table_name, engine) 
      end 

      attribute = table[column] 

      case value 
      when ActiveRecord::Relation 
      value = value.select(value.klass.arel_table[value.klass.primary_key]) if value.select_values.empty? 
      attribute.in(value.arel.ast) 
      when Array, ActiveRecord::Associations::CollectionProxy 
      values = value.to_a.map {|x| x.is_a?(ActiveRecord::Base) ? x.id : x} 
      ranges, values = values.partition {|v| v.is_a?(Range) || v.is_a?(Arel::Relation)} 

      array_predicates = ranges.map {|range| attribute.in(range)} 

      if values.include?(nil) 
       values = values.compact 
       if values.empty? 
       array_predicates << attribute.eq(nil) 
       else 
       array_predicates << attribute.in(values.compact).or(attribute.eq(nil)) 
       end 
      else 
       array_predicates << attribute.in(values) 
      end 

      array_predicates.inject {|composite, predicate| composite.or(predicate)} 
      when Range, Arel::Relation 
      attribute.in(value) 
      when ActiveRecord::Base 
      attribute.eq(value.id) 
      when Class 
      # FIXME: I think we need to deprecate this behavior 
      attribute.eq(value.name) 
      when Integer, ActiveSupport::Duration 
      # Arel treats integers as literals, but they should be quoted when compared with strings 
      column = engine.connection.schema_cache.columns_hash[table.name][attribute.name.to_s] 
      attribute.eq(Arel::Nodes::SqlLiteral.new(engine.connection.quote(value, column))) 
      else 
      attribute.eq(value) 
      end 
     end 
     end 

     predicates.flatten 
    end 
    end 
end 

con le patch di sicurezza applicate e le rotaie 3.2.13 ritornato i rendimenti di performance alla normalità. Siamo anche stati con errori UTF-8 durante la precompilazione delle nostre risorse e questo non si verifica più. Sembra che ci sia un gruppo di non-sicurezza cose relative nella patch 3.2.13 che sta rompendo roba :(

+1

Wow, ottima risposta. Ho anche visto la tua risposta sul problema del github dei binari che ho postato, grazie. Dato che la mia app non è ancora in diretta, tornerò alla 3.2.12 ora e attendo che venga riparata l'ultima versione. Sembra essere il modo più intelligente per andare ora. Grazie! – Fritzz

+0

Potrei piangere Sono così grato! Grazie mille volte! Da ~ 5 secondi a ~ 500 ms – hrdwdmrbl

+0

Ero un po 'preoccupato di applicare una patch ai binari direttamente da SO, ma questo controlla grazie mille amico sei un vero toccasana !!! –

8

@fredwu risolto questo in una richiesta di pull: https://github.com/rails/rails/pull/9820

Per utilizzare questa correzione subito (e non c'è bisogno di aspettare una nuova release Rails) è possibile scimmia rattoppare la classe AssetsPaths nella propria applicazione utilizzando il seguente codice:

module Sprockets 
    module Helpers 
    module RailsHelper 
     class AssetPaths < ::ActionView::AssetPaths 
     private 
     def rewrite_extension(source, dir, ext) 
      source_ext = File.extname(source)[1..-1] 
      if !ext || ext == source_ext 
      source 
      elsif source_ext.blank? 
      "#{source}.#{ext}" 
      elsif File.exists?(source) || exact_match_present?(source) 
      source 
      else 
      "#{source}.#{ext}" 
      end 
     end 
     end 
    end 
    end 
end