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?