Hur man utför webbserverprestandabenchmark?

Vet du din webbplatss genomsnittliga svarstid? Vet du hur många samtidiga användare din webbplats kan hantera?

Belastningstestning är avgörande för att webbapplikationer ska känna till webbplatsens kapacitet. Om du ska välja webbserver så är en av de första sakerna du vill göra att utföra belastningstesten och se vilken som fungerar bra för dig.

Benchmarking kan hjälpa dig att bestämma;

  • Vilken webbserver fungerar bäst
  • Antal servrar du behöver för att betjäna x antal förfrågningar
  • Vilken konfiguration ger dig bäst resultat
  • Vilka tekniska stackar presterar bättre
  • När din webbplats kommer att fungera långsammare eller nedbrytning

Det finns flera onlineverktyg för att utföra ett stresstest; men om du letar efter en intern lösning eller vill jämföra bara webbserverns prestanda, kan du använda ApacheBench och alternativt några av verktygen nedan.

Jag har använt Apache & Nginx webbserver som är värd DigitalOcean att testa det.

ApacheBench

ApacheBench (ab) är ett kommandoradsprogram med öppen källkod som fungerar med vilken webbserver som helst. I det här inlägget kommer jag att förklara hur man installerar det här lilla programmet och utför belastningstestet för att jämföra resultaten.

Apache

Låt oss installera ApacheBench genom att använda ett yum-kommando.

yum install httpd-tools

Om du redan har httpd-tools kan du ignorera detta.

Låt oss nu se hur det fungerar för 5000 förfrågningar med 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] ~]#

Så som du kan se har Apache hanterat 373 förfrågningar per sekund, och det tog totalt 13,389 sekunder att betjäna de totala förfrågningarna.

Nu vet du att standardkonfigurationen kan tjäna dessa många förfrågningar så när du gör några konfigurationsändringar kan du göra testet igen för att jämföra resultaten och välja den bästa.

Nginx

Låt oss göra testet vad vi gjorde för Apache så att du kan jämföra vilken som presterar bättre.

[[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!

Såg du att?

Nginx hanterade 6593 förfrågningar per sekund! En vinnare.

Så du ser bara om du jämför med två webbservrar får du en idé om vilken du ska välja för din webbapplikation.

Ovanstående test är på CentOS 6.8, 64 bit. Du kan prova flera kombinationer av OS & Web Server-version för optimala resultat.

Gillar du inte ApacheBench av någon anledning? Inga bekymmer, det finns många andra du kan använda för att utföra HTTP-laddning.

BELÄGRING

BELÄGRING är ett HTTP-lasttestverktyg som stöds på UNIX. Du kan lägga in flera URL:er i en textfil för att ladda tester mot. Du kan installera belägring med yum.

# yum install siege

Låt oss köra testet med 500 samtidiga förfrågningar i 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] ~]#

För att bryta ner parametrarna.

-q – för att köra det tyst (visar inte förfrågningsdetaljer)

-t – kör i 5 sekunder

-c – 500 samtidiga förfrågningar

Så som du kan se är tillgängligheten 100% och svarstiden är 0,04 sekunder. Du kan justera belastningstestparametern baserat på ditt mål.

Ali

Ali är ett relativt nytt lasttestverktyg för att utföra realtidsanalyser. Den stöder flera plattformar att installera, inklusive Docker.

När det är installerat, kör ali för att se användningsdetaljerna.

[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 ovan har du ett alternativ att skicka HTTP-rubriker, testlängd, hastighetsgräns, timeout och mer. Jag gjorde ett snabbt test på adminvista.com Tools och här ser resultatet ut.

Rapporten är interaktiv och ger detaljerad latensinformation.

Gobänk

Gobänk är skrivet på Go-språket och ett enkelt lasttestverktyg för att jämföra webbserverns prestanda. Den stöder mer än 20 000 samtidiga användare vilket ApacheBench inte gör.

Apache JMeter

JMeter är ett av de mest populära verktygen med öppen källkod för att mäta webbapplikationers prestanda. JMeter är Java-baserad applikation och inte bara en webbserver, utan du kan använda den mot PHP, Java. ASP.net, SOAP, REST, etc.

JMeter fick ett anständigt vänligt GUI, och den senaste versionen 3.0 kräver Java 7 eller högre för att starta applikationen. Du måste prova JMeter om ditt mål är att optimera webbapplikationens prestanda.

wrk

wrk är ett annat modernt verktyg för prestandamätning för att belasta din webbserver och ge dig latens, begäran per sekund, överföring per sekund, etc. detaljer.

Med wrk kan du ange att köra ett belastningstest med ett antal trådar.

Låt oss ta ett exempel på att köra ett test i 5 minuter med 500 samtidiga användare med 8 trådar.

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

Autokanon

Inspirerad av jobbet, autokanon är skrivet i Node.js. Du kan använda det programmatiskt, via API eller fristående verktyg. Allt du behöver är NodeJS installerat som en förutsättning.

Du kan kontrollera ett antal anslutningar, förfrågningar, varaktighet, arbetare, timeout, anslutningshastighet och erbjuda massor av alternativ för att benchmarka dina webbapplikationer.

Curl-loader

curl-loader skrivs i C för att simulera applikationsbelastning, och den stöder SSL/TLS. Tillsammans med webbsidestestet kan du också använda detta open source-verktyg för att utföra belastning på FTP-servrar.

Du kan skapa en testplan med en blandning av HTTP, HTTPS, FTP och FTPS i en enda batchkonfiguration.

httperf

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

Om du har det förväntade antalet samtidiga användare och vill testa om din webbserver kan betjäna ett antal av en begäran, kan du använda följande kommando.

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

Ovanstående kommando kommer att testa med 100 förfrågningar per sekund för 1000 HTTP-förfrågningar.

Tsung

Tsung är ett multi-protokoll distribuerat stresstestverktyg för att stressa HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL-server. Den stöder HTTP/1.0, HTTP/1.1 och cookies hanteras automatiskt.

Det är möjligt att skapa en rapport med Tsung.

Slutsats

Jag hoppas att ovanstående benchmarkingverktyg ger dig en uppfattning om din webbserverprestanda och bestämmer vad som fungerar bäst för ditt projekt.

Därefter, glöm inte att övervaka din webbplats prestanda.