Performance-Profiling für Ihre Rails-App mit Rack-Mini-Profiler

Egal, ob Sie ein Neuling oder ein erfahrener Ruby on Rails-Entwickler sind, Sie werden früher oder später auf Leistungsprobleme stoßen.

Rack Mini Profiler hilft Ihnen bei der einfachen Erkennung Datenbankprobleme, Speicherprobleme und Von Gems/Libs verbrachte Zeit.

Dieses Tool wurde für den Einsatz in der Produktion entwickelt, funktioniert aber auch in der Entwicklung einwandfrei. Sie müssen jedoch einige Änderungen an der Entwicklung vornehmen. HINWEIS: Rails-Entwicklungsmodus spezifiziert Klassen nachladen Bei jeder Anfrage wirkt sich dies auf Ihre Profilkennzahlen aus.

Ich werde Ihnen zeigen, wie Sie dieses Tool verwenden, um die häufigsten Leistungsprobleme von Ruby on Rails zu erkennen.

Rack-Mini-Profiler installieren

Lassen Sie uns die folgenden Edelsteine ​​​​hinzufügen.

Gem-Dateien

...

gem 'rack-mini-profiler'
gem 'flamegraph'
gem 'stackprof'
gem 'memory_profiler'

Starten Sie den Server – Sie sollten das Geschwindigkeitsabzeichen in der oberen linken Ecke sehen.

Jetzt lassen wir die Anwendung wie in einer Produktionsumgebung laufen.

Ändern Sie zunächst den Rack-Mini-Profiler-Speicher in Speicher statt in Dateisystem:

config/initializers/rack_mini_profiler.rb

Rack::MiniProfiler.config.storage = Rack::MiniProfiler::MemoryStore

Deaktivieren Sie als Nächstes SSL in der lokalen Umgebung:

config/environments/production.rb

config.force_ssl = false

Lassen Sie uns nun das Datenbank-Setup ausführen, Assets kompilieren und die geheime Schlüsselbasis festlegen:

rails db:reset RAILS_ENV=production 
rails assets:precompile RAILS_ENV=production 
rails s RAILS_ENV=production SECRET_KEY_BASE=secret 

Geschwindigkeitsabzeichen

Wenn Sie die Stamm-URL besuchen, sehen Sie das Geschwindigkeitsabzeichen, das Ihnen zeigt, wie viel Zeit die Anwendung zum Rendern benötigt hat. Es zeigt Ihnen auch die im Layout verbrachte Zeit, Ansichten und Teilbilder.

Wenn Sie auf das Abzeichen klicken, werden einige detaillierte Informationen angezeigt:

Dauer (ms)zeigt Ihnen die gesamte Anfragezeit.
Anfragezeigt Ihnen, wie viele Abfragen Sie generieren.
% in sql zeigt Ihnen, wie viel Prozent der Zeit in SQL verbracht wird (Die Verwendung einer Produktionsdatenbankkopie oder etwas Ähnlichem ist viel besser als die Verwendung von Entwicklungsdatenbankdaten).
Dom Content Loaded-Ereignis zeigt Ihnen, wie viel Zeit zwischen dem Erhalt einer Antwort und dem Abschluss des Ladens aller Inhalte vergeht. (Je weniger, desto besser, die Optimierung des Frontends wird diese Zeit verkürzen).

Sehen wir uns nun die SQL-Links an, um zu sehen, was wir bekommen haben.

Sie sehen die Renderzeit nach Teil und auch die in der Abfrage verbrachte Zeit und die Abfrage selbst und die Zeile, in der die Abfrage ausgeführt wurde. Wenn die SQL-Abfrage teuer ist, können Sie erwägen, sie zu reparieren/entfernen oder wahrscheinlich zwischenzuspeichern, um das Problem zu lösen. Manchmal kann es nichts weiter als ein Fehlen sein include.

Flammendiagramm

Hinzufügen ?pp=flamegraph an die URL-Abfragezeichenfolge, rendert die Anwendung das Flamegraph-Diagramm.

Y ist die Stapelebene, während X ist die Zeit. Einfach richtig?

Scrollen Sie, um weitere Details im Diagramm anzuzeigen.

Unten auf der Seite sehen Sie einige Kästchen mit unterschiedlichen Farben, der Prozentsatz ist der Prozentsatz der Zeit, die die Anfrage in diesem Stapelrahmen verbracht hat.

Jede Anwendung zeigt unterschiedliche Metriken, möglicherweise haben Sie einige Edelstein-Helfer in der Ansicht.

Sagen wir number_to_phone, und Sie haben 100 Datensätze auf der Seite, die diesen Helfer in jedem Partial aufrufen, was mehr Zeit zum Rendern jedes Partials darstellt. Eine Lösung könnte darin bestehen, den Rails-Helfer nicht mehr zu verwenden und JavaScript die Arbeit erledigen zu lassen. Auf diese Weise wird sich der Flammengraph nicht über die Zeit beschweren, die dieser langsame Helfer aufwendet. Manchmal werden Sie feststellen, dass es Helfer oder Methoden gibt, die teurer sind als Sie dachten, in diesen Fällen könnten Sie Ihre eigenen schreiben hell Implementierung.

Garbage-Collection-Profiling

Das Debuggen von Speicherproblemen in der Produktion ist einfach mit rack-mini-profiler. Lassen Sie uns herausfinden, wie.

Profil-GC

Hinzufügen ?pp=profile-gc an die URL-Abfragezeichenfolge, wird eine verrückt lange Ausgabe erzeugen. Gehen Sie einen Kaffee trinken, während es fertig ist, es braucht Zeit. 😃

Finden Sie die Neue Bytes, die außerhalb von Ruby-Heaps zugewiesen wurden Sektion.

Wenn diese Zahl größer als 8 MB ist, sollten Sie mit der Untersuchung beginnen, um zu sehen, was in dieser bestimmten Anfrage vor sich geht, da etwas viel Speicher verbraucht.

Kommen wir nun zum Durch Anforderung verursachtes ObjectSpace-Delta Sektion,

Sagen Sie, Sie haben String : 7300 was bedeutet, dass Sie nach dieser Anfrage 7300 weitere Strings haben.

Als nächstes die ObjectSpace-Statistiken Sektion.

Dies ist die Gesamtzahl der Objekte nach Klasse, die in der VM aktiv sind. Wahrscheinlich finden Sie die aufgeführt MIME::Type oder MIME::Types::Container Das liegt daran, dass es einen Edelstein in Ihrem geben könnte Gemfile wer verwendet eine alte Version der ruby-mime-types Juwel. Dies könnte behoben werden, indem eine neuere Version von eingerichtet wird ruby-mime-types gem in Ihrem Gemfile.

Endlich, das String-Statistiken Sektion.

Dies ist die Häufigkeit, mit der eine Zeichenfolge zugewiesen wurde. Diese Zahlen können verringert werden, indem diese Zeichenfolgen nach verschoben werden frozen CONSTANTS. Stellen Sie sich vor, Sie haben den String „Hallo“ 3000 Mal in einer Anfrage zugewiesen. Um diese Zuordnung zu beheben, verschieben wir die Zeichenfolge “Hallo” in eine Konstante, jetzt haben Sie nur noch eine Zuordnung für diese Zeichenfolge anstelle von 3000.

Profilspeicher

Hinzufügen ?pp=profile-memory an die URL-Abfragezeichenfolge, teilt uns mit, welche Codezeile das ist zuordnen ein gegebenes Objekt.

Wir interessieren uns für die „beibehaltenen“ Objekte (scrollen Sie in der Ausgabe nach unten und Sie finden den Abschnitt „beibehalten“), diese Art von Objekten bleibt bestehen, nachdem die Anfrage abgeschlossen ist. Hier treten in der Regel Lecks bei Ruby-Objekten auf.

Ausnahmen sind langsam

Hinzufügen ?pp=trace-exceptions an die URL-Abfragezeichenfolge, gibt alle Stellen zurück, an denen Ihre Anwendung Ausnahmen auslöst.

Vermeiden Sie die Verwendung von Ausnahmen als Form der Flusskontrolle da Ausnahmen langsam sind. Anstatt überall Ausnahmen auszulösen, könnten Sie die Ausnahmebehandlung an eine Klasse delegieren, diese Klasse gibt dem Endbenutzer so schnell wie möglich etwas zurück.

Langsam:

catch A -> raise B -> catch B -> raice C -> catch C -> return

Schnell:

catch A -> handle exception & return

Manchmal die Schnell Option ist nicht möglich, aber Sie sollten immer danach streben. Ausnahmen sollten nicht erwartet werden, denken Sie darüber nach … jetzt wiederholen Sie mit mir: “Ich werde nicht überall Ausnahmen auslösen, um meine Ruby-Anwendungen zu steuern”.

Fazit

Rack-Mini-Profiler hat verschiedene Tools, mit denen Sie Ihre Rack-basierten Anwendungen wie Rails debuggen und profilieren können. Jetzt, da Sie ein wenig über jedes Tool wissen, sollten Sie in der Lage sein, die langsame Seite zu reparieren, die Sie immer versucht haben zu reparieren.

Abschließende Gedanken und nächste Schritte

Das Hinzufügen von Rack-Mini-Profiler in Produktions- und Entwicklungsumgebungen hilft Ihnen, Leistungsprobleme einfach zu lösen. Sie haben gelernt, wie man ihn in der Entwicklung einrichtet, denken Sie daran, dass Ihre Entwicklungsumgebung dies sein muss sich wie Ihre Produktionsumgebung oder zumindest sehr ähnlich verhalten.

Verwenden Sie rack-mini-profiler, um die Abfragen anzuzeigen, die Ihre Seiten generieren, stellen Sie sicher, dass Sie Ihren Anwendungsfluss nicht mit Ruby-Ausnahmen steuern. Die häufigsten Rails-Probleme beziehen sich auf langsame SQL-Abfragen, große Antworten von Ihrer Rails-App, das Warten auf APIs von Drittanbietern, fehlende Backgound-Jobs und die Liste kann bis ins Unendliche und darüber hinaus gehen.

Jetzt sollten Sie bereit sein, die häufigsten Probleme anzugehen, und wenn Sie den Rack-Mini-Profiler beherrschen, wird es Ihnen leicht fallen, alle Arten von Leistungsproblemen zu lösen.

Similar Posts

Leave a Reply

Your email address will not be published.