Rails Performance Tuning do produkcji?

Zbliżam się do wdrożenia aplikacji zbudowanej na Rails 3.1.x i zaczął przeprowadzać testy wydajności. Po pobraniu ab przez chwilę, widzę bardzo zniechęcające wyniki dające około 15 zapytań / sekundę na Heroku.

Podczas testowania lokalnie widzę podobne wyniki, które naprawdę pokazują, że jest to problem z aplikacją bardziej niż cokolwiek innego.

Mam jednorożca, który jest o 40% szybszy niż Thin na seledynowym cedrze. Co więcej, używam PGSQL shared db.

Mam nadzieję, że ktoś mógłby udostępnić listę prania lub zasadniczo listę kontrolną uruchomienia, którą powinienem przejść, przygotowując aplikację do produkcji i przechodząc do need for speed tuning. Do tej pory nie znalazłem zwięzłej listy przedmiotów, które można przenieść, co wydaje się mieć sens, biorąc pod uwagę moją sytuację.

Lub jeśli masz solidne doświadczenie praktyczne w poruszaniu takich kwestii, każdy wkład będzie mile widziany!

Author: ylluminate, 2011-11-05

4 answers

Spędziłem trochę czasu na strojeniu mojej aplikacji na heroku i spędziłem trochę czasu pracując nad strojeniem wydajności aplikacji Rails w różnych ustawieniach.

Kiedy uruchamiam ab-n 300-C 75 ...myapp.com.... # który jest backupem na mojej głównej stronie i jest na darmowym planie cedar z unicorn
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)

(to jest przeciwko stronie głównej, która nie robi nic intensywnego, więc podaję to tylko jako "jak szybko heroku może być na bezpłatnym planie z bardzo prostą stroną?"przykład, a nie" twoje aplikacje powinny be this fast")

Oto moja lista kontrolna Rails Performance Tuning 101:

  1. Najpierw Zmierz czas ładowania przeglądarki/strony (przeglądarka wysyła wiele żądań, ab informuje Cię tylko o jednym z nich, a zazwyczaj żądanie strony głównej nie jest problemem), uzyskaj numery linii bazowych ładowania strony z narzędzi takich jak www.webpagetest.org lub www.gtmetrix.com[13]} dla stron publicznych, lub narzędzia przeglądarki Yslow, Google page speed, lub dynatrace dla stron prywatnych. Jeśli patrzysz na diagram ładowania strony (panel 'Net' w chrome/firefox), zwykle pokazuje, że Twój html ładuje się szybko( w ciągu sekundy), ale wszystko inne trwa 1-3 sek. Należy postępować zgodnie z zaleceniami dotyczącymi prędkości Yslow/page, aby dowiedzieć się, jak poprawić (upewnij się, że używasz w pełnym zakresie materiałów potoku zasobów Rails 3.1)

  2. Przeczytaj pliki dziennika / nowy relic, aby znaleźć słodki punkt żądania "najwolniejszy/najczęściej trafiony" i profiluj, co się stanie w tym przypadku request (czy to powolne użycie ruby/dużo mem, czy dużo zapytań?) Musisz mieć niezawodny sposób wykrywania i monitorowania problemów z wydajnością, a nie tylko zmieniać rzeczy losowo. Po zidentyfikowaniu niektórych obszarów docelowych Utwórz skrypty testowe, aby pomóc w testowaniu przed/po testowaniu i udowodnić, że Twoja zmiana pomaga, a także wykryć, czy regresja wkrada się.

  3. Brak indeksów w kolumnach db jest jednym z najczęstszych i najłatwiejszych do rozwiązania problemów. Uruchom wyjaśnij na zapytaniach docelowych, możesz też przejrzeć dziennik powolnych zapytań, aby zobaczyć, co robi planista zapytań. Dodawanie indeksów dla kluczy obcych, kolumn wyszukiwania lub danych podstawowych (indeks pokrycia), stosownie do potrzeb. Ponownie przetestuj rzeczywiste dane produkcyjne, aby udowodnić, że to robi różnicę. (możesz uruchamiać explain w heroku, a także uruchamiać zapytania o brakujące lub nieużywane indeksy)

  4. Większość słabo działających aplikacji Rails cierpi na N + 1 zapytań, ponieważ jest tak łatwa do napisania.właściciel.adres.miasto i nie myśleć o tym, co się dzieje kiedy to będzie w pętli. N + 1 zapytania niekoniecznie są powolne zapytania, więc nie pojawiają się w dzienniku powolnych zapytań, to po prostu, że jest ich wiele, a jego bardziej efektywne, aby zrobić to wszystko na raz. Zastosowanie: include lub .includes() dla chętnego ładowania tych danych, lub spójrz na wykonanie zapytania w inny sposób.

  5. Analizuj przepływ aplikacji i Szukaj możliwości buforowania. Jeśli użytkownik odbija się tam iz powrotem między stroną indeksu i stroną szczegółów i z powrotem, być może ajax widok szczegółów, bez opuszczania strony indeksu, dałby im dane, których potrzebują w szybszy sposób. Napisałem kilka więcej myśli na ten temat na moim blogu

Na tegorocznej konferencji WindyCityRails wygłosiłem prezentację na temat tych technik i innych pomysłów w Chicago. Możesz [[38]} zobaczyć film tutaj na moim www.RailsPerformance.com blog To, co kocham w heroku, to to, że musisz być skalowalny od samego początku. Gdy spojrzysz na dyskusje na mailingu lista, widać, że większość ludzi jest świadomi najlepszych praktyk wydajności, i jak uzyskać jak najwięcej z serwera. Podoba mi się również, jak chcesz pozostać tani, dowiesz się, jak sztuczki tuningowe wydajności, które sprawią, że będziesz najbardziej bang. Powodzenia!
 19
Author: J_McCaffrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-08 03:13:12

Są dość nisko wiszące owoce, które prawie zawsze dają całkiem godne zyski: {]}

  1. zmniejsz liczbę zapytań DB, używając bardziej wydajnych instrukcji ActiveRecord. Upewnij się, że używasz include i join tam, gdzie jest to właściwe, i upewnij się, że używasz empty? przez any? tam, gdzie to możliwe, aby uniknąć SELECTs, gdy potrzebujesz tylko COUNT.
  2. szczególnie na cięższych stronach, widoki pamięci podręcznej, nawet jeśli tylko przez kilka minut. Często można rozbić większe lub dynamiczne elementy na częściowe, które można buforować bez żadnych negatywnych skutków.
  3. Przenieś wszelkie działania w sieci do zadań w tle. Obejmuje to wysyłanie e-maili, pobieranie stron z innej strony internetowej i wykonywanie połączeń API (nawet [szczególnie?] do Heroku). Istnieje wiele naprawdę dobrych bibliotek przetwarzania zadań w tle w Ruby, DelayedJob jest bardzo popularny, ponieważ działa z każdą bazą danych ActiveRecord, ale moim ulubionym jest Resque.

Musisz uważać, aby nie wydawać zbyt wiele czas optymalizacji procedur Ruby. Chyba że robisz coś z ogromną ilością danych lub przetwarzania (np. zmiana rozmiaru obrazu) prawdopodobnie nie zauważysz bardzo znaczących korzyści z optymalizacji pętli lub minimalizacji zużycia pamięci. A jeśli okaże się, że niektóre strony są problematyczne, zajrzyj do swoich dzienników i zobacz, co dzieje się podczas tych żądań.

A jeśli jeszcze nie jesteś, aplikacje do automatycznego skalowania, takie jak HireFireApp, są świetne do obsługi wielu żądań, skalując poziomo bez koszt uruchomienia zewnętrznych hamowni w okresach wolnych.

PS: istnieje nowy dodatek Heroku o nazwie Blitz , który pozwala przetestować jednoczesne obciążenie do 5000 użytkowników.

 6
Author: coreyward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 00:54:15

Najbardziej kompleksową odpowiedzią jest użycie czegoś takiego jak NewRelic do instrumentowania aplikacji i znajdowania wolnych miejsc. Następnie możesz zastosować optymalizacje lub buforowanie do kodu, aby wygładzić te wolne miejsca. Jako klient Heroku otrzymujesz nową instalację za darmo-jest to dodatek, który możesz dodać do swojego wdrożenia z konsoli Heroku.

Kiedy już zrozumiesz, co Cię spowalnia, możesz zacząć się do tego zbliżać. Heroku obsługuje większość dev-ops koniec strojenia wydajności, więc nie musisz nic robić. Jednak nadal będziesz w stanie osiągnąć duże korzyści, optymalizując zapytania do bazy danych i wykonując, w stosownych przypadkach, buforowanie na poziomie fragmentów i akcji.

 4
Author: Chris Heald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 00:49:08

Jako że nic jeszcze nie wyskoczyło, podam odpowiedź na PostgreSQL część. Nie mogę asystować przy Ruby.

Możesz znaleźć doskonałe punkty wyjścia do optymalizacji wydajności na PostgreSQL wiki.

  • strojenie ustawień serwera (Nie wiem ile jest możliwe z Heroku)
  • zwróć szczególną uwagę na powolne zapytania
  • Sprawdź swój sprzęt (Nie dotyczy Heroku)
 2
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 00:40:41