Cum se efectuează un benchmark de performanță a serverului web?

Vă întrebați cât de repede răspunde site-ul dumneavoastră? Sunteți curios să aflați câți utilizatori simultani poate gestiona?

Testarea la sarcină este crucială pentru a înțelege limitele unei aplicații web. Dacă sunteți în procesul de a selecta un server web, testarea la sarcină este un pas inițial esențial pentru a determina care server funcționează optim pentru nevoile dumneavoastră.

Evaluarea performanței vă poate ghida în luarea deciziilor privind:

  • Serverul web cu cele mai bune rezultate.
  • Numărul necesar de servere pentru a gestiona un anumit volum de solicitări.
  • Configurația optimă pentru performanțe maxime.
  • Stivele tehnologice cu rezultate superioare.
  • Momentul în care site-ul dumneavoastră va încetini sau va da erori.

Deși există numeroase instrumente online pentru testarea stresului, dacă preferați o soluție internă sau doriți doar să evaluați performanța serverului web, puteți utiliza ApacheBench, alături de alte opțiuni menționate mai jos.

Am testat serverele web Apache și Nginx, găzduite pe DigitalOcean.

ApacheBench

ApacheBench (ab) este un instrument open-source, bazat pe linia de comandă, compatibil cu orice server web. În acest articol, voi explica cum să instalați acest program simplu și cum să efectuați testul de sarcină pentru a analiza rezultatele.

Apache

Pentru a instala ApacheBench, folosim comanda yum:

yum install httpd-tools

Dacă httpd-tools este deja instalat, puteți ignora acest pas.

Acum, să vedem cum funcționează cu 5000 de solicitări și 500 de solicitări concurente:

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

După cum se observă, Apache a gestionat 373 de solicitări pe secundă, finalizând toate cererile în 13.389 de secunde.

Acum aveți o idee despre câte solicitări poate gestiona configurația implicită. După ce faceți modificări, efectuați din nou testul pentru a compara rezultatele și a alege configurația optimă.

Nginx

Să repetăm testul pentru Nginx, ca să putem compara performanțele cu Apache:

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

Uau!

Ați văzut ce performanțe a avut Nginx?

Nginx a gestionat 6593 de solicitări pe secundă! Acesta este un câștigător clar.

Această comparație simplă între două servere web vă oferă o idee despre ce opțiune este cea mai potrivită pentru aplicația dumneavoastră web.

Testul de mai sus a fost realizat pe CentOS 6.8, 64 de biți. Vă încurajez să testați mai multe combinații de sisteme de operare și servere web pentru a găsi configurația optimă.

Nu sunteți mulțumit de ApacheBench? Nu vă faceți griji, există multe alte instrumente pe care le puteți folosi pentru a efectua teste de sarcină HTTP.

Siege

Siege este un utilitar de testare la sarcină HTTP compatibil cu sistemele UNIX. Puteți introduce mai multe URL-uri într-un fișier text pentru testele de sarcină. Siege poate fi instalat folosind yum:

# yum install siege

Să rulăm testul cu 500 de cereri simultane timp de 5 secunde:

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

Pentru a înțelege parametrii:

-q – rulează în mod silențios (nu afișează detaliile solicitării)

-t – rulează timp de 5 secunde

-c – 500 de solicitări concurente

După cum vedeți, disponibilitatea este de 100%, iar timpul de răspuns este de 0,04 secunde. Puteți modifica parametrii testului de sarcină în funcție de scopul dumneavoastră.

Ali

Ali este un instrument relativ nou pentru testarea sarcinilor, care oferă analize în timp real. Este compatibil cu diverse platforme, inclusiv Docker.

După instalare, rulați `ali` pentru a vedea detaliile de utilizare:

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

După cum vedeți, puteți specifica anteturi HTTP, durata testului, limita de rată, timeout și altele. Am efectuat un test rapid pe tipstrick.ro Tools, și iată rezultatul.

Raportul este interactiv și oferă informații detaliate despre latență.

Gobench

Gobench este un utilitar simplu pentru testarea sarcinilor, scris în limbajul Go, care evaluează performanța serverului web. Spre deosebire de ApacheBench, suportă peste 20.000 de utilizatori simultani.

Apache JMeter

JMeter este un instrument open-source extrem de popular pentru măsurarea performanței aplicațiilor web. Este bazat pe Java și poate testa nu doar servere web, ci și aplicații PHP, Java, ASP.net, SOAP, REST etc.

JMeter are o interfață grafică prietenoasă, iar cea mai recentă versiune (3.0) necesită Java 7 sau o versiune ulterioară pentru a funcționa. Dacă doriți să optimizați performanța aplicației web, JMeter este o opțiune excelentă.

wrk

wrk este un alt instrument modern pentru testarea performanțelor, care poate genera sarcină pe serverul web și oferă detalii despre latență, solicitări pe secundă, transfer pe secundă etc.

Cu wrk, puteți specifica numărul de fire de execuție pentru testul de sarcină.

Un exemplu ar fi rularea unui test timp de 5 minute, cu 500 de utilizatori simultani, folosind 8 fire de execuție:

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

Autocannon

Inspirat de wrk, autocannon este scris în Node.js și poate fi folosit programatic, prin API, sau ca utilitar independent. Condiția prealabilă este instalarea NodeJS.

Puteți controla numărul de conexiuni, solicitări, durata, lucrătorii, timeout-ul, rata de conectare și alte opțiuni pentru a compara aplicațiile dumneavoastră web.

curl-loader

curl-loader este scris în C, simulează sarcina aplicației și este compatibil cu SSL/TLS. Pe lângă testarea paginilor web, puteți utiliza acest instrument open-source și pentru a testa serverele FTP.

Puteți crea un plan de testare care să combine HTTP, HTTPS, FTP și FTPS într-o singură configurație.

httperf

httperf este un instrument performant, axat pe evaluările la nivel micro și macro. Este compatibil cu protocoalele HTTP/1.1 și SSL.

Dacă aveți un număr estimat de utilizatori concurenți și doriți să verificați dacă serverul web poate gestiona solicitările, utilizați următoarea comandă:

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

Această comandă testează cu 100 de solicitări pe secundă, pentru un total de 1000 de solicitări HTTP.

Tsung

Tsung este un instrument distribuit de testare a stresului multi-protocol pentru a testa servere HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Este compatibil cu HTTP/1.0, HTTP/1.1, iar gestionarea cookie-urilor este automată.

Tsung oferă opțiunea de a genera rapoarte.

În concluzie:

Sper că aceste instrumente de evaluare v-au oferit o perspectivă asupra performanțelor serverului dumneavoastră web și vă ajută să decideți care opțiune este cea mai potrivită pentru proiectul dumneavoastră.

Nu uitați să monitorizați constant performanța site-ului dumneavoastră.