Przerażająco wolny Mongrel - statyczne pliki co 1 sek

Witam
Od jakiegoś czasu (nie jestem w stanie sobie tego skojarzyć z jakimś konkretnym działaniem z mojej strony) mój deweloperski mongrel jest przerażająco wolny jeśli chodzi o serwowanie plików statycznych. W praktyce sprowadza się do tego, że jeden plik serwowany jest co jedną sekundę, a więc ładowanie średnio wypełnionej grafiką strony trwa kilkanaście - kilkadziesiąt sekund. Z obserwacji Firebug’a (które załączam) wynika, że pojawił się limit liczby połączeń do serwera (konkretnie max. 1 połączenie jest aktywne, przynajmniej jeśli chodzi o statyczne pliki)
Jeśli chodzi o wersje: Mongrel 1.1.5, Rails 2.3.2, wszystko pod Win XP.

Webrick radzi sobie ze stroną śpiewająco.

O co może chodzić?

Poniżej screeny z Firebuga. Sorry, że takie szerokie, ale chciałem, żeby były wyraźne…

Webrick:

Mongrel:

No to moze pora zmienic na Thin np?

albo passenger. też się nadaje do developmentu, a wtedy jest pewność, że pliki statyczne serwuje apache/nginx.

No właśnie nie mam pewności. Używasz jakiś specjalnych ustawień? Bo u mnie restart aplikacji trwa zauważalnie długo.

Nazwę istotnego pliku zamazałeś tylko raz… :slight_smile:

Nie wiem dlaczego akurat u Ciebie Mongrel tak długo ładuje te grafiki ale mam poradę: poprawi ładowanie Twojej strony niezależnie od serwera jakiego używasz.

Zrób z tych wszystkich małych grafik (domyślam się że to przyciski, ikony etc.) jedną dużą grafikę która załaduje się 1 (słownie: jednym) zapytaniem http. Używasz CSS do wyświetlenia tylko tej części grafiki której potrzebujesz w danym elemencie. Różnica w szybkości ładowania będzie bardzo wyraźna. Przykład (żeby nie szukać daleko) zobacz jak robi to to http://mp3przeboje.pl - plik http://mp3przeboje.pl/images/sprite.png )

Hosiawak, ale to (w tym przypadku) jest obejście. Sprite’y powinny być techniką optymalizacyjną, a nie krokiem koniecznym do akceptowalnego działania aplikacji.

Co do samego problemu: mongrel jest serwerem jednoprocesowym i jednowątkowym, ale odstępy jednosekundowe są totalnie niedopuszczalne (statyczny content z lokalnej maszyny powinien trwać milisekundy). Albo jakiś spaprany build mongrela (kiedy pisałem w railsach na Windows, nie miałem tego typu akcji) albo coś z przeglądarką. Jak to wygląda pod IE, Operą czy Chrome?

[quote=hosiawak]Nie wiem dlaczego akurat u Ciebie Mongrel tak długo ładuje te grafiki ale mam poradę: poprawi ładowanie Twojej strony niezależnie od serwera jakiego używasz.

Zrób z tych wszystkich małych grafik (domyślam się że to przyciski, ikony etc.) jedną dużą grafikę która załaduje się 1 (słownie: jednym) zapytaniem http. Używasz CSS do wyświetlenia tylko tej części grafiki której potrzebujesz w danym elemencie. Różnica w szybkości ładowania będzie bardzo wyraźna. Przykład (żeby nie szukać daleko) zobacz jak robi to to http://mp3przeboje.pl - plik http://mp3przeboje.pl/images/sprite.png )[/quote]
Tylko trzeba uważać, żeby plik nie był za duży (ten z mp3przeboje chyba powinien być mniejszy) :slight_smile: Spece od frontendu twierdzą, że przy dużych plikach, które są wrzucane na stronę wiele razy w CSSie, znacząco może wzrosnąć zużycie ramu. Dodatkowo przy większych plikach różnica nie jest aż tak duża. Dlatego trzeba pamiętać o tym, żeby to rzeczywiście były ikonki, a nie duże części strony.

Jak dla mnie wygląda to jakby Mongrel robił reset Rails dla każdego requestu. Miałem podobnie (Mac OS X), nie wiem czy problem jest rozwiązany bo kontrolnie postawiłem sobie lokalnie nginx :slight_smile:

Hm… muszę to sprawdzić w wolnej chwili.

Bragi, będę wdzięczny.
Rzeczywiście zamazałem nazwę pliku tylko w jednym obrazku. Może mnie nie zabiją :slight_smile:
A tak poważnie: wiem, o sprite’ach, ale to jeszcze nie ten etap. Docelowo i tak strona będzie hulać na Passengerze. A Passenger/inne do developmentu? Chyba będę musiał pomyśleć.

Mam w sumie jeszcze jedną wskazówkę: kumpel sciągnął sobie ostatnio wszystkie źródła i u niego na mongrelu jest to samo. I tylko na mongrelu, tak jak u mnie… Mamy tego samego mongrela, ale instalowanego z gem’a, nie zamrożonego. Z resztą wcześniej wszystko mi działało dobrze, aż… zwolniło…

Ohaleck
Kiedys mialem podobny problem z Webrickiem. Niestety nie moge znalesc watku z tym problemem (nie pamietam gdzie go wrzucilem).
Ale … u mnie sprawa zalezala … czekaj czekaj … juz sobie przypomnialem.

To nie byl RoR tylko Web.py, no i oczywiscie nie Webrick :slight_smile:

Problem polegal na tym, ze serwer nie radzil sobie z plikami textowymi (w tym wypadku z plikiem css) ktory byl zapisany w formacie windows tzn. linie w tekscie konczyly sie na \r\n - zapisanie pliku css w formacie Unix (\n) pomoglo.

Tutaj jest ten watek: http://groups.google.com/group/webpy/browse_thread/thread/27ef3cbbba0dbf80

pozdrawiam

Pozostaje brutal debugging, czyli nowa aplikacja od zera i sukcesywne kopiowanie do niej elementów poprzedniej, patrząc w którym miejscu mongrel zaczyna się tak zachowywać.

Nowa aplikacja zachowuje się od razu tak samo, nawet na stronie ‘Welcome aboard’, która ładuje mi się lokalnie z mongrela ponad 3 sekundy.
Sprawdzałem przeglądarkę, ale nie ma wpływu. Wyłączyłem nawet na chwilę firewalla (windowsowa desperacja) i nic.
Zastanawiam się, czy to nie wina któregoś gem’a, ale nie wiem od czego zacząć… Chyba od nowego dysku i kawałka normalnego systemu…

ohaleck

mozesz jeszcze sprobowac zrobic to:

I got this problem and I fixed it…

Open
C:\Windows\System32\drivers\etc\hosts

then remove the row with “::1 localhost”
its the IP6 adress

or u can try to go to 127.0.0.1:3000 instead…

znalezione tu: http://www.ruby-forum.com/topic/127830

Dzięki tusla!
Co prawda nie miałem wpisu IPv6 w pliku host (jadę na XP), ale poszedłem za ciosem i zwyczajnie użyłem adresu 127.0.0.1:3000 zamiast localhost:3000 i zadziałało!!
Badziewny windowsowy resolver zapewne znów dał się we znaki.
Niezły początek Nowego Roku. Przy okazji: pomyślności wszystkim!!

Update: nawet użycie prostego dyndns’a rozwiązuje sprawę…