Jak wykonać test porównawczy wydajności serwera WWW?

Photo of author

By maciekx

Czy masz świadomość, jak szybko odpowiada Twoja strona internetowa? Czy potrafisz określić, ilu użytkowników może jednocześnie korzystać z Twojej witryny, nie powodując problemów?

Testy obciążeniowe są niezbędne, aby aplikacje internetowe mogły prawidłowo funkcjonować. Pozwalają określić granice wydajności danej witryny. Wybierając serwer, jednym z kluczowych kroków jest przeprowadzenie testów obciążenia, co pozwoli wybrać najefektywniejsze rozwiązanie.

Analiza porównawcza umożliwia:

  • Wybór optymalnego serwera.
  • Określenie liczby serwerów potrzebnych do obsługi konkretnej ilości zapytań.
  • Wybór najlepszej konfiguracji.
  • Zidentyfikowanie, które technologie działają najefektywniej.
  • Przewidzenie momentów, w których strona zacznie działać wolniej lub ulegnie awarii.

Dostępnych jest wiele narzędzi online do przeprowadzania testów obciążeniowych. Jeśli jednak szukasz rozwiązania, które możesz wdrożyć lokalnie, lub zależy Ci na porównaniu wydajności serwerów, warto rozważyć ApacheBench oraz inne narzędzia wymienione poniżej.

W moich testach użyłem serwerów Apache i Nginx hostowanych na DigitalOcean.

ApacheBench

ApacheBench (ab) to narzędzie wiersza poleceń o otwartym kodzie źródłowym, które można zastosować na dowolnym serwerze. W tym artykule pokażę, jak zainstalować ten program i przeprowadzić test obciążeniowy, by porównać wyniki.

Apache

Zainstalujmy ApacheBench za pomocą polecenia yum.

yum install httpd-tools

Jeśli posiadasz już narzędzia httpd, możesz pominąć ten krok.

Sprawdźmy, jak poradzi sobie z 5000 zapytań, przy 500 jednoczesnych połączeniach.

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        4961 bytes
Concurrency Level:      500
Time taken for tests:   13.389 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Non-2xx responses:      5058
Total transferred:      26094222 bytes
HTML transferred:       25092738 bytes
Requests per second:    373.45 [#/sec] (mean)
Time per request:       1338.866 [ms] (mean)
Time per request:       2.678 [ms] (mean, across all concurrent requests)
Transfer rate:          1903.30 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0   42  20.8     41    1000
Processing:     0  428 2116.5     65   13310
Waiting:        0  416 2117.7     55   13303
Total:         51  470 2121.0    102   13378
Percentage of the requests served within a certain time (ms)
50%    102
66%    117
75%    130
80%    132
90%    149
95%    255
98%  13377
99%  13378
100%  13378 (longest request)
[[email protected] ~]#

Jak widzimy, Apache przetworzył 373 żądania na sekundę, a całość zajęła 13.389 sekund.

Dysponując tą wiedzą, wiesz, że domyślna konfiguracja może obsłużyć określoną ilość zapytań. Po wprowadzeniu zmian w konfiguracji, możesz przeprowadzić ponowny test, by porównać rezultaty i wybrać optymalne ustawienia.

Nginx

Powtórzmy test dla Nginx, by móc porównać wydajność obu serwerów.

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        nginx/1.10.1
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        3698 bytes
Concurrency Level:      500
Time taken for tests:   0.758 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      19660000 bytes
HTML transferred:       18490000 bytes
Requests per second:    6593.48 [#/sec] (mean)
Time per request:       75.832 [ms] (mean)
Time per request:       0.152 [ms] (mean, across all concurrent requests)
Transfer rate:          25317.93 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    6  11.0      2      53
Processing:     5   19   8.2     17      53
Waiting:        0   18   8.2     16      47
Total:         10   25  17.4     18      79
Percentage of the requests served within a certain time (ms)
50%     18
66%     21
75%     21
80%     22
90%     69
95%     73
98%     75
99%     76
00%     79 (longest request)
[[email protected] ~]#

Imponujące!

Nginx obsłużył 6593 żądania na sekundę! Zdecydowany lider.

Dzięki porównaniu wydajności tych dwóch serwerów, możemy już wyrobić sobie zdanie, który z nich najlepiej sprawdzi się w naszej aplikacji internetowej.

Powyższy test został przeprowadzony na CentOS 6.8, 64-bitowym. Możesz eksperymentować z różnymi kombinacjami systemów operacyjnych i serwerów, aby osiągnąć optymalne rezultaty.

Nie przepadasz za ApacheBench? Nic straconego, dostępnych jest wiele innych narzędzi do testowania obciążenia HTTP.

SIEGE

SIEGE to narzędzie do testowania obciążenia HTTP, działające w systemie UNIX. Pozwala na umieszczenie wielu adresów URL w pliku tekstowym, co umożliwia przeprowadzenie testów na różnych zasobach. Instalacja narzędzia SIEGE jest możliwa za pomocą polecenia yum.

# yum install siege

Przeprowadźmy test przy 500 jednoczesnych żądaniach przez 5 sekund.

[[email protected] ~]# siege -q -t 5S -c 500 http://localhost/
Lifting the server siege...      done.
Transactions:                       4323 hits
Availability:               100.00 %
Elapsed time:                       4.60 secs
Data transferred:        15.25 MB
Response time:                    0.04 secs
Transaction rate:       939.78 trans/sec
Throughput:                         3.31 MB/sec
Concurrency:                      37.97
Successful transactions:        4323
Failed transactions:                0
Longest transaction:            1.04
Shortest transaction:            0.00
[[email protected] ~]#

Omówmy użyte parametry.

-q – uruchomienie w trybie cichym (bez wyświetlania szczegółów zapytań)

-t – czas trwania testu: 5 sekund

-c – 500 jednoczesnych żądań

Jak widzimy, dostępność wynosi 100%, a czas odpowiedzi to 0,04 sekundy. Parametry testu obciążenia można dostosować do własnych potrzeb.

Ali

Ali to relatywnie nowe narzędzie do testów obciążeniowych, które umożliwia analizę w czasie rzeczywistym. Działa na wielu platformach, w tym Dockerze.

Po instalacji, uruchom ali, by zobaczyć opcje użycia.

[[email protected]:~# ali
no target given
Usage:
  ali [flags] <target URL>

Flags:
  -b, --body string         A request body to be sent.
  -B, --body-file string    The path to file whose content will be set as the http request body.
      --debug               Run in debug mode.
  -d, --duration duration   The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s)
  -H, --header strings      A request header to be sent. Can be used multiple times to send multiple headers.
  -k, --keepalive           Use persistent connections. (default true)
  -M, --max-body int        Max bytes to capture from response bodies. Give -1 for no limit. (default -1)
  -m, --method string       An HTTP request method for each request. (default "GET")
  -r, --rate int            The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50)
  -t, --timeout duration    The timeout for each request. 0s means to disable timeouts. (default 30s)
  -v, --version             Print the current version.

Examples:
  ali --duration=10m --rate=100 http://host.xz

Author:
  Ryo Nakao <[email protected]>
[[email protected]:~#

Jak widać, masz możliwość definiowania nagłówków HTTP, czasu trwania testu, limitu szybkości, limitu czasu i innych parametrów. Przeprowadziłem szybki test na newsblog.pl Tools i oto rezultat.

Raport jest interaktywny i zawiera szczegółowe informacje o opóźnieniach.

Gobench

Gobench jest napisane w języku Go. Jest to proste narzędzie do testów obciążeniowych, które pozwala na porównanie wydajności serwera. Obsługuje ponad 20 000 jednoczesnych użytkowników, czego nie umożliwia ApacheBench.

Apache JMeter

JMeter to jedno z najbardziej popularnych narzędzi open source do pomiaru wydajności aplikacji internetowych. JMeter jest aplikacją bazującą na Javie i może być używana nie tylko do testowania serwerów WWW, ale także PHP, Javy, ASP.net, SOAP, REST i innych.

JMeter oferuje przyjazny interfejs graficzny. Najnowsza wersja 3.0 wymaga do uruchomienia Javy 7 lub nowszej. Jeśli chcesz zoptymalizować wydajność swojej aplikacji internetowej, koniecznie wypróbuj JMeter.

wrk

wrk to kolejne nowoczesne narzędzie, które testuje wydajność serwera WWW, dostarczając informacji o opóźnieniach, liczbie żądań na sekundę, transferze danych na sekundę i innych metrykach.

Za pomocą wrk możesz przeprowadzić test obciążeniowy z użyciem wielu wątków.

Przykładowo, możemy uruchomić test przez 5 minut z 500 jednoczesnymi użytkownikami z 8 wątkami.

wrk –t8 –c500 -d300s http://localhost

Autocannon

Zainspirowany wrk, Autocannon jest napisany w Node.js. Możesz używać go programowo, poprzez API, lub jako samodzielne narzędzie. Warunkiem koniecznym jest zainstalowanie NodeJS.

Umożliwia kontrolowanie liczby połączeń, żądań, czasu trwania testu, liczby pracowników, limitu czasu, szybkości połączenia, oferując wiele opcji do testowania aplikacji internetowych.

Curl-loader

Curl-loader jest napisane w C i służy do symulowania obciążenia aplikacji. Obsługuje SSL/TLS. Oprócz testowania stron internetowych, można użyć tego narzędzia open source do obciążania serwerów FTP.

Możesz utworzyć plan testów z połączeniem protokołów HTTP, HTTPS, FTP i FTPS w jednej konfiguracji wsadowej.

httperf

httperf to narzędzie o wysokiej wydajności, przeznaczone do benchmarkingu na poziomie mikro i makro. Obsługuje protokoły HTTP/1.1 i SSL.

Jeśli znasz oczekiwaną liczbę jednoczesnych użytkowników i chcesz sprawdzić, czy Twój serwer WWW poradzi sobie z tą ilością żądań, możesz użyć poniższego polecenia.

httperf --server localhost --port 80 --num-conns 1000 --rate 100

Powyższe polecenie przetestuje 100 żądań na sekundę dla 1000 zapytań HTTP.

Tsung

Tsung to wieloprotokołowe narzędzie do testowania obciążenia, które można wykorzystać do testowania serwerów HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Obsługuje HTTP/1.0, HTTP/1.1, a obsługa plików cookie jest automatyczna.

Tsung umożliwia generowanie raportów.

Podsumowanie

Mam nadzieję, że te narzędzia do testowania obciążenia pomogą Ci lepiej zrozumieć wydajność Twojego serwera WWW i wybrać rozwiązanie najlepiej dopasowane do Twoich potrzeb.

Pamiętaj również o monitorowaniu wydajności witryny po wdrożeniu zmian.


newsblog.pl