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

Czy znasz średni czas odpowiedzi swojej witryny? Czy wiesz, ilu jednoczesnych użytkowników może obsłużyć Twoja witryna?

Testowanie obciążenia jest niezbędne, aby aplikacje internetowe znały pojemność witryny. Jeśli masz wybrać serwer WWW, jedną z pierwszych rzeczy, które chcesz zrobić, jest przeprowadzenie testów obciążenia i sprawdzenie, który z nich działa dobrze.

Analiza porównawcza może pomóc w podjęciu decyzji;

  • Który serwer WWW działa najlepiej
  • Liczba serwerów potrzebnych do obsługi x liczba żądań
  • Która konfiguracja daje najlepsze rezultaty
  • Które stosy technologii działają lepiej
  • Kiedy Twoja witryna będzie działać wolniej lub ulegnie awarii

Istnieje kilka narzędzi online do przeprowadzenia testu warunków skrajnych; jeśli jednak szukasz rozwiązania wewnętrznego lub chcesz porównać tylko wydajność serwera WWW, możesz użyć ApacheBench i alternatywnie niektórych narzędzi wymienionych poniżej.

Korzystałem z hostowanego serwera WWW Apache i Nginx CyfrowyOcean przetestować to.

ApacheBench

ApacheBench (ab) to program wiersza poleceń typu open source, który działa z dowolnym serwerem WWW. W tym poście wyjaśnię, jak zainstalować ten mały program i przeprowadzić test obciążenia, aby porównać wyniki.

Apache

Zainstalujmy ApacheBench za pomocą polecenia yum.

yum install httpd-tools

Jeśli masz już narzędzia httpd, możesz to zignorować.

Teraz zobaczmy, jak działa dla 5000 żądań przy współbieżności 500.

[[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 widać, Apache obsłużył 373 żądania na sekundę, a obsłużenie wszystkich żądań zajęło łącznie 13,389 sekund.

Teraz wiesz, że domyślna konfiguracja może obsłużyć tak wiele żądań, więc po wprowadzeniu jakichkolwiek zmian w konfiguracji możesz ponownie przeprowadzić test, aby porównać wyniki i wybrać najlepszy.

Nginx

Zróbmy test tego, co zrobiliśmy dla Apache, abyś mógł porównać, który z nich działa lepiej.

[[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] ~]#

WOW!

Widziałeś to?

Nginx obsłużył 6593 żądań na sekundę! Zwycięzca.

Więc widzisz, porównując tylko dwa serwery WWW, będziesz miał pomysł, który wybrać dla swojej aplikacji internetowej.

Powyższy test dotyczy CentOS 6.8, 64-bitowy. Możesz wypróbować wiele kombinacji wersji systemu operacyjnego i serwera WWW, aby uzyskać optymalne wyniki.

Nie lubisz ApacheBench z jakiegokolwiek powodu? Nie martw się, istnieje wiele innych, których możesz użyć do wykonania ładowania HTTP.

OBLĘŻENIE

OBLĘŻENIE to narzędzie do testowania obciążenia HTTP obsługiwane w systemie UNIX. Możesz umieścić wiele adresów URL w pliku tekstowym, aby załadować testy. Możesz zainstalować oblężenie za pomocą yum.

# yum install siege

Uruchommy test z 500 równoczesnymi żądaniami 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] ~]#

Aby rozbić parametry.

-q – aby uruchomić go po cichu (nie pokazując szczegółów żądania)

-t – uruchom przez 5 sekund

-c – 500 jednoczesnych żądań

Jak więc widać, dostępność wynosi 100%, a czas odpowiedzi to 0,04 sekundy. Możesz dostosować parametr testu obciążenia w zależności od celu.

Ali

Ali to stosunkowo nowe narzędzie do testowania obciążenia do przeprowadzania analiz w czasie rzeczywistym. Obsługuje wiele platform do zainstalowania, w tym Docker.

Po zainstalowaniu uruchom ali, aby zobaczyć szczegóły 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ć powyżej, masz opcję wysyłania nagłówków HTTP, czasu trwania testu, limitu szybkości, limitu czasu i innych. Zrobiłem szybki test na newsblog.pl Tools i oto jak wygląda wynik.

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

Gobench

Gobench jest napisany w języku Go i prostym narzędziem do testowania obciążenia w celu porównania wydajności serwera WWW. Obsługuje ponad 20 000 jednoczesnych użytkowników, których ApacheBench nie obsługuje.

Apache JMeter

JMeter jest jednym z najpopularniejszych narzędzi typu open source do pomiaru wydajności aplikacji internetowych. JMeter jest aplikacją opartą na Javie i nie tylko serwerem WWW, ale można go używać przeciwko PHP, Javie. ASP.net, SOAP, REST itp.

JMeter otrzymał przyzwoite przyjazne GUI, a najnowsza wersja 3.0 wymaga Javy 7 lub nowszej do uruchomienia aplikacji. Musisz wypróbować JMeter, jeśli Twoim celem jest optymalizacja wydajności aplikacji internetowej.

praca

praca to kolejne nowoczesne narzędzie do pomiaru wydajności, które obciąża serwer WWW i podaje informacje o opóźnieniu, żądaniu na sekundę, transferze na sekundę itp.

Za pomocą wrk możesz określić uruchomienie testu obciążenia z wieloma wątkami.

Weźmy przykład uruchomienia testu przez 5 minut z 500 jednoczesnymi użytkownikami z 8 wątkami.

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

Działo automatyczne

Zainspirowany pracą, działko automatyczne jest napisany w Node.js. Możesz go używać programowo, poprzez API lub samodzielne narzędzie. Wystarczy zainstalować NodeJS jako warunek wstępny.

Możesz kontrolować liczbę połączeń, żądań, czasu trwania, pracowników, limitu czasu, szybkości połączenia i oferować mnóstwo opcji do testowania aplikacji internetowych.

Curl-loader

ładowanie loków jest napisany w C, aby symulować obciążenie aplikacji i obsługuje SSL/TLS. Wraz z testem strony internetowej możesz także użyć tego narzędzia typu open source do obciążenia serwerów FTP.

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

httperf

The httperf to narzędzie o wysokiej wydajności, które koncentruje się na testach porównawczych na poziomie mikro i makro. Obsługuje protokoły HTTP/1.1 i SSL.

Jeśli masz oczekiwaną liczbę jednoczesnych użytkowników i chcesz sprawdzić, czy Twój serwer WWW może obsłużyć liczbę żądań, możesz użyć następującego polecenia.

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

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

Tsung

Tsung to wieloprotokołowe rozproszone narzędzie do testowania warunków skrajnych do obciążania serwerów HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Obsługuje HTTP/1.0, HTTP/1.1, a pliki cookie są obsługiwane automatycznie.

Generowanie raportu jest możliwe dzięki Tsungowi.

Wniosek

Mam nadzieję, że powyższe narzędzia do testów porównawczych dadzą ci wyobrażenie o wydajności twojego serwera WWW i zdecydują, co najlepiej sprawdza się w twoim projekcie.

Następnie nie zapomnij monitorować wydajności swojej witryny.