2013-03-19 4 views
20

Heute morgen habe ich Schienen von 3.2.12 bis 3.2.13 aktualisiert, was zu einer großen Verzögerung beim Laden meiner Ansichten geführt hat. Dies ist aus meiner Homepage laden:Was verursacht die extreme Langsamkeit beim Wechsel von Gleisen 3.2.12 zu 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) 

Der einzige Unterschied zwischen den beiden Commits es die Rails-Version, die natürlich auch in vielen anderen Edelsteine ​​geführt haben aktualisiert ... Das ist der Unterschied in der 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 

Andere als diese beiden Dateien hat sich nichts geändert.

Von lesen Ich verstehe, dass Zeug in der Asset-Pipeline kann es verlangsamen, aber ich sehe keinen Unterschied, wenn ich den Wert von "config.assets.debug = false" innerhalb von development.rb ändern.

Ich denke, ich habe eine Menge Assets in meiner Asset-Pipeline muss ich noch aufräumen, was ich tun werde, bevor ich in der Produktion bereitstellen, aber ich frage mich, warum dies jetzt plötzlich den Rückstand nach der Aktualisierung von Rails verursacht hat. Frage ist: Was verursacht es und kann ich etwas dagegen tun?

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Jede Hilfe wird sehr geschätzt.

EDIT: Ich habe auch ein Problem auf der github.com/rails/rails, die als Regression abgeholt werden: https://github.com/rails/rails/issues/9803.

+0

haben Sie versucht, Ihren Server laufen mit 'RACK_ENV = PRODUCTION' – Maz

+0

? Habe ich jetzt .. Kein Unterschied (200 OK in 4566ms (Aufrufe: 4510.4ms | ActiveRecord: 28.8ms)), bu Danke für den Vorschlag. – Fritzz

+0

Kein Unterschied für meine Produktionsanwendung nach dem Update. – Intrepidd

Antwort

10

Wir hatten die gleichen Probleme mit Discourse. Ich extrahiert die relevanten Sicherheitsupdates in einen Affen-Patch Sie auf eine Rails 3.2 Applikation anwenden können:

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 

Mit den Sicherheits-Patches angewendet und Rails 3.2.13 die Leistung wieder normal zurückgekehrt. Wir waren auch UTF-8 Fehler beim Vorkompilieren unserer Vermögenswerte und dies ist nicht mehr passiert. Es scheint, gibt es eine Reihe von nicht sicherheitsrelevante Sachen in dem 3.2.13 Patch bezogen, die Sachen brechen :(

+1

Wow, tolle Antwort. Ich habe auch deine Antwort auf der gitub-Ausgabe von gridub gesehen, die ich geposted habe, danke. Da meine App noch nicht live ist, werde ich jetzt einfach zu 3.2.12 zurückkehren und darauf warten, dass die neueste Version repariert wird. Scheint der klügste Weg zu sein, jetzt zu gehen. Vielen Dank! – Fritzz

+0

Ich könnte weinen Ich bin so dankbar! Danke millionenfach! Von ~ 5s Sekunden bis ~ 500ms – hrdwdmrbl

+0

Ich war ein bisschen besorgt über die Anwendung eines Patches auf Schienen direkt von SO, aber das ist ein Dankeschön, vielen Dank du bist ein Lebensretter !!! –

8

fixierte @fredwu dies in einer Pull-Anfrage: https://github.com/rails/rails/pull/9820

dieses Update zu sofort verwenden (und müssen nicht auf eine neue Rails-Version warten) können Sie Affe die AssetsPaths Klasse in Ihrer eigenen Anwendung Patch, indem Sie den folgenden Code:

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