Jak provést benchmark výkonu webového serveru?

Jak otestovat výkon vašeho webového serveru?

Jste si vědomi průměrné doby odezvy vašeho webu? Tušíte, kolik uživatelů může váš web obsloužit současně?

Zátěžové testování je klíčové pro zjištění kapacity webové aplikace. Pokud stojíte před výběrem webového serveru, je jedním z prvních kroků provedení zátěžových testů, abyste zjistili, který z nich bude pro vás nejvhodnější.

Benchmarking vám může pomoci při rozhodování v těchto oblastech:

  • Který webový server se chová nejefektivněji.
  • Kolik serverů je potřeba pro obsloužení daného počtu požadavků.
  • Jaká konfigurace vám přinese nejlepší výsledky.
  • Která technologická řešení fungují lépe.
  • Kdy se web zpomalí nebo přestane fungovat.

Existuje mnoho online nástrojů pro zátěžové testování. Nicméně, pokud hledáte interní řešení nebo se chcete zaměřit pouze na porovnání výkonu serverů, můžete využít ApacheBench, případně některé z dalších uvedených nástrojů.

Pro účely testování jsem použil webové servery Apache a Nginx, které byly hostovány na DigitalOcean.

ApacheBench

ApacheBench (ab) je open-source nástroj příkazové řádky, který je kompatibilní s jakýmkoli webovým serverem. V tomto článku si ukážeme, jak tento program nainstalovat a provést zátěžový test pro srovnání výkonů.

Testování serveru Apache

ApacheBench nainstalujeme pomocí příkazu yum.

yum install httpd-tools

Pokud máte httpd-tools již nainstalované, můžete tento krok přeskočit.

Nyní si ukážeme, jak provést test s 5000 požadavky při souběžnosti 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] ~]#

Z výsledků je zřejmé, že Apache zpracoval 373 požadavků za sekundu a celková doba obsloužení všech požadavků trvala 13,389 sekund.

Nyní máte představu o výchozím výkonu serveru. Jakékoli změny v konfiguraci můžete otestovat znovu, porovnat výsledky a vybrat nejvhodnější variantu.

Testování serveru Nginx

Pojďme otestovat Nginx stejným způsobem jako Apache, abychom mohli srovnat, který z nich si vede lépe.

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

Ohromující!

Vidíte ten rozdíl?

Nginx zpracoval neuvěřitelných 6593 požadavků za sekundu! Jednoznačný vítěz.

Už jen porovnáním těchto dvou serverů získáte dobrou představu, který z nich by mohl být vhodnější pro vaši webovou aplikaci.

Výše uvedený test byl proveden na CentOS 6.8, 64bit. Pro dosažení optimálních výsledků doporučuji testovat s různými kombinacemi OS a webových serverů.

Neoslovuje vás ApacheBench z jakéhokoliv důvodu? Žádný problém, existuje spousta dalších nástrojů, které můžete použít pro HTTP zátěžové testování.

SIEGE

SIEGE je nástroj pro zátěžové testování HTTP, který je podporován v systému UNIX. Umožňuje načíst seznam URL z textového souboru a provést proti nim zátěžové testy. Siege nainstalujete pomocí yum.

# yum install siege

Provedeme test s 500 souběžnými požadavky po dobu 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] ~]#

Rozepíšeme si parametry:

  • -q – tichý režim (bez detailů požadavků)
  • -t – testování po dobu 5 sekund
  • -c – 500 souběžných požadavků

Jak je vidět, dostupnost je 100% a doba odezvy 0,04 sekundy. Parametry zátěžového testu si můžete upravit podle vašich potřeb.

Ali

Ali je relativně nový nástroj pro zátěžové testování, který nabízí analýzu v reálném čase. Podporuje instalaci na různých platformách, včetně Dockeru.

Po instalaci spusťte ali, abyste získali přehled o jeho použití.

[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 je vidět, nabízí možnost odesílání HTTP hlaviček, nastavení trvání testu, omezení rychlosti, timeoutu a další. Provedl jsem rychlý test na etechblog.cz Tools a zde je výstup. Zpráva je interaktivní a poskytuje detailní informace o latenci.

Gobench

Gobench je nástroj pro zátěžové testování napsaný v Go a slouží ke srovnání výkonu webového serveru. Podporuje více než 20 000 souběžných uživatelů, což je limit, který ApacheBench nepodporuje.

Apache JMeter

JMeter je jeden z nejpopulárnějších open-source nástrojů pro měření výkonu webových aplikací. JMeter je Java aplikace a lze jej použít nejen pro testování webových serverů, ale také pro PHP, Java, ASP.net, SOAP, REST a další.

JMeter nabízí intuitivní grafické rozhraní a nejnovější verze 3.0 vyžaduje pro spuštění Java 7 nebo novější. Pokud je vaším cílem optimalizovat výkon webové aplikace, JMeter byste rozhodně měli vyzkoušet.

wrk

wrk je další moderní nástroj pro měření výkonu, který zatíží webový server a poskytne detailní informace o latenci, počtu požadavků za sekundu, propustnosti a dalších metrikách.

Pomocí wrk můžete nastavit počet vláken pro spuštění zátěžového testu.

Například, pro spuštění testu po dobu 5 minut s 500 souběžnými uživateli a 8 vlákny použijete tento příkaz:

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

Autocannon

Inspirován nástrojem wrk, autocannon je napsaný v Node.js. Lze jej použít programově, prostřednictvím API nebo jako samostatný nástroj. Předpokladem je instalace NodeJS.

Umožňuje řídit počet spojení, požadavků, trvání, pracovníků, timeout, rychlost připojení a nabízí mnoho možností pro srovnání vašich webových aplikací.

Curl-loader

curl-loader je napsán v C a slouží k simulaci zátěže aplikací s podporou SSL/TLS. Můžete ho použít pro zátěžové testování webových stránek i pro FTP servery.

Můžete vytvořit testovací plán s kombinací HTTP, HTTPS, FTP a FTPS v jedné konfiguraci.

httperf

httperf je vysoce výkonný nástroj, který se zaměřuje na srovnávání na mikro i makro úrovni. Podporuje protokoly HTTP/1.1 a SSL.

Pokud máte představu o počtu souběžných uživatelů a chcete otestovat, zda webový server zvládne určitý počet požadavků, můžete použít tento příkaz:

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

Tento příkaz otestuje 100 požadavků za sekundu pro celkem 1000 HTTP požadavků.

Tsung

Tsung je multi-protokolový distribuovaný nástroj pro zátěžové testování HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL serverů. Podporuje HTTP/1.0, HTTP/1.1 a automaticky zpracovává cookies.

Tsung umožňuje i generování reportů.

Závěr

Doufám, že uvedené nástroje pro srovnávání vám pomohou získat představu o výkonu vašeho webového serveru a rozhodnout se, co je pro váš projekt nejlepší.

Nezapomeňte také pravidelně sledovat výkon vašeho webu.