2015-06-14 7 views
15

Meine Rails 4.1 App verbindet sich über SSH mit einem zweiten, nicht primären Server für Backend-Jobs. Wenn die Rails-App also täglich neu gestartet wird, muss die SSH-Verbindung aktiv sein (der zweite, nicht primäre Server muss leben/steigen), andernfalls stürzt die App ab. Dies ist darauf zurückzuführen, dass das eifrige Laden standardmäßig in production.rb (config.eager_load = true) auf "True" gesetzt ist.Welchen Leistungseinfluss hat die Deaktivierung von eager_load in production.rb?

Ich bin versucht, diese Abhängigkeit durch die Deaktivierung von Eager Lasten zu brechen, aber ich bin nicht in der Lage, viele Informationen über die Auswirkungen auf die Leistung zu finden. Also, meine Fragen sind ...

1) Wenn auf false eingestellt ist, wird das einfach die Startzeit der App verlangsamen, oder wird die App eifrig Ressourcen laden das erste Mal, wenn sie getroffen werden?

3) Wenn einfach ausgeschaltet ist, in welchem ​​Maße wird sich dies auf die Leistung der App auswirken (eher subjektive Frage)?

2) Das Modell, das die SSH-Verbindung durchführt, befindet sich unter dem Ordner app\models\legacy. Anstatt auf false zu ändern, kann dieser Ordner von den geladenen Ressourcen ausgeschlossen werden? Wenn das so ist, wie? Ich glaube, ich müsste config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')] bearbeiten, aber nicht ganz sicher.

production.rb:

# Eager load code on boot. This eager loads most of Rails and 
    # your application in memory, allowing both thread web servers 
    # and those relying on copy on write to perform better. 
    # Rake tasks automatically ignore this option for performance. 
    config.eager_load = true 
+1

Anstatt das eifrige Laden zu ändern, konnten Sie die Klasse nicht ändern, so dass das Laden/Parsing der Klasse nicht direkt auf ssh zugreift? Oder es robuster machen? – nathanvda

Antwort

1

Einstellung eager_load=false wahrscheinlich beschleunigen Inbetriebnahme Ihrer App wird weil das Laden von bis nötig verschoben werden.

Die Strafe ist jedoch, dass Ihre App wahrscheinlich mehr Speicher (die in der Regel die seltenste Serverressource) verwendet. Ich vermute, dass Sie auch Threading-Fehler auftreten können, wenn Sie einen Multithread-Server (z. B. Puma) mit eager_load=false verwenden.

Da Rails automatisch alle app/* Verzeichnisse in seinen eifrigen Ladepfaden enthält, kann ich mir keinen einfachen Weg vorstellen, app/models/legacy auszuschließen, während ich alles andere eifrig lade.

Stattdessen könnten Sie den Inhalt von app/models/legacy zu z. legacy/ an der Wurzel Ihres Projektes und fügen hinzu, dass zum autoload_paths:

config.autoload_paths += %W(#{config.root}/legacy) 

Jetzt Rails noch in der Lage sein, diese Dateien zu finden, aber sie werden nicht mit Spannung in der Produktion geladen werden.

+0

Danke Matt - akzeptierte deine Antwort als Antwort. – user1322092

Verwandte Themen