Testowanie naszej przykładowej aplikacji

W poprzednim rozdziale zrozumieliśmy podstawowe użycie Apache Bench do testowania strony internetowej innej firmy. W tej sekcji użyjemy tego narzędzia do przetestowania aplikacji internetowej na naszym własnym serwerze. Aby w miarę możliwości samouczek był niezależny, zdecydowaliśmy się zainstalować aplikację w języku Python w celach demonstracyjnych; możesz wybrać dowolny inny język, taki jak PHP lub Ruby, w zależności od poziomu wiedzy.

Instalowanie Pythona

Ogólnie Python jest instalowany domyślnie na serwerach Linux.

Instalowanie Bottle Framework i tworzenie prostej aplikacji

Bottle to mikro-framework napisany w Pythonie do tworzenia aplikacji internetowych, a pip to menedżer pakietów w Pythonie. Wpisz następujące polecenie w terminalu, aby zainstalować butelkę -

$ sudo apt-get install python-pip
$ sudo pip install bottle

Stwórzmy teraz małą aplikację Butelka. W tym celu utwórz katalog i przenieś się do niego -

$ mkdir webapp
$ cd webapp

Stworzymy nowy skrypt w Pythonie, app.py, w katalogu webapp -

$ vim app.py

Teraz napisz następujący kod w pliku app.py -

from bottle import Bottle, run

app = Bottle()

@app.route('/')
@app.route('/hello')
def hello():
   return "Hello World!"

run(app, host = 'localhost', port = 8080)

Po dodaniu powyższych wierszy zapisz i zamknij plik. Po zapisaniu pliku możemy uruchomić skrypt w języku Python, aby uruchomić aplikację -

$ python app.py

Output

Bottle v0.12.7 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Te dane wyjściowe pokazują, że nasza aplikacja działa na komputerze lokalnym na hoście http://localhost i nasłuchując w porcie 8080.

Sprawdźmy, czy nasza aplikacja poprawnie reaguje na żądania HTTP. Ponieważ ten terminal nie może przyjmować żadnych danych bez zakończenia obsługi aplikacji Butelka, musimy zalogować się do naszego VPS za pomocą innego terminala. Po zalogowaniu się do VPS za pomocą innego terminala, możesz przejść do swojej aplikacji, wpisując następujący kod w nowym terminalu.

$ lynx http://localhost:8080/

Lynx to przeglądarka wiersza poleceń i jest zwykle instalowana domyślnie w różnych dystrybucjach Linuksa, takich jak Debian i Ubuntu. Jeśli zobaczysz następujące dane wyjściowe, oznacza to, że Twoja aplikacja działa poprawnie.

Output

Jeśli widzisz powyższe dane wyjściowe, oznacza to, że nasza aplikacja jest aktywna i gotowa do testów.

Testowanie aplikacji za pomocą rozwojowego serwera internetowego

Należy pamiętać, że program ab zawiera błąd i nie jest w stanie przetestować aplikacji na hoście lokalnym. Więc zmienimy hosta z localhost na 127.0.0.1 w pliku app.py. Więc plik zmieni się na następujący -

from bottle import Bottle, run

app = Bottle()

@app.route('/')
@app.route('/hello')
def hello():
   return "Hello World!"

run(app, host = '127.0.0.1', port = 8080)

Przetestujmy teraz naszą aplikację, wpisując następującą komendę na tym samym terminalu, na którym uruchomiono polecenie lynx -

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Output

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:        WSGIServer/0.1
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /hello
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.203 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      16500 bytes
HTML transferred:       1200 bytes
Requests per second:    493.78 [#/sec] (mean)
Time per request:       20.252 [ms] (mean)
Time per request:       2.025 [ms] (mean, across all concurrent requests)
Transfer rate:          79.56 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     1    6  28.2      2     202
Waiting:        1    6  28.2      2     202
Total:          1    6  28.2      2     202

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      2
  95%      2
  98%    202
  99%    202
 100%    202 (longest request)

Podczas gdy wyjście na pierwszym terminalu będzie (100 razy) w następujący sposób -

...
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12   
...

Możesz obserwować, jak różne wartości wyniku ab zmieniły się w porównaniu z początkowym testem.

Testowanie aplikacji na wielowątkowym serwerze internetowym

W poprzednich testach ab korzystaliśmy z domyślnego serwera WWW zawartego we frameworku Bottle.

Teraz zmienimy jednowątkowy domyślny serwer WWW na wielowątkowy. Dlatego zainstalujmy wielowątkową bibliotekę serwera WWW, taką jakcherrypy lub gunicorni powiedz Butelce, żeby go użył. Wybraliśmy gunicorn do celów demonstracyjnych tutaj (możesz też wybrać inny) -

$  sudo apt-get install gunicorn

I zmodyfikuj plik, czyli zmień domyślny serwer WWW na gunicorn -

...
run(server = 'gunicorn'...)
...

Przetestujmy aplikację na drugim terminalu.

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Output

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:        gunicorn/19.0.0
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /hello
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.031 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      17200 bytes
HTML transferred:       1200 bytes
Requests per second:    3252.77 [#/sec] (mean)
Time per request:       3.074 [ms] (mean)
Time per request:       0.307 [ms] (mean, across all concurrent requests)
Transfer rate:          546.36 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.9      0       4
Processing:     1    2   0.7      3       4
Waiting:        0    2   0.8      2       3
Total:          2    3   0.6      3       5
WARNING: The median and mean for the initial connection time are not within a normal
        deviation These results are probably not that reliable.
WARNING: The median and mean for the processing time are not within a normal deviation
        These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      4
  95%      5
  98%      5
  99%      5
 100%      5 (longest request)

Zwróć uwagę, jak liczba żądań na sekundę wzrosła z 493 do 3252. Oznacza to, że gunicorn nadaje się jako serwer produkcyjny dla aplikacji Python.