na jednej stronce generuje zdjecia do galerii za pomoca:
<%= render @gallery.galleries_images %>
partial nie jest skomplikowany, to element listy ze zdjeciem i podpisem. zaobserwowalem niepokojacy problem podczas ich renderowania, co ktorys zabiera dziwnie duzo czasu (okolo 200ms) gdy pozostale 15ms.
gdy obrazkow jest duzo, wczytywanie calej strony trwa zdecydowanie za dlugo. za pomoca rvma zainstalowalem rubiego z patchem gcdata i ustawilem zmienne:
wróżysz z fusów. Zainteresuj się performance testami, zobacz, co naprawdę zajmuje dużo czasu (a przy galeriach/zdjęciach mam prawie pewnika co tyle zajmuje, ale nie będę spojlerował), i to popraw. Możesz też wdrożyć cache, ale to już zupełnie inny temat.
Tak, to gc rubiego. Spróbuj zmniejszyć liczbę obiektów jakie tworzysz (przy w miarę dobrze napisanym kodzie zwykle niewiele można zrobić). O wiele więcej można “urwać” przez keszowanie (zarówno na poziomie partiali jak i konkretnych metod).
zanim napisalem tego posta sprawdzilem o co chodzi (uzywam new relic) i problemem sa te partiale.
jesli renderowalbym ich 50 i co 10 zabiera 100ms to juz na tym mam pol sekundy w plecy (widac to po czasach w pierwszym poscie).
cachowanie jest rozwiazaniem, ale zanim do tego dojde szukam innego sposobu. uwaga radarka co do liczby obiektow jest dla mnie cenna.
zastanawiajacy jest tez dla mnie fakt, ze na localhoscie praktycznie ten problem nie wystepuje.
A możesz gdzieś wrzucić kod aplikacji, albo chociaż feature? (choć może to nie jest tu kluczowe)
Możesz wejść w new relic’u w szczegóły renderowania partiala?
Czy problem się powtarza, czy dłuższe czasy moją zawsze wypadkowe partiale?
Spróbuj może inny server, jak puma, czy thin - problem też jest?
a co się stanie jeśli pozbędziesz się partiala i będziesz renderował jego treść poprostu w pętli? Kiedyś w dawnych czasach był plugin który robił to automatycznie (‘inline_partials’ może się nazywał).
zawsze ktorys zabiera wiecej czasu niz pozostale. nie zawsze odnosza sie do tego samego, zwykle losowo co ktorys renderuje sie dluzej.
sprawdzilem tez na thinie, niestety to samo.
trudne do zrozumienia jest dla mnie to, ze u siebie na komputerze te partiale renderuja sie po 1-2 ms, a mam rubiego zainstalowanego z rvma bez zadnych patchy.
na serwerze (o wiele mocnejsza maszyna niz moj komputer) probowalem z taka sama wersja, jak rowniez z patchowanymi i ciagle nic.
Faktycznie, taka różnica nie powinna mieć miejsca.
Czy lokalnie używasz tych samych ustawień (zmienne środowisko RUBY_GC_MALLOC_LIMIT itp) jak na produkcji?
Czy jesteś w 100% pewien, że na produkcji odpalona aplikacja widzi te zmienne środowiskowe? (zrób sobie testowy url, pod którym zrobisz coś w stylu require “pp”; Rails.logger.info ENV.inspect i upewnisz się, że tak jest).
Czy podczas renderowania partiala idą jakieś zapytania do bazy? Może różnica bierze się stąd, że na produkcji macie osobny serwer dla db (więc dochodzi opóźnienie na komunikację, które na komputerze lokalnym jest znikome).
Zrób także jakieś podstawowe testy wydajnościowe porównujące Twoją wersję rubiego z tą produkcyjną.
Co do kodu. Czy musisz korzystać z helperów link_to, asset_path, image_tag do tak prostych rzeczy jak linkowanie do obrazka, którego url masz przecież wygenerowany? (gallery_image.photo.url(:large)) Z tego co pamiętam pozbycie się odwołania do helperów dawało sporego kopa.
[quote=radarek]Faktycznie, taka różnica nie powinna mieć miejsca.
Czy lokalnie używasz tych samych ustawień (zmienne środowisko RUBY_GC_MALLOC_LIMIT itp) jak na produkcji?[/quote]
nie, lokalnie zainstalowalem za pomoca rvma ostatnia wersje. na produkcji to nie zdaje egzaminu…
tak, zgodnie z Twoja rada wykonalem taki test. zmienna sa widoczne.
(tylko z ta pierwsza tak nie szalalem) i jest o niebo lepiej. teraz partial renderuje sie 5-6ms.
pytanie czy moge jeszcze podwyzszyc wartosc RUBY_GC_MALLOC_LIMIT?
jakie sa sensowne wartosci ktorych moge bezpiecznie uzywac?
[quote=radarek]Zrób także jakieś podstawowe testy wydajnościowe porównujące Twoją wersję rubiego z tą produkcyjną.
Co do kodu. Czy musisz korzystać z helperów link_to, asset_path, image_tag do tak prostych rzeczy jak linkowanie do obrazka, którego url masz przecież wygenerowany? (gallery_image.photo.url(:large)) Z tego co pamiętam pozbycie się odwołania do helperów dawało sporego kopa.[/quote]