Mod passenger i Ruby Enterprise Edition

Posted by Piotr Sarnacki Tue, 17 Jun 2008 18:50:00 GMT

Dzisiaj opowiem wam bajeczkę o tym jak mod_passenger zeswatał ze sobą Apache’a i Railsy. :)

Jeżeli ktoś sądzi, że z tego związku nic nie będzie, to rzucam kilka zalet:
  • nie trzeba bawić się w konfigurację proxy i martwić o zajęte porty
  • nie trzeba monitorować mongreli (ja używałem do tego goda)
  • ogólna prostota użycia
  • dzięki ruby enterprise można zaoszczędzić 33% pamięci
  • upload buffering, czyli nie musimy się martwić o upload dużych plików – pliki są przesyłane do aplikacji railsowej dopiero, gdy zostaną w całości uploadowane na serwer
  • fair load balancing – zapytania są wysyłane do procesów, które mają najmniej klientów w kolejce. żeby uzyskać coś takiego używając nginxa trzeba było instalować dodatkowy plugin
  • liczba instancji aplikacji nie jest sztywno określone. używając nginxa trzeba było przewidzieć jaka liczba serwerów railsów będzie potrzebna dla danej aplikacji, jeżeli na dany serwis wchodziło mało osób niewykorzystane serwery zjadały pamięć. mod_passenger uruchamia kolejne instancje w miarę potrzeb.

Dodatkowo napisałem apache upload progress module , dzięki czemu z mod_passengerem można sklecić pasek postępu wysyłania plików na serwer (forma dokładnie taka sama jak z Nginx Upload Progress, więc jeżeli ktoś go używał, to nawet nic nie będzie musiał zmieniać w skryptach).

Mod Passenger

Aktualnie najnowszą wersją mod_passengera jest 1.9.1 (RC2), instrukcja instalacji jest na blogu phusion.

Po odpaleniu instalatora użytkownik jest prowadzony za rączkę, więc nikt nie powinien mieć probleów – lubię takie podejście, nie muszę się zastanawiać nad tym co i jak mam zrobić i kopiować i wklejać kolejnych komend.

Mod passenger sprawuje się na serwerze bardzo fajnie, do tej pory nie miałem żadnych problemów. Żeby zrestartować aplikację rails wystarczy utworzyć plik tmp/restart.txt w katalogu aplikacji.

Po instalacji można jeszcze dodać w configu apacha linijkę:
PassengerMaxPoolSize X

Zamiast X wstawiamy maksymalną liczbę instancji aplikacji odpalonych na raz. W dokumentacji twierdzą, że dla VPSa z 256 megabajtami pamięci ram dobrą wartością będzie tutaj 2, a dla serwera dedykowanego z 2GB ramu 30. Większa liczba aplikacji to więcej zajętego ramu, ale też więcej requestów do obsłużenia w danej chwili.

Ruby Enterprise Edition

O ile o mod passengerze jest dużo informacji, to o ruby enterprise edition jeszcze niewiele. Według niektórych nazwa jest nietrafiona i niefajna, niektórym nie podoba się, że phusion chce się na REE wypromować.

Mi to w zasadzie wszystko jedno jak się chłopaki z Phusion promują, kto na tym zarobi i jaka jest nazwa, o ile ta wersja będzie dobrze działała i rzeczywiście zmniejszała zużycie pamięci.

Żeby zainstalować ruby enterprise edition należy ściągnąć paczkę (najnowszą wersję paczki można znaleźć tutaj):
wget http://rubyforge.org/frs/download.php/38777/ruby-enterprise-1.8.6-20080623.tar.gz
Następnie ją rozpakować:
tar -zxvf ruby-enterprise-1.8.6-20080623.tar.gz
i uruchomić installer:
./ruby-enterprise-1.8.6-20080623/installer
Tyle mówi opis na stronie REE, ale to jeszcze nie wszystko. Na początek można stworzyć dowiązanie symboliczne dla REE:
ln -sf /opt/ruby-enterprise-1.8.6-20080623/bin/ruby /usr/bin/ruby-enterprise
Użytkownicy gentoo muszą również skopiować plik auto_gem, który automatycznie jest w tej dystrybucji dodawany do RUBYOPT:
cp /usr/lib/ruby/site_ruby/auto_gem.rb /opt/ruby-enterprise-1.8.6-20080623/lib/ruby/site_ruby

Po zainstalowaniu rubiego instaluje się też kilka gemów, ale to tylko podstawowe – resztę trzeba zainstalować samemu. Oczywiście można odpalić gem list i instalować kolejne gemy w danych wersjach, ale od czego mamy rubiego. Dosłownie w 2 minuty napisałem prosty skrypcik, który wyciąga nazwy i wersje gemów po czym instaluje je dla Ruby Enterprise Edition:


`gem list`.split("\n").each do |line|
  if line =~ /([0-9a-zA-Z_\-]*) \((.*)\)/
    gem, versions = $1, $2.split(", ")
    versions.each do |version|
      puts "Installing #{gem}, version: #{version}" 
      puts `ruby-enterprise /opt/ruby-enterprise-1.8.6-20080623/bin/gem install #{gem} -y --version '#{version}' 2>&1`
    end
  end
end
Teraz wystarczy dodać w configu apacha linijkę:
RailsRuby /opt/ruby-enterprise-1.8.6-20080623/bin/ruby

I możemy cieszyć się naszym własnym wypicowanym apachem z mod_passengerem w korporacyjnej wersji ;-)

Posted in  | Tags , , , ,  | 11 comments | no trackbacks

Comments

  1. Avatar Jacek Becela said 26 minutes later:

    Jeszcze jak do tego dojdzie MagLev to będziemy mieli tą samą złą moc enterprajsu jak inni, ktorzy są po ciemnej stronie mocy ;)

  2. Avatar RazorJack said about 1 hour later:

    Wypróbowałem mod_passenger na dużym projekcie – wydajność wzrosła o jakieś 19%. Świetna sprawa, zważając na to, że jest to niemal darmowy skok, a konfiguracja banalna i ułatwia życie. Myślę, że mod_passenger sporo namiesza w świecie Rubiego.

    Inna sprawa, że warto obserwować rozwój ebb-a. ebb+merb dał mi 1400 reqs/sec na komputerze biurkowym. Mówi to samo za siebie.

    Mamy kandydatów na króla wydajności i króla prostoty. Jak tu nie lubić Rubiego? :)

  3. Avatar Drogomir said about 4 hours later:

    Ebb jest dla mnie cały czas zagadką, bo jeszcze nie udało mi się go uruchomić na serwerze stojącym na gentoo :)

    Jak wyjdzie wersja, na której uda się ta sztuka, to prawdopodobnie będę mógł powiedzieć coś więcej.

    Mogę dodać tylko, że mod_passenger tak samo jak ebb jest pisany w C i zapewne ludzie z Phusion mają w planach różnego rodzaju optymalizacje. :)

  4. Avatar Radarek said about 4 hours later:

    Cóż, mogę tylko potwierdzić. Moje doświadczenia są takie same jak Twoje drogomir i reszta komentujących.

    Co do Ruby Enterprise Edition (nazwa do d**, zmiany dokonane w interpreterze Rubiego nijak mają się do Enterprise) – według mnie ma eliminującą go wadę. Na architekturze 64bit (chyba to już standard?) ma działanie odwrotne – obniża wydajność o kilka procent, a zużycie pamięci jest takie same jak na standardowym MRI.

    Na Ebb jeszcze przyjdzie pora, jeszcze jest we wczesnej fazie rozwoju (stabilność).

  5. Avatar Drogomir said about 5 hours later:

    U mnie na serwerze działa gentoo 32 bitowy, więc jak na razie mogę chyba zostawić REE :)

  6. Avatar Tomash said about 14 hours later:

    Passenger to mistrzostwo świata jeśli chodzi o prostotę deploymentu i zarządzania działaniem aplikacji. Żegnaj Mongrelu. A więc jednak istnieje “life after Zed” ;)

  7. Avatar Andrzej Śliwa said about 15 hours later:

    @Radarek – co do obnizenia wydajnosci to problem dotyczny nie tylko rubego, najpierw kompilatory i architektura musza dorosnac do pelnej obslugi 64 bitow, wiaze sie to z brakiem optymalizacji podczas kompilacji jak równiez w samej architekturze interpretera Rubego. Rozwiazaniem tego problemu mialy byc maszyny wirtualne Rubego (YARV, JRuby etc.) niestety jeszcze przyjdzie nam poczekać na wydajne rozwiązania produkcyjne na 64 bity.

  8. Avatar Radarek said about 18 hours later:

    @Andrzej Śliwa – być może masz rację. Jednak tu chodzi o porównanie wydajności MRI na 64bit ze spaczowanym (REE) MRI na 64bit. Przynajmniej ja tak to odbieram (http://www.rubyenterpriseedition.com/faq.html#thirty_three_percent_mem_reduction)

  9. Avatar Drogomir said about 18 hours later:

    Ja nie instalowałem 64 bitów, bo pomimo, że wersje 64 bitowe są już od jakiegoś czasu, to jednak obawiałem się problemów :)

    Sprawdziłem teraz wydajność REE (nie wiem jak wygląda sprawa pamięci, bo szczerze mówiąc nie wiem jak to sprawdzić):

    ab2 -n 10000 -c 100

    PassengerMaxPoolSize 40

    mod_passenger + MRI:

    Requests per second: 78.83 [#/sec] (mean)

    mod_passenger + REE:

    Requests per second: 98.58 [#/sec] (mean)

    Czyli jakieś 20 r/s więcej. Dla mnie wystarczy, żeby na razie go trzymać :)

  10. Avatar Radarek said about 20 hours later:

    @Drogomir: no to faktycznie, jest różnica widoczna gołym okiem. Za free :). Nic tylko się cieszyć.

  11. Avatar Pe8er said about 1 month later:

    Panie kolego, o takich rzeczach to ja pisałem już 15 lat temu, ale wtedy wrzucili mnie z kamieniem u szyi do rzeki.

Trackbacks

Use the following link to trackback from your own site:
http://blog.drogomir.com/articles/trackback/51

(leave url/email »)

   Comment Markup Help Preview comment

Clicky Web Analytics