2013-09-21 30 views
5

Próbuję poprawić wydajność mojej aplikacji Rails 3.2 pre-beta hostowanej na Heroku.Na temat nowego reliktu, co przyczynia się do "czasu spędzonego w Ruby" na aplikację Heroku Rails?

Agresywne buforowanie radykalnie poprawiło sytuację, ale nadal zauważam duży wkład w "Czas spędzony w Ruby", gdy patrzę na czas odpowiedzi mojego serwera aplikacji na New Relic (jasnoniebieski na wykresie).

Które części aplikacji Rails zazwyczaj przyczyniają się do tego "czasu Ruby"?

New Relic time spent in ruby

początkowo, że to było z powodu skomplikowanych instrukcji warunkowych w jednym z moich głównych kontrolerów, ale to uproszczone. Moje poglądy są teraz bardzo agresywnie buforowane przy użyciu buforowania fragmentów rosyjskiej lalki i memcache (wow!).

Czy dostarczenie środków statycznych może być przyczyną? (Przeprowadzka do S3/CloudFont znajduje się na liście rzeczy do zrobienia ...)

Dzięki!

(Mam już konfigurację delayed_job i przenieśli wszystko, co mogę w tle. Używam również Unicorn jak mój serwer WWW).

AKTUALIZACJA Performance Tuning

Po agresywne buforowanie, Zacząłem szukać innych sposobów na poprawę wydajności aplikacji.

Najpierw dodałem monitorowanie zbierania śmieci jako sugestię, stwierdzając, że GC nie w znacznym stopniu przyczyniało się do czasu Rubinów.

enter image description here

Następny postanowiłem uderzyć mój atut służąc dodając w CDN (CloudFront poprzez CDNsumo add-on). Interesująco to faktycznie zmniejszyło mój czas Ruby na monitorowanie NR. (CDN został dostarczony, a następnie nagrzany przez ostatni test żądania z prawej strony wykresu poniżej.) Większość moich stron ma kilkaset kb css & javascript - więc nie jest malutka, ale nie masywna.

enter image description here

Wreszcie uaktualniony z rozrusznika bazy danych „podstawowego” do najmniejszego db produkcji „Crane”. Wpłynęło to na efekt dramatyczny. Po niewielkim buforowaniu przez PG aplikacja leci. (ostatnie 3 skoki żądań na wykresie poniżej). Komunikaty domu

enter image description here

Weźmy dla innych próbujących dostosować swoje aplikacje Heroku: (tj. buforowanie, CDN, bazy danych, kod Ruby)

  • Proste strojenie wydajności w wielu obszarach ma efekt synergiczny w poprzek stos. Z drugiej strony, każdy pojedynczy drenaż wydajności będzie wąskim gardłem, którego nie można pokonać, nawet jeśli dostroisz inne obszary (np. Powolne bazy danych Basic lub Dev na Heroku w porównaniu z "kosztowną" produkcyjną bazą danych - powolny podstawowy db zabijał wydajność mojej aplikacji).
  • NewRelic jest niezbędny w pracy tam, gdzie można uzyskać najwięcej korzyści.

Odpowiedz

7

Czas "Ruby" jest w rzeczywistości "wiadrem" dla śledzenia NewRelic. Pozostałe kategorie to wyraźne środki (np. Czas spędzony na wywoływanie do memcached). Czas Ruby nie jest spędzany w jednym z tych kubłów.

Co dzieje się w czasie "Ruby"? Kandydatem numer jeden jest Garbage Collection (GC). Jeśli używasz Ruby 1.9+, można włączyć NewRelic profilowanie GC tworząc inicjator jak config/initializers/newrelic.rb z następujących czynności:

GC::Profiler.enable 

To będzie śledzić GC czas jako odrębnej kategorii NewRelic dla Ciebie.

Jeśli jesteś w dobrej kondycji na GC, następnym krokiem jest skorzystanie z widoku Transakcji internetowych, aby zobaczyć, jak rozkładają się te średnie czasy. Być może jedna lub dwie akcje w twojej aplikacji są okropnymi wykonawcami i odpowiadają za te średnie.

Życzymy powodzenia i zachęcamy do bezpośredniego kontaktu, jeśli nadal masz problemy. Strojenie wydajności to czarna sztuka.

+1

Dzięki Winfield, to świetny pomysł. Dodam profilowanie GC i przejdę głębiej do poglądów NC. –

+0

Jeszcze raz dziękuję Winfield za sugestię. Jestem całkiem szczęśliwy po poprawieniu kodu, dodaniu buforowania, CDN i szybszej bazie danych. Interesujące, jak powolne podstawowe Heroku db jest porównywany z Crane i do góry. –

+1

Baza danych jest najczęstszym ograniczeniem wydajności i chokepoint w rozproszonych systemach internetowych. Cieszę się, że masz dużo kilometrów z buforowania i db pionowego skalowania. Jeśli masz problemy z wydajnością w przyszłości, daj mi znać. [email protected] – Winfield