Testowanie wydajności serwisów WWW

Buforowanie kluczem do obciążalności

Testowanie wydajności serwisów WWW

Wyniki pracy programu Apache Benchmark

Kluczowym elementem optymalizacji dynamicznych serwisów internetowych jest wydajne buforowanie wygenerowanej przez języki skryptowe i połączenia z bazą danych zawartości. Załóżmy, że prowadzimy bloga, który na stronie głównej wyświetla listę najnowszych artykułów. Aplikacja bloga, aby wyświetlić je użytkownikowi za pomocą połączenia z bazą SQL, za każdym razem pobiera te dane za pomocą odpowiedniego zapytania. Zakładając, że na blogu przybywa nawet kilka artykułów na dzień, każdorazowe zapytanie o najnowsze artykuły przy odwiedzinach każdego użytkownika jest nieoptymalne i może stanowić wąskie gardło wydajności serwisu. Standardową metodą jest w takim wypadku buforowanie (cache’owanie) pozyskanych z bazy danych. Cache może być gromadzone w pamięci – np. za pomocą serwera memcached lub wbudowanych mechanizmów serwerów webowych albo w plikach na dysku. Ta druga metoda jest mniej wydajna, ale w obu przypadkach można liczyć na wielokrotne poprawienie wydajności, a przede wszystkim obciążalności aplikacji. Tak naprawdę należy walczyć głównie o ten drugi parametr – w przypadku serwisu o niskiej oglądalności nie zauważymy zapewne dużej różnicy wynikającej z buforowania. Gdy na przykładowego bloga zacznie wchodzić kilkanaście tysięcy użytkowników czy więcej, korzyści z cache będą już nieocenione.

Można pójść także dalej i przechowywać całą wygenerowaną przez aplikację zawartość jako pliki statyczne. Dzięki temu przy kolejnych zapytaniach nie będzie potrzeby uruchamiania interpretera języka skryptowego. Jest to bardzo wydajna metoda podnoszenia obciążalności w serwisach informacyjnych o bardzo dużej liczbie odwiedzających. W tym celu można wykorzystać dodatkowe oprogramowanie, np. serwer Varnish albo moduły Apache – mod_cache czy moduł fast_cgi_cache dla Nginx. Przyrost obciążalności w tym przypadku może być nawet 50–100-krotny. Wszystko zależy od rodzaju aplikacji oraz sposobu, w jaki korzysta ona z zasobów bazodanowych i języków skryptowych.

Równoważenie obciążenia

Testowanie wydajności serwisów WWW

Przykładowy raport z pracy narzędzia httperf

Kiedy już zoptymalizujemy aplikację, zastosujemy najkorzystniejsze parametry serwera webowego i bazy danych oraz uruchomimy mechanizmy buforowania. Krokiem w kierunku zwiększenia możliwości obsługi następnych połączeń jest powielenie aplikacji na kolejne maszyny. Rozwiązanie load balancing stosowane jest zarówno do zwiększenia obciążalności, jak i dostępności serwisów internetowych. Przy aplikacjach dynamicznych należy pamiętać o zapewnieniu mechanizmów replikacji plików pomiędzy maszynami – albo za pomocą synchronizacji, albo poprzez uruchomienie z jednego systemu dyskowego NAS czy SAN. Drugi element to zapewnienie mechanizmów przenoszenia sesji pomiędzy maszynami. Odpowiednie rozwiązania istnieją dla wszystkich popularnych serwerów webowych. Przykładowo Nginx może sam pracować jako load balancer – wystarczy w odpowiedniej konfiguracji modułu HttpUpstream wpisać listę serwerów backendowych. Można także za pomocą mechanizmu wag definiować priorytet wykorzystywania serwerów.


TOP 200