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

Znáte průměrnou dobu odezvy vašeho webu? Víte, kolik souběžných uživatelů váš web zvládne?

Zátěžové testování je nezbytné, aby webové aplikace poznaly kapacitu webu. Pokud si máte vybrat webový server, pak jedna z prvních věcí, kterou chcete udělat, je provést zátěžové testování a zjistit, který pro vás funguje dobře.

Benchmarking vám může pomoci při rozhodování;

  • Který webový server funguje nejlépe
  • Počet serverů, které potřebujete obsloužit x počet požadavků
  • Která konfigurace vám poskytne nejlepší výsledky
  • Které technologické sady fungují lépe
  • Kdy bude váš web fungovat pomaleji nebo se rozpadne

Existuje několik online nástrojů k provedení zátěžového testu; pokud však hledáte interní řešení nebo chcete porovnávat pouze výkon webového serveru, můžete použít ApacheBench a alternativně některé z níže uvedených nástrojů.

Použil jsem webový server Apache & Nginx hostovaný na DigitalOcean otestovat to.

ApacheBench

ApacheBench (ab) je program příkazového řádku s otevřeným zdrojovým kódem, který funguje s libovolným webovým serverem. V tomto příspěvku vysvětlím, jak nainstalovat tento malý program a provést zátěžový test pro porovnání výsledků.

Apache

Pojďme si ApacheBench nainstalovat pomocí příkazu yum.

yum install httpd-tools

Pokud již máte httpd-tools, můžete to ignorovat.

Nyní se podívejme, jak funguje pro 5000 požadavků se souběžností 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 tedy můžete vidět, Apache zpracoval 373 požadavků za sekundu a obsloužení všech požadavků trvalo celkem 13,389 sekund.

  Jaký je časový limit Google Meet pro schůzku

Nyní víte, že výchozí konfigurace může obsloužit tolik požadavků, takže když provedete jakékoli změny konfigurace, můžete provést test znovu, porovnat výsledky a vybrat ten nejlepší.

Nginx

Pojďme si otestovat, co jsme udělali pro Apache, abyste mohli porovnat, který z nich funguje 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] ~]#

PÁNI!

Viděl jsi to?

Nginx zpracoval 6593 požadavků za sekundu! Vítěz.

Takže pouhým porovnáním se dvěma webovými servery získáte představu, který z nich vybrat pro vaši webovou aplikaci.

Výše uvedený test je na CentOS 6.8, 64bit. Pro dosažení optimálních výsledků můžete vyzkoušet více kombinací verzí OS a webového serveru.

Nelíbí se vám ApacheBench z jakéhokoli důvodu? Žádný strach, existuje spousta dalších, které můžete použít k provedení načítání HTTP.

OBLEŽENÍ

OBLEŽENÍ je nástroj pro test zatížení HTTP podporovaný v systému UNIX. Do textového souboru můžete vložit více adres URL, proti kterým se načítají testy. Siege můžete nainstalovat pomocí yum.

# yum install siege

Spusťte 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] ~]#

Abych rozepsal parametry.

  Jak odesílat e-maily prostřednictvím Gmailu v Pythonu?

-q – pro tiché spuštění (nezobrazení podrobností požadavku)

-t – běh po dobu 5 sekund

-c – 500 souběžných požadavků

Jak tedy vidíte, dostupnost je 100% a doba odezvy je 0,04 sekundy. Parametr zátěžového testu můžete upravit podle svého cíle.

Ali

Ali je relativně nový nástroj pro testování zátěže pro provádění analýzy v reálném čase. Podporuje více platforem k instalaci, včetně Dockeru.

Po instalaci spusťte ali, abyste viděli podrobnosti o 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 vidíte výše, máte možnost odesílat HTTP hlavičky, trvání testu, limit rychlosti, časový limit a další. Udělal jsem rychlý test na etechblog.cz Tools a tady je výstup.

Zpráva je interaktivní a poskytuje podrobné informace o latenci.

Gobench

Gobench je napsán v jazyce Go a jednoduchý nástroj pro testování zátěže pro srovnání výkonu webového serveru. Podporuje více než 20 000 souběžných uživatelů, což ApacheBench nepodporuje.

  Jak odesílat textové zprávy z počítače

Apache JMeter

JMeter je jedním z nejpopulárnějších open-source nástrojů pro měření výkonu webových aplikací. JMeter je Java aplikace a nejen webový server, ale můžete ji použít proti PHP, Java. ASP.net, SOAP, REST atd.

JMeter má slušné přátelské GUI a nejnovější verze 3.0 vyžaduje ke spuštění aplikace Java 7 nebo vyšší. Pokud je vaším cílem optimalizovat výkon webové aplikace, musíte JMeter vyzkoušet.

wrk

wrk je další moderní nástroj pro měření výkonu, který zatíží váš webový server a poskytne vám podrobnosti o latenci, požadavku za sekundu, přenosu za sekundu atd.

Pomocí wrk můžete určit spuštění zátěžového testu s počtem vláken.

Vezměme si příklad spuštění testu po dobu 5 minut s 500 souběžnými uživateli s 8 vlákny.

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

Autokanón

Inspirován prací, autokanón je napsán v Node.js. Můžete jej používat programově, prostřednictvím API nebo samostatného nástroje. Vše, co potřebujete, je instalace NodeJS jako předpoklad.

Můžete ovládat řadu připojení, požadavků, trvání, pracovníky, časový limit, rychlost připojení a nabídnout spoustu možností pro srovnání vašich webových aplikací.

Curl-loader

curl-loader je napsán v C pro simulaci zatížení aplikací a podporuje SSL/TLS. Spolu s testem webové stránky můžete tento nástroj s otevřeným zdrojovým kódem použít také k provedení zatížení na serverech FTP.

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

httperf

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

Pokud máte očekávaný počet souběžných uživatelů a chcete otestovat, zda váš webový server dokáže obsloužit určitý počet požadavků, můžete použít následující příkaz.

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

Výše uvedený příkaz bude testovat se 100 požadavky za sekundu pro 1000 požadavků HTTP.

Tsung

Tsung je multiprotokolový distribuovaný nástroj pro zátěžové testování pro stres HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL server. Podporuje HTTP/1.0, HTTP/1.1 a soubory cookie jsou zpracovávány automaticky.

Generování zprávy je možné pomocí Tsung.

Závěr

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

Dále nezapomeňte sledovat výkon vašeho webu.