Optymalizacja hostingu

Magento jest aplikacją, która posiada bardzo specyficzne wymagania pod względem platformy hostingowej. Wprawdzie do zapewnienia minumum (czyli uruchomienia strony) wystarczy najprostsze konto współdzielone u jednego z wiodących dostawców. Jednak aby aplikacja działała szybko, należy wykonać szereg kroków. Do wykonania części z nich wymagany jest sewer dedykowany oraz prawa administratora. Jednak takie działania zdecydowanie przynoszą efekty! Oto niektóre rozwiązania, które wdrażaliśmy przy okazji optymalizacji wydajności jednego ze sklepów:

  1. PHP Opcode Cache
    Sensowne dla Magento wydają się dwie technologie: APC oraz eAccelerator. APC poza cachowaniem skompilowanego kodu PHP zapewnia interfejs dla cachowania danych użytkownika. W eAcceleratorze funkcjonalność ta została usunięta, tak więc będziemy musieli się posiłkować innym rozwiązaniem dla magento cache (np. ramdysk dla katalogu var/cache). eAccelerator w czasie testów dawał wyniki o 2-8% lepsze (czas ładowania się stron), my jednak postawiliśmy na APC ze względu na obsługę User Cache Entries. Bardzo ważne są tutaj ustawienia, gdyż te standardowe zdecydowanie odbiegają od konfiguracji optymalnej:

    shm_size = 256
    max_file_size = 24M
    include_once_override = On
    
  2. Wbudowana kompilacja
    Jest to opcja, która na chwilę obecną nie jest jeszcze całkowicie dopracowana. Spotkaliśmy się z projektami, w których – ze względu na niekompatybilność któregoś z zainstalowanych dodatków – kompilacja nie udawała się. Natomiast jeżeli tylko jest taka możliwość, należy skorzystać z tej funkcji. Dzięki niej, w wielu przypadkach ilość otwartych plików przy generowaniu strony można zmniejszyć z kilkuset do jednego.
  3. Zend Cache
    Magento korzysta z implementacji cacheowania dostępnej w Zend Framework. Dzięki temu mamy do wyboru cały szereg technologii do wyboru. Ustawienie domyślne (dysk) niestety nie oferuje wysokiej wydajności (nawet, jeżeli mamy dużo wolnej pamięci, którą system operacyjny wykorzystuje do buforowania dysku). Tutaj najlepiej sprawdzają się rozwiązania, które umożliwiają przetrzymywanie zawartości cache w pamięci RAM serwera. Najlepsze rezultaty przy naszych bechmark’ach uzyskało APC, natomiast zaraz za nim uplasował się memcached.
  4. Oddzielny hosting dla aplikacji, oddzielny dla zawartości statycznej
    Konfigurując serwer aplikacji (najczęściej Apache + PHP), należy zastosować inne podejście dla wydajnego hostowania PHP, a inne dla szybkiego serwowania plików statycznych (zdjęcia, css, javascript). Najlepiej zupełnie oddzielić te funkcje. Do hostowania treści statycznych najlepiej nadają się usługi CDN. Poza zapewnieniem optymalnego (z punktu widzenia łącz do klienta) hostingu, pozwalają one (dzięki cachowaniu) odciążyć główny serwer aplikacji. Polecamy skorzystanie z 4 różnych VirtualHostów, co spowoduje jednoczesne pobieranie kilku plików przez przeglądarki internetowe.
  5. Kompresja CSS/JS
    Pliki CSS/JS należy skonsolidować (jeden plik dołączany na każdą stronę) oraz zapewnić kompresję gzip/deflate przy przesyłaniu tych plików. Dopiero po ich załadowaniu przeglądarka zaczyna wyświetlać stronę, dlatego czas ich ładowania jest bardzo ważny. Nawet w dobie broadbandowych łącz, zastosowani kompresji potrafi dać wyśmienite rezultaty.

  6. Load-balancing, podział ról serwerów
    W przypadku zbyt małej wydajności serwera – w grę wchodzą dwa rozwiązania. Scale-Up (czyli, w skórcie, więcej pamięci/procesorów w obecnym serwerze) jest dość ograniczony (dostępnymi technologiami), nie zawsze też kalkuluje się pod względem opłacalności. Dla Magento najlepszym rozwiązaniem jest Scale-Out, czyli zapewnienie większej ilości maszyn. Polecamy stosowanie wielu serwerów frontend (wraz z wydajnym Load-Balancerem, np. F5 BigIP lub optymalnie skonfigurowany LVS) oraz oddzielnego serwera/serwerów backend. Największa instalacja Magento, z krórą pracowaliśmy, składała się z 12 serwererów FrontEnd oraz 2 serwerów BackEnd.
  7. Szybkie sesje
    Jeżeli korzystamy z więcej niż jednego serwera Frontend, ważną rolę zaczyna odgrywać sposób przechowywania informacji o sesjach. Jeżeli na dodatek nie korzystamy z dedykowaniego Loadbalancera, zapewniającego tzn. Session Stickiness – musimy zadbać o to, aby informacja o sesjach była dostępna na wszystkich serwerach frontend. Zdecydowanie nie należy tutaj szukać rozwiązania w technologiach typu współdzielone pliki (np. NFS) czy baza danych. Jedynym słusznym rozwiązaniem jest memcached.
  8. Skalowanie MySQL – replikacja
    Wydajność bazy danych MySQL to temat rzeka. Ukazało się na ten temat wiele książek. Szybkie przybliżenie tego tematu jest niewykonalne. Chciałbym natomiast zwrócić uwagę na bardzo ciekawą funkcję, oferowaną przez MySQL – czyli replikację. Magento jest gotowe do korzystania ze środowska z replikacją od samego momentu instalacji, nie są potrzebne żadne modyfikacje aplikacji (co bardzo często powstrzymuje przed wdrożeniem replikacji MySQL). Doskonale korzysta zarówno z replikacji Master-Slave jak i Master-Master. Warunek – tylko w trybie RBR (standardowa Statement-Based Replication zdecydowanie odpada).

Wspomniane wyżej rozwiązania to, tak naprawdę, tylko wierzchołek góry lodowej. Dokładne tuningowanie bardzo wielu parametrów systemowych (łącznie z wielkością ramki MTU w kartach sieciowych czy parametry sysctl jądra systemu Linux) pozwalają wycisnąć z tej platformy naprawdę dużo. Na tyle, by sprostać kilkuset tysiącom wizyt dziennie. Czego każdemu życzę…

Leave a Comment