Przygotowanie do testowania stron dynamicznych
W tym rozdziale zrozumiemy przygotowania wymagane do testowania stron dynamicznych. Dynamiczna strona internetowa po stronie serwera to strona internetowa, której konstrukcja jest kontrolowana przez serwer aplikacji przetwarzający skrypty po stronie serwera. Ławka Apache może załadować tylko test dynamicznej strony internetowej po stronie serwera.
Poziom współbieżności i łączna liczba żądań
Poziom współbieżności powinien być niższy niż łączna liczba żądań.
$ ab -l -r -n 30 -c 80 -k -H "Accept-Encoding: gzip, deflate" http://127.0.0.1:8000/
Output
ab: Cannot use concurrency level greater than total number of requests
Usage: ab [options] [http[s]://]hostname[:port]/path
Korzystanie z flag
W tej sekcji opiszemy użycie niektórych ważnych flag z poleceniem ab. Będziemy używać zamiennie terminów, opcji i flag.
Pełne -v
Opcji pełnej można użyć do analizy i debugowania, jeśli istnieje wiele nieudanych żądań. Typową oznaką niepowodzenia testu obciążenia jest to, że test kończy się bardzo szybko i daje dobrą liczbę żądań na sekundę. Ale będzie to zły punkt odniesienia. Aby zidentyfikować sukces lub porażkę, możesz użyć-v 2opcja, która zrzuci treść i nagłówek każdej odpowiedzi na wyjście terminala. Następujące polecenie przedstawia przypadek użycia -
$ ab -n 1 -v 2 http://www.generic-example-URL.com/
Output
LOG: header received:
HTTP/1.0 200 OK
…
Content-Length: 2548687
Oczywiście, jeśli testujesz zmienne odpowiedzi lub zwracasz kody HTTP inne niż 200 w przypadku jakiegokolwiek błędu, powinieneś po prostu zignorować sprawdzanie długości za pomocą -lopcja. Wkrótce zobaczymy HTTP inny niż 200, kiedy w kolejnych rozdziałach uruchomimy aplikację web2py.
Keep-alive -k
Kiedy klient wysyła żądanie HTTP, nawiązywane jest połączenie z serwerem, serwer wysyła odpowiedź, a po wysłaniu żądania połączenie jest zamykane. Ten cykl jest kontynuowany przy każdym żądaniu. Jednak przy ustawieniu utrzymywania aktywności (nazywanym również połączeniami trwałymi) klient utrzymuje otwarte podstawowe połączenie TCP, aby ułatwić wiele żądań i odpowiedzi; eliminuje to długi i kosztowny czas inicjalizacji połączenia, który w innym przypadku byłby obecny.
Zmienna długość dokumentu -l
Jeśli strona internetowa ma zmienną długość, należy skorzystać z tej opcji -l. Apache Bench nie zgłasza błędów, jeśli długość odpowiedzi nie jest stała. Może to być przydatne w przypadku stron dynamicznych.
Użycie opcji -r
Jak zmusić ab nie wychodzić po otrzymaniu błędów? Powinieneś skorzystać z opcji-r. Bez tej opcji test może zakończyć się niepowodzeniem, gdy tylko żądanie trafi w błąd gniazda. Jednak przy tej opcji błędy będą zgłaszane w nagłówku błędów zakończonych niepowodzeniem, ale test będzie kontynuowany do końca.
Użycie opcji -H
Ta opcja służy do dodawania dowolnego wiersza nagłówka. Argument ma zwykle postać prawidłowego wiersza nagłówka, zawierającego parę pole-wartość rozdzieloną dwukropkami (np. „Accept-Encoding: zip / zop; 8bit”).
Użycie opcji -C
W dalszej części szczegółowo dowiemy się, jak korzystać z powyższych opcji w połączeniu z możliwością wykorzystania wartości cookie, czyli -Copcja. Opcja -C ma zwykle postaćname = valuepara. To pole można powtórzyć.
Używanie Session Cookie z Apache Bench
Aby zrozumieć, jak korzystać z pliku cookie w Apache Bench, potrzebujemy strony internetowej, która próbuje ustawić plik cookie. Bardzo dobrym przykładem jest aplikacja web2py, która jest frameworkiem sieciowym w języku Python.
Instalowanie web2py
Zamierzamy szybko zainstalować kolejną aplikację web2py w języku Python. Możesz przeczytać więcej o tym, jak go używać w Omówieniu struktury Web2py .
Python jest zwykle instalowany domyślnie na serwerze Ubuntu i Debian. Dlatego jeden wymóg jest już spełniony, aby pomyślnie uruchomić web2py.
Musimy jednak zainstalować pakiet unzip, aby wyodrębnić pliki źródłowe web2py z pliku zip, który będziemy pobierać -
$ sudo apt-get update
$ sudo apt-get install unzip
Pobierzmy framework web2py ze strony projektu. Pobieramy to do naszego folderu domowego -
$cd ~
$ wget http://www.web2py.com/examples/static/web2py_src.zip
Teraz możemy rozpakować pobrany plik i przenieść go do środka -
$ unzip web2py_src.zip
$ cd web2py
Aby uruchomić web2py, nie musisz go instalować. Gdy znajdziesz się w katalogu web2py, możesz go uruchomić, wpisując następujące polecenie -
$python web2py.py
Jeśli wszystko się powiedzie, zobaczysz następujące dane wyjściowe, w których zostaniesz poproszony o wybranie hasła do interfejsu administracyjnego -
web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2017
Version 2.14.6-stable+timestamp.2016.05.10.00.21.47
Database drivers available: sqlite3, imaplib, pymysql, pg8000
WARNING:web2py:GUI not available because Tk library is not installed
choose a password:
please visit:
http://127.0.0.1:8000/
use "kill -SIGTERM 23904" to shutdown the web2py server
Należy jednak mieć świadomość, że uruchomiony interfejs WWW jest dostępny tylko na komputerze lokalnym.
Na podstawie danych wyjściowych możesz zrozumieć, że aby zatrzymać serwer WWW, będziesz musiał wpisać „CTRL-C” w terminalu natychmiastowym. Z drugiej strony, aby zatrzymać serwer web2py na innym terminalu związanym z tym samym VPS, można wstawić polecenie kill -SIGTERM <PID>, gdzie <PID> to identyfikator procesu dla serwera web2py, którym w tym przypadku jest 23904.
Plik cookie sesji z web2py
Jeśli strona jest dostępna tylko dla zalogowanego użytkownika, a nie jest dostępna bezpośrednio ze strony logowania, w takim przypadku możesz użyć -Cflaga. Ta flaga definiuje plik cookie dla polecenia ab. Ale musisz uzyskać wartość pliku cookie identyfikatora sesji z ważnej sesji. Jak to zdobyć? Różne samouczki online poprowadzą Cię do narzędzi programistycznych przeglądarki Chrome (lub Mozilla). Ale w naszym przypadku testowym, ponieważ aplikacja jest dostępna tylko w wierszu poleceń, użyjemy przeglądarki lynx, aby uzyskać wartość.
Najpierw pobierzmy wartość cookie sesji. Otwórz inny terminal i wpisz następujące polecenie -
$ lynx http://127.0.0.1:8000/
W odpowiedzi na powyższe polecenie lynx zapyta Cię o zgodę na zaakceptowanie pliku cookie z serwera web2py, jak pokazano na poniższym obrazku.
Zanotuj wartość pliku cookie przed wpisaniem yzaakceptować plik cookie. Teraz terminal będzie wyglądał podobnie do poniższego obrazka - strona na terminalu!
Po uzyskaniu wartości cookie przeprowadzimy teraz test ab. W tym celu będziemy musieli otworzyć trzeci terminal (patrz obrazek poniżej) -
Teraz użyjmy flagi -C w trzecim terminalu -
$ ab -n 100 -c 10 -C session_name = 127.0.0.1-643dad04-3c34 http://127.0.0.1:8000/
Wynik
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Rocket
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /
Document Length: 66 bytes
Concurrency Level: 10
Time taken for tests: 0.051 seconds
Complete requests: 100
Failed requests: 0
Non-2xx responses: 100
Total transferred: 27700 bytes
HTML transferred: 6600 bytes
Requests per second: 1968.12 [#/sec] (mean)
Time per request: 5.081 [ms] (mean)
Time per request: 0.508 [ms] (mean, across all concurrent requests)
Transfer rate: 532.39 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 2 0.9 2 4
Processing: 0 3 0.9 3 5
Waiting: 0 2 1.1 2 4
Total: 4 5 0.7 5 7
Percentage of the requests served within a certain time (ms)
50% 5
66% 5
75% 5
80% 6
90% 6
95% 6
98% 7
99% 7
100% 7 (longest request)
Z powyższego wyniku zauważamy kilka punktów. Po pierwsze, web2py używa serwera WWW Rocket . Zauważamy również, że otrzymujemy „odpowiedzi inne niż 2xx” oprócz wcześniej omówionych nagłówków w wynikach. Ogólnie protokół Http odpowiada na żądanie za pomocą kodu odpowiedzi, a wszystko w zakresie 200s oznacza „w porządku”, a reszta odpowiada jakiemuś problemowi. Na przykład 400s to błędy związane z zasobami, takie jak 404 File Not Found. 500 odpowiada błędom serwera. W naszym przypadku nie ma żadnego błędu, z wyjątkiem sytuacji, gdy używamy opcji -C. Można to wyłączyć za pomocą opcji -l, jak już opisano.
Sprawdzanie strony administratora
W tej sekcji zrozumiemy, jak sprawdzić stronę administratora. Dla porównania przetestujmy inny adres URL aplikacji web2py -
$ ab -n 100 -c 10 session_name = 127.0.0.1-643dad04-3c34 http://127.0.0.1:8000/admin
Wynik
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Rocket
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /admin
Document Length: 8840 bytes
Concurrency Level: 10
Time taken for tests: 2.077 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 926700 bytes
HTML transferred: 884000 bytes
Requests per second: 48.14 [#/sec] (mean)
Time per request: 207.749 [ms] (mean)
Time per request: 20.775 [ms] (mean, across all concurrent requests)
Transfer rate: 435.61 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 3.2 0 12
Processing: 62 204 52.2 199 400
Waiting: 61 203 52.0 199 400
Total: 62 205 54.3 199 411
Percentage of the requests served within a certain time (ms)
50% 199
66% 211
75% 220
80% 226
90% 264
95% 349
98% 381
99% 411
100% 411 (longest request)
W szczególności należy zwrócić uwagę na odpowiednie statystyki w sekcji „Czas połączeń” i „Procent obsłużonych żądań…” w http://127.0.0.1:8000/ i http://127.0.0.1:8000/admin. Istnieje ogromna różnica.
Korzystanie z opcji Timelimit
Ogólnie rzecz biorąc, opcja Timelimit jest trudna. Rozumiemy to z podręcznika ab , który jest dość wyjaśniający -
-t timelimit
Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally.
Use this to benchmark the server within a fixed total amount of time.
Per default there is no timelimit.
Przeprowadźmy test z tą opcją. Zanotujemy nasze obserwacje po przejściu przez wyjście -
$ ab -n 100 -c 10 -t 60 http://127.0.0.1:8000/
Wynik
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests
Server Software: Rocket
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /
Document Length: 66 bytes
Concurrency Level: 10
Time taken for tests: 22.547 seconds
Complete requests: 50000
Failed requests: 0
Non-2xx responses: 50000
Total transferred: 13850000 bytes
HTML transferred: 3300000 bytes
Requests per second: 2217.61 [#/sec] (mean)
Time per request: 4.509 [ms] (mean)
Time per request: 0.451 [ms] (mean, across all concurrent requests)
Transfer rate: 599.88 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 0.8 2 8
Processing: 0 2 3.2 2 218
Waiting: 0 2 3.2 2 218
Total: 2 4 3.1 4 220
Percentage of the requests served within a certain time (ms)
50% 4
66% 4
75% 4
80% 5
90% 5
95% 5
98% 7
99% 8
100% 220 (longest request)
Zwróć uwagę, że dane wyjściowe pokazują, że ta opcja zastępuje liczbę żądań określoną przez -nopcja i kontynuuje do 50 tys. żądań. Jednakże, ponieważ żądania zostały obsłużone bardzo szybko, ab wygasło po osiągnięciu poziomu 50 tys. - w ciągu 22 sekund (patrz nagłówek Czas potrzebny na testy) w tym przypadku.
Możesz przetestować zastępowanie tego samego polecenia http://127.0.0.1:8000/ z http://127.0.0.1:8000/admin (zakładając, że jest to nasza aplikacja web2py) lub strona trzecia, taka jak https://www.apache.org/, zauważ różnicę w statystykach.
Lista kontrolna przed wykonaniem testu obciążenia
Istnieje kilka testów, które pomogą Ci pomyślnie przeprowadzić test i dokładnie zmierzyć jego wydajność. Przed wykonaniem testu obciążenia weź pod uwagę następujące warunki:
Upewnij się, że żaden dodatkowy moduł Pythona nie jest załadowany.
Aby uniknąć wyczerpania portu TCP / IP, należy zazwyczaj odczekać 2-3 minuty przed przejściem do kolejnego testu ab.
Upewnij się, że liczba jednoczesnych połączeń jest niższa niż liczba wątków roboczych Apache.
Powinieneś ponownie uruchomić serwer przed wykonaniem kolejnego testu, jeśli Apache lub Python ulegnie awarii.