sql >> Database >  >> RDS >> PostgreSQL

Rails Performance Tuning voor productie?

Ik heb wat tijd besteed aan het afstemmen van mijn app op heroku en heb enige tijd gewerkt aan het afstemmen van de prestaties van Rails-apps in verschillende instellingen.

Als ik ab -n 300 -c 75 ...myapp.com.... uitvoer, is dit een back-up naar mijn hoofdsite en staat op het gratis cederplan met eenhoorn

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)

(dit is tegen een startpagina die niets intens doet, dus ik geef het alleen als een "hoe snel zou heroku op het gratis abonnement kunnen zijn met een heel eenvoudige pagina?" voorbeeld, niet als een "je apps zouden moeten zijn zo snel")

Hier is mijn Rails Performance Tuning 101 checklist:

  1. Meet eerst de laadtijd van de browser/pagina (de browser doet veel verzoeken, ab vertelt u slechts over een van hen, en meestal is uw verzoek voor de hoofdpagina niet het probleem), haal baseline-nummers voor het laden van de pagina's van tools zoals www.webpagetest.org of www.gtmetrix.com voor de openbare pagina's, of browsertools Yslow, google page speed of dynatrace voor de privépagina's. Als je naar het watervaldiagram voor het laden van pagina's kijkt (het 'Net'-paneel in chrome/firefox), laat het meestal zien dat je html snel laadt (minder dan een seconde), maar al het andere duurt 1-3 seconden om te laden. Volg de aanbevelingen voor Yslow/paginasnelheid om te verbeteren (zorg ervoor dat u de pijplijn van Rails 3.1-assets volledig gebruikt)

  2. Lees je logbestanden/nieuwe relikwie door om de goede plek van het 'langzaamste/meest getroffen' verzoek te vinden, en maak een profiel van wat er voor dat verzoek gebeurt (is het traag ruby/veel mem-gebruik, of veel vragen?) om een ​​betrouwbare manier te hebben om prestatieproblemen te detecteren en te controleren, en niet zomaar dingen willekeurig te veranderen. Zodra u een aantal doelgebieden heeft geïdentificeerd, maakt u testscripts om u te helpen bij het voor/na het testen en om te bewijzen dat uw wijziging helpt, en om te detecteren of er een regressie binnensluipt.

  3. Het ontbreken van indexen op db-kolommen is een van de meest voorkomende problemen en is het gemakkelijkst op te lossen. Voer uitleg uit op de doelquery's of kijk door uw langzame querylogboek om te zien wat de queryplanner doet. Voeg waar nodig indexen toe voor externe sleutels, zoekkolommen of primaire gegevens (dekkende index). Test opnieuw met actuele productiegegevens om te bewijzen dat het een verschil maakt. (u kunt uitleggen in heroku uitvoeren, evenals query's uitvoeren voor ontbrekende of ongebruikte indexen)

  4. De meeste slecht presterende Rails-apps hebben last van N+1-query's omdat het zo gemakkelijk is om order.owner.address.city te schrijven en niet na te denken over wat er gebeurt als dat in een lus zit. N+1-query's zijn niet per se langzame zoekopdrachten, dus ze verschijnen niet in het logboek voor langzame zoekopdrachten, het zijn er gewoon veel, en het is efficiënter om alles tegelijk te doen. Gebruik :include of .includes() voor het gretig laden van die gegevens, of bekijk uw zoekopdracht op een andere manier.

  5. Analyseer de stroom van uw app en zoek naar cachingmogelijkheden. Als de gebruiker heen en weer springt tussen de indexpagina en een detailpagina, en weer terug, zou een ajax-weergave van de details, zonder de indexpagina te verlaten, hen op een snellere manier de gegevens geven die ze nodig hebben. Ik schreef wat meer gedachten daarover op mijn blog

Ik gaf een presentatie over deze technieken en andere ideeën in Chicago tijdens de WindyCityRails-conferentie van dit jaar. Je kunt de video hier bekijken op mijn www.RailsPerformance .com-blog Wat ik zo leuk vind aan heroku is dat je vanaf het begin schaalbaar moet zijn. Als je naar de discussies op de mailinglijst kijkt, zie je dat de meeste mensen op de hoogte zijn van de best practices voor prestaties en hoe ze het meeste uit de server kunnen halen. Ik vind het ook leuk hoe je, als je goedkoop wilt blijven, leert hoe je de trucs voor het afstemmen van prestaties leert waarmee je het meeste knalt.

Veel succes!



  1. Hoe krijg ik de naam van een document in Alfresco met SQL?

  2. Hoe UNIX_TIMESTAMP() werkt in MariaDB

  3. SQL naar outfile - waar wordt het bestand opgeslagen? (MySQL, Windows)

  4. Сeen virtuele machine maken met Oracle VM Virtual Box