PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails Performance-Tuning für die Produktion?

Ich habe einige Zeit damit verbracht, meine App auf Heroku zu optimieren, und habe einige Zeit damit verbracht, an der Leistungsoptimierung von Rails-Apps in einer Vielzahl von Einstellungen zu arbeiten.

Wenn ich ab -n 300 -c 75 ...myapp.com.... # ausführe, das ein Backup zu meiner Hauptseite ist und im kostenlosen Cedar-Plan mit unicorn enthalten ist

Requests per second:    132.11 [#/sec] (mean)
Time per request:       567.707 [ms] (mean)
Time per request:       7.569 [ms] (mean, across all concurrent requests)

(Dies ist gegen eine Homepage, die nichts Intensives tut, daher stelle ich sie nur als Beispiel für „Wie schnell könnte Heroku im kostenlosen Plan mit einer sehr einfachen Seite sein?“-Beispiel zur Verfügung, nicht als „Ihre Apps sollten sein so schnell")

Hier ist meine Rails Performance Tuning 101-Checkliste:

  1. Messen Sie zuerst die Browser-/Seitenladezeit (der Browser stellt viele Anfragen, ab informiert Sie nur über eine davon, und normalerweise ist Ihre Hauptseitenanfrage nicht das Problem), erhalten Sie Seitenlade-Baseline-Zahlen von Tools wie www.webpagetest.org oder www.gtmetrix.com für die öffentlich zugänglichen Seiten oder die Browser-Tools Yslow, Google Page Speed ​​oder Dynatrace für die privaten Seiten. Wenn Sie sich das Wasserfalldiagramm zum Laden der Seite (das „Netz“-Bedienfeld in Chrome/Firefox) ansehen, zeigt es normalerweise, dass Ihr HTML schnell geladen wird (unter einer Sekunde), aber alles andere dauert 1-3 Sekunden zum Laden. Befolgen Sie die Yslow-/Pagespeed-Empfehlungen zur Verbesserung (stellen Sie sicher, dass Sie die Ressourcen-Pipeline von Rails 3.1 in vollem Umfang nutzen)

  2. Lesen Sie Ihre Protokolldateien/neue Relikte durch, um den Sweet Spot der „langsamsten/am häufigsten getroffenen“ Anfrage zu finden, und profilieren Sie, was für diese Anfrage passiert (ist es langsamer Rubin/viel Mem-Nutzung oder viele Abfragen?), die Sie brauchen eine zuverlässige Möglichkeit zu haben, Leistungsprobleme zu erkennen und zu überwachen, und nicht einfach willkürlich Dinge zu ändern. Sobald Sie einige Zielbereiche identifiziert haben, erstellen Sie Testskripte, um vor/nach dem Testen zu helfen und zu beweisen, dass Ihre Änderung hilft, und zu erkennen, ob sich eine Regression einschleicht.

  3. Das Fehlen von Indizes für db-Spalten ist eines der häufigsten Probleme und am einfachsten zu beheben. Führen Sie EXPLAIN für die Zielabfragen aus oder sehen Sie sich Ihr Protokoll für langsame Abfragen an, um zu sehen, was der Abfrageplaner tut. Fügen Sie nach Bedarf Indizes für Fremdschlüssel, Suchspalten oder Primärdaten (überdeckender Index) hinzu. Testen Sie erneut mit tatsächlichen Produktionsdaten, um zu beweisen, dass es einen Unterschied macht. (Sie können EXPLAIN in heroku ausführen sowie Abfragen für fehlende oder unbenutzte Indizes ausführen)

  4. Die meisten schlecht funktionierenden Rails-Apps leiden unter N+1-Abfragen, weil es so einfach ist, order.owner.address.city zu schreiben und nicht darüber nachzudenken, was passiert, wenn sich das in einer Schleife befindet. N+1-Abfragen sind nicht unbedingt langsame Abfragen, daher werden sie nicht im Protokoll für langsame Abfragen angezeigt, es gibt nur viele davon, und es ist effizienter, alles auf einmal zu tun. Verwenden Sie :include oder .includes(), um diese Daten eifrig zu laden, oder versuchen Sie, Ihre Abfrage auf andere Weise durchzuführen.

  5. Analysieren Sie den Ablauf Ihrer App und suchen Sie nach Caching-Möglichkeiten. Wenn der Benutzer zwischen der Indexseite und einer Detailseite hin und her springt und wieder zurück, würde ihm vielleicht eine Ajax-Ansicht der Details, ohne die Indexseite zu verlassen, die benötigten Daten schneller liefern. Ich habe einige mehr Gedanken darüber in meinem Blog

Ich habe auf der diesjährigen WindyCityRails-Konferenz in Chicago einen Vortrag über diese Techniken und andere Ideen gehalten. Sie können das Video hier auf meiner Website www.RailsPerformance ansehen .com-Blog Was ich an Heroku liebe, ist, dass man von Anfang an skalierbar sein muss. Wenn Sie sich die Diskussionen auf der Mailingliste ansehen, sehen Sie, dass die meisten Leute die Best Practices für die Leistung kennen und wissen, wie Sie das Beste aus dem Server herausholen können. Mir gefällt auch, wie Sie, wenn Sie günstig bleiben wollen, die Tricks zur Leistungsoptimierung lernen, mit denen Sie am meisten erreichen.

Viel Glück!