Come eseguire il benchmark delle prestazioni del server Web?

Conosci il tempo medio di risposta del tuo sito web? Sai quanti utenti simultanei può gestire il tuo sito?

Il test di carico è essenziale per le applicazioni web per conoscere la capacità del sito web. Se devi scegliere il server web, una delle prime cose che vuoi fare è eseguire il test di carico e vedere quale funziona meglio per te.

Il benchmarking può aiutarti a decidere;

  • Quale server web funziona meglio
  • Numero di server necessari per servire x numero di richieste
  • Quale configurazione ti dà i migliori risultati
  • Quali stack tecnologici funzionano meglio
  • Quando il tuo sito funzionerà più lentamente o si guasterà

Esistono diversi strumenti online per eseguire uno stress test; tuttavia, se stai cercando una soluzione interna o desideri confrontare solo le prestazioni del server Web, puoi utilizzare ApacheBench e in alternativa alcuni degli strumenti elencati di seguito.

Ho utilizzato il server Web Apache e Nginx ospitato su Oceano Digitale per testarlo.

ApacheBench

ApacheBench (ab) è un programma a riga di comando open source che funziona con qualsiasi server web. In questo post, spiegherò come installare questo piccolo programma ed eseguire il test di carico per confrontare i risultati.

Apache

Installiamo ApacheBench usando un comando yum.

yum install httpd-tools

Se hai già httpd-tools, puoi ignorarlo.

Ora, vediamo come si comporta per 5000 richieste con una concorrenza di 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] ~]#

Quindi, come puoi vedere, Apache ha gestito 373 richieste al secondo e ci sono voluti un totale di 13.389 secondi per soddisfare le richieste totali.

Ora sai che la configurazione predefinita può soddisfare queste numerose richieste, quindi quando apporti modifiche alla configurazione puoi ripetere il test per confrontare i risultati e scegliere quello migliore.

Nginx

Facciamo il test che abbiamo fatto per Apache in modo da poter confrontare quale funziona meglio.

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

OH!

Hai visto che?

Nginx ha gestito 6593 richieste al secondo! Un vincitore.

Quindi vedi che solo confrontando con due server web avrai un’idea di quale scegliere per la tua applicazione web.

Il test sopra è su CentOS 6.8, 64 bit. Puoi provare più combinazioni di versione del sistema operativo e del server Web per ottenere risultati ottimali.

Non ti piace ApacheBench per qualsiasi motivo? Nessun problema, ce ne sono molti altri che puoi utilizzare per eseguire il caricamento HTTP.

ASSEDIO

ASSEDIO è un’utilità di test di carico HTTP supportata su UNIX. Puoi inserire più URL in un file di testo per caricare i test. Puoi installare assedio usando yum.

# yum install siege

Eseguiamo il test con 500 richieste simultanee per 5 secondi.

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

Per abbattere i parametri.

-q – per eseguirlo in silenzio (non mostrando i dettagli della richiesta)

-t – eseguire per 5 secondi

-c – 500 richieste simultanee

Quindi, come puoi vedere, la disponibilità è del 100% e il tempo di risposta è di 0,04 secondi. Puoi modificare il parametro del test di carico in base al tuo obiettivo.

Ali

Ali è uno strumento di test di carico relativamente nuovo per eseguire analisi in tempo reale. Supporta più piattaforme da installare, incluso Docker.

Una volta installato, esegui ali per vedere i dettagli di utilizzo.

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

Come puoi vedere sopra, hai la possibilità di inviare intestazioni HTTP, durata del test, limite di velocità, timeout e altro. Ho fatto un rapido test su winadmin.it Tools ed ecco l’output simile.

Il report è interattivo e fornisce informazioni dettagliate sulla latenza.

Gobench

Gobench è scritto in linguaggio Go e semplice utilità di test di carico per confrontare le prestazioni del server web. Supporta più di 20.000 utenti simultanei che ApacheBench non supporta.

Apache JMeter

JMeter è uno degli strumenti open source più popolari per misurare le prestazioni delle applicazioni web. JMeter è un’applicazione basata su Java e non solo un server web, ma puoi usarlo contro PHP, Java. ASP.net, SOAP, REST, ecc.

JMeter ha una GUI decente e amichevole e l’ultima versione 3.0 richiede Java 7 o versioni successive per avviare l’applicazione. Devi provare JMeter se il tuo obiettivo è ottimizzare le prestazioni dell’applicazione web.

lavoro

lavoro è un altro moderno strumento di misurazione delle prestazioni per caricare il tuo server Web e fornirti dettagli su latenza, richiesta al secondo, trasferimento al secondo, ecc.

Con wrk, puoi specificare di eseguire un test di carico con un numero di thread.

Facciamo un esempio di esecuzione di un test per 5 minuti con 500 utenti simultanei con 8 thread.

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

Cannone automatico

Ispirato dal lavoro, autocannon è scritto in Node.js. Puoi usarlo a livello di programmazione, tramite API o utilità autonoma. Tutto ciò di cui hai bisogno è NodeJS installato come prerequisito.

Puoi controllare una serie di connessioni, richieste, durata, lavoratori, timeout, velocità di connessione e offrire tantissime opzioni per confrontare le tue applicazioni web.

Caricatore di ricci

caricatore di ricci è scritto in C per simulare il carico dell’applicazione e supporta SSL/TLS. Insieme al test della pagina Web, puoi anche utilizzare questo strumento open source per eseguire il caricamento sui server FTP.

Puoi creare un piano di test con una combinazione di HTTP, HTTPS, FTP e FTPS in un’unica configurazione batch.

httperf

Il httperf è uno strumento ad alte prestazioni che si concentra su benchmark di livello micro e macro. Supporta i protocolli HTTP/1.1 e SSL.

Se hai il numero previsto di utenti simultanei e stai cercando di verificare se il tuo server web può servire un numero di richieste, puoi usare il seguente comando.

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

Il comando precedente testerà con 100 richieste al secondo per 1000 richieste HTTP.

Tsung

Tsung è uno strumento di stress test distribuito multiprotocollo per stressare server HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Supporta HTTP/1.0, HTTP/1.1 e i cookie vengono gestiti automaticamente.

La generazione di un rapporto è fattibile con Tsung.

Conclusione

Spero che gli strumenti di benchmarking di cui sopra ti diano un’idea delle prestazioni del tuo server web e decidano cosa funziona meglio per il tuo progetto.

Successivamente, non dimenticare di monitorare le prestazioni del tuo sito web.