sobota, 31 października 2009

O testach wydajnościowych słów kilka

Testy wydajnościowe, jak to testy... robić trzeba. Jak to pisze Misko: You do test, right? Zazwyczaj aby je przeprowadzić korzystałem z Apache JMeter. Polecam ten program i może nawet kiedyś zamieszczę prosty przewodnik, jak zacząć z nim przygodę. Dzisiaj jednak skupię się na innym problemie i innym narzędziu.
Przeprowadzając testy wydajnościowe, najważniejszym w moim odczucie problemem, z jakim się spotyka osoba pisząca test jest odwzorowanie charakterystyki żądań obsługiwanych przez aplikację. Tak przy okazji, wiedzieliście, że aplikacja to "ozdobny wzór naszywany na tło z innego materiału"? A spieszyć to "uczynić kogoś pieszym" Coraz bardziej lubię słowniki.

A priori trudno określić, jak użytkownicy będą korzystać z naszego programu i w co będą klikać. Kiedy będą żądane obrazki, kiedy pliki css i różne inne. Obserwując jednak to, co się dzieje na serwerze, możemy utworzyć całkiem sprawne scenariusze.

A co się dzieje, możemy odczytać z logów. Zakładam tutaj, że ruch sieciowy obsługiwany jest przez serwer WWW Apache, za którym stoi serwer aplikacji, z naszą aplikacją internetową.
Apache trzyma informacje o tym kto i do jakich zasobów wysyła żądania w pliku access.log.
Podglądam jego zawartość poleceniem
tail -f /var/logs/apache2/access.log


83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /swiat/komentarze/_resource/fs/img/ajax_loading_small.gif HTTP/1.0" 301 284 "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/338
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /swiat/komentarze/_resource/fs/res/img-blogi.png HTTP/1.0" 301 276 "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/246
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /swiat/komentarze/_resource/res/20000457/cust/f120x80 HTTP/1.0" 200 4025 "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/1362
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /swiat/komentarze/_resource/fs/img/presseurop.png HTTP/1.0" 301 275 "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/337
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /swiat/komentarze/_resource/fs/img/polityka_logo_small.png HTTP/1.0" 301 280 "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/264
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /_resource/fs/img/close.png HTTP/1.0" 304 - "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/256
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /_resource/fs/res/img-blogi.png HTTP/1.0" 304 - "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/229
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /_resource/fs/img/presseurop.png HTTP/1.0" 304 - "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/251
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /_resource/fs/img/polityka_logo_small.png HTTP/1.0" 304 - "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/222
83.2.107.220 - - [31/Oct/2009:23:03:08 +0100] "GET /_resource/fs/img/ajax_loading_small.gif HTTP/1.0" 304 - "http://beta.polityka.pl/swiat/komentarze/1500387,1,po-unijnym-szczycie.read" "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00" 0/220


Jest to bardzo cenne źródło żądań wysyłanych do aplikacji, z których stworzę scenariusz testowy. Wydobywam więc wszystkie żądania z godziny 9tej i zapisuję je w pliku /tmp/requests.txt


cat /var/log/apache2/access.log | grep 31/Oct/2009:09 | awk '{print $7}' > /tmp/requests.txt


I już jestem w ogródku. Czas przywitać się z gąską...
Pozostało jakoś z pliku o strukturze:

/swiat/komentarze/_resource/fs/img/ajax_loading_small.gif
/swiat/komentarze/_resource/fs/res/img-blogi.png
/swiat/komentarze/_resource/res/20000457/cust/f120x80

wykonać żądania do poszczególnych zasobów.

Tu z pomocą przychodzi program Apache Benchmark i kilka poleceń linuksowych.

Odpalam więc scenariusz poleceniem:
for i in $(cat /tmp/requests.txt);do ab -n 2 -c 2 "http://nazwahosta$i"; done

-n 2 odpali każde żądanie 2 razy
-c 2 zrobi to w 2 wątkach

Dobre efekty daje odpalenie kilku scenariuszy testowych, np. z godziny 8, 9, 10, 11, zrównoleglonych screenem, czyli
screen for i in $(cat /tmp/requests.txt);do ab -n 2 -c 2 "http://nazwahosta$i"; done

A jakie są twoje patenty, na testy wydajnościowe?

3 komentarze:

Piotr Pietrzak pisze...

Można "nagrywać" scenariusze z logów serwera sieciowego do JMeter:
http://jakarta.apache.org/jmeter/usermanual/jmeter_accesslog_sampler_step_by_step.pdf
Można sobie samemu zaimplementować parser do takiego samplera i puszczać logi we własnym formacie.
Kombinacje ze screenem i forem w bashu są dla tych co nie lubią Javy - poza tym wątki w Javie są lżejsze od tych w OS, więc nie wytworzysz tak dużego ruchu z jednej maszyny testowej na serwer produkcyjny jak przy użyciu JMeter.
JMeter ma jeszcze możliwość zarządzania takim testem w clustrze, co pozwala dociążyć serwer produkcyjny, tak aby dobrać optymalne parametry.

WooKasZ pisze...

to kiedy ten tutorial z JMeter ?:) Może jakaś seria tutoriali ? Bardzo interesujący temat to jest a w polskiej blogosferze cisza o tym ;/

MZ pisze...

prosisz - masz ;)
http://na-jawie.blogspot.com/2010/02/perwszy-test-z-apache-jmeter.html