Hur man utför webbserverprestandabenchmark?

By rik

Förstå kapaciteten hos din webbplats genom belastningstester

Känner du till den genomsnittliga svarstiden för din webbplats? Har du koll på hur många samtidiga användare din webbplats klarar av?

Belastningstester är grundläggande för webbapplikationer. De ger insikt i webbplatsens kapacitet. Om du står inför valet av webbserver, är det klokt att inleda med just belastningstester för att se vilken som fungerar optimalt för dina behov.

Genom riktmärkning kan du ta reda på:

  • Vilken webbserver som presterar bäst för dina behov.
  • Antalet servrar som behövs för att hantera ett visst antal förfrågningar.
  • Vilken konfiguration som ger dig de bästa resultaten.
  • Vilka tekniska lösningar som ger bättre prestanda.
  • Vid vilken belastning din webbplats börjar sakta ner eller bryter samman.

Flera onlineverktyg kan hjälpa dig med stresstester. Men om du föredrar en intern lösning, eller vill jämföra prestanda hos olika webbservrar direkt, kan du använda ApacheBench och även några av de alternativ som presenteras nedan.

I mitt exempel har jag använt webbservrarna Apache och Nginx, hostade hos DigitalOcean, för att utföra testerna.

ApacheBench: En detaljerad genomgång

ApacheBench (ab) är ett kommandoradsverktyg med öppen källkod, kompatibelt med alla webbservrar. I den här artikeln kommer jag att förklara hur man installerar detta verktyg och utför belastningstester för att jämföra olika resultat.

Installera ApacheBench

För att installera ApacheBench, använd följande yum-kommando:

yum install httpd-tools

Om du redan har httpd-tools installerade kan du bortse från detta steg.

Låt oss nu analysera hur ApacheBench fungerar med 5000 förfrågningar och en samtidighet på 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] ~]#

Som vi kan se, hanterade Apache 373 förfrågningar per sekund. Den totala tiden för att betjäna alla förfrågningar var 13,389 sekunder.

Nu när du har en referenspunkt för standardkonfigurationen, kan du göra om testet efter eventuella konfigurationsändringar för att se hur de påverkar prestandan och välja den optimala inställningen.

Testning med Nginx

Låt oss utföra samma test med Nginx för att jämföra prestanda:

[[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
100%     79 (longest request)
[[email protected] ~]#

Imponerande resultat!

Nginx hanterade hela 6593 förfrågningar per sekund. Det är en tydlig vinnare.

Genom att jämföra resultaten från två webbservrar får du en tydlig uppfattning om vilken som är bäst lämpad för din webbapplikation.

Testerna ovan utfördes på CentOS 6.8, 64 bit. Du kan experimentera med olika kombinationer av operativsystem och webbserverversioner för att optimera resultaten.

Om du av någon anledning inte vill använda ApacheBench, finns det flera andra verktyg tillgängliga för HTTP-belastningstester.

Belägring: Ett robust testverktyg

Belägring är ett HTTP-lasttestverktyg som är kompatibelt med UNIX-system. Du kan inkludera flera URL:er i en textfil för att utföra tester mot. Installationen av Belägring görs enkelt med yum:

# yum install siege

Låt oss utföra ett test med 500 samtidiga förfrågningar under 5 sekunder:

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

En förklaring av parametrarna:

  • -q – kör tyst (visar inte detaljer för varje förfrågan).
  • -t – testet körs i 5 sekunder.
  • -c – 500 samtidiga förfrågningar.

Som vi ser är tillgängligheten 100% och svarstiden 0,04 sekunder. Du kan anpassa belastningstestparametrarna utifrån dina specifika mål.

Ali: Realtidsanalys av prestanda

Ali är ett nyare verktyg för belastningstester som möjliggör realtidsanalys. Det är kompatibelt med flera plattformar, inklusive Docker.

När Ali är installerat, kör kommandot för att visa användningsinformationen:

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

Som du kan se har du möjlighet att skicka HTTP-headers, definiera testlängd, hastighetsgränser, timeout och mer. Jag utförde ett snabbt test på adminvista.com Tools, och här är resultatet:

Rapporten är interaktiv och ger detaljerad information om latens.

Gobench: Prestandatest skrivet i Go

Gobench är skrivet i Go och är ett enkelt belastningstestverktyg för att jämföra webbserverns prestanda. Det kan hantera över 20 000 samtidiga användare, vilket är mer än vad ApacheBench klarar av.

Apache JMeter: Mångsidigt prestandatestverktyg

JMeter är ett mycket populärt verktyg med öppen källkod för att mäta prestanda hos webbapplikationer. JMeter är en Java-baserad applikation som inte bara testar webbservrar, utan även PHP, Java, ASP.net, SOAP, REST, med flera.

JMeter har ett användarvänligt GUI. Den senaste versionen (3.0) kräver Java 7 eller senare. Om målet är att optimera din webbapplikations prestanda, bör du definitivt prova JMeter.

wrk: Modernt verktyg för prestandamätning

wrk är ett annat modernt prestandamätningsverktyg som ger detaljerad information om latens, förfrågningar per sekund och dataöverföring per sekund.

Med wrk kan du specificera antalet trådar som ska användas i belastningstestet.

Låt oss titta på ett exempel där ett test körs i 5 minuter med 500 samtidiga användare och 8 trådar:

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

Autocannon: Flexibelt och programmerbart verktyg

Med inspiration från wrk, är autocannon skrivet i Node.js. Det kan användas programmatiskt via API eller som ett fristående verktyg. Förutsättningen är att du har NodeJS installerat.

Du kan styra antalet anslutningar, förfrågningar, testlängd, arbetare, timeout, anslutningshastighet och har massvis av alternativ för att utvärdera dina webbapplikationer.

Curl-loader: Simulerar applikationsbelastning

curl-loader är skrivet i C för att simulera applikationsbelastning och stöder SSL/TLS. Detta open source-verktyg kan användas inte bara för webbsidetester, utan också för belastning av FTP-servrar.

Du kan skapa testplaner med en kombination av HTTP, HTTPS, FTP och FTPS i en och samma batchkonfiguration.

httperf: Högpresterande verktyg

httperf är ett högpresterande verktyg som fokuserar på riktmärkning på mikro- och makronivå. Det stöder HTTP/1.1- och SSL-protokoll.

Om du känner till det förväntade antalet samtidiga användare och vill se om din webbserver kan hantera en viss mängd förfrågningar, kan du använda följande kommando:

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

Kommandot ovan testar med 100 förfrågningar per sekund, med totalt 1000 HTTP-förfrågningar.

Tsung: Distribuerat testverktyg

Tsung är ett distribuerat stresstestverktyg för flera protokoll som stressar HTTP, SOAP, PostgreSQL, LDAP, XAMP och MySQL. Det stöder HTTP/1.0, HTTP/1.1 och cookies hanteras automatiskt.

Det är möjligt att generera rapporter med Tsung.

Slutsats

Jag hoppas att denna översikt över olika benchmarking-verktyg ger dig en bra uppfattning om din webbservers prestanda och hjälper dig att välja det som fungerar bäst för ditt projekt.

Kom ihåg att kontinuerligt övervaka prestandan på din webbplats.