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.