Како извршити бенцхмарк перформанси веб сервера?

Da li ste upoznati sa prosečnim vremenom odziva vaše internet stranice? Da li znate koliko istovremenih korisnika vaša veb lokacija može da podnese?

Testiranje opterećenja je ključno kako bi veb aplikacije mogle da razumeju kapacitet veb sajta. Ako ste u procesu odabira veb servera, testiranje opterećenja je jedan od prvih koraka koji treba preduzeti kako biste utvrdili koji server najbolje odgovara vašim potrebama.

Analiza performansi vam može pomoći da odlučite:

  • Koji veb server postiže najbolje rezultate
  • Koliko servera vam je potrebno da biste opslužili određeni broj zahteva
  • Koja konfiguracija daje optimalne rezultate
  • Koje tehnološke kombinacije pružaju superiorne performanse
  • U kom trenutku će vaš sajt početi da radi sporije ili čak da se ruši

Na internetu postoji nekoliko alata za testiranje opterećenja, međutim, ukoliko preferirate interno rešenje ili želite da analizirate samo performanse veb servera, možete koristiti ApacheBench ili neki od alata koji su navedeni u nastavku.

Ja sam koristio Apache i Nginx veb servere hostovane na DigitalOcean radi testiranja.

ApacheBench

ApacheBench (ab) je open-source program koji se koristi preko komandne linije i kompatibilan je sa svim veb serverima. U ovom tekstu ću objasniti kako instalirati ovaj koristan program i kako izvršiti test opterećenja radi poređenja rezultata.

Apache

Instalirajmo ApacheBench koristeći yum komandu.

yum install httpd-tools

Ukoliko već imate instalirane httpd-tools, možete preskočiti ovaj korak.

Sada, pogledajmo rezultate za 5000 zahteva sa 500 istovremenih konekcija.

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

Kao što možete videti, Apache je obradio 373 zahteva u sekundi, a ukupno vreme za obradu svih zahteva je iznosilo 13.389 sekundi.

Sada znate da standardna konfiguracija može da podnese ovoliki broj zahteva. Ukoliko u budućnosti budete vršili izmene konfiguracije, možete ponovo testirati performanse radi poređenja rezultata i odabrati optimalnu konfiguraciju.

Nginx

Hajde da testiramo Nginx na isti način kao što smo testirali Apache, kako biste mogli da uporedite njihove performanse.

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

Vau!

Da li ste to videli?

Nginx je obradio 6593 zahteva u sekundi! Nginx je pobednik.

Iz ovog poređenja samo dva veb servera, možete dobiti jasniju sliku o tome koji server odabrati za vašu veb aplikaciju.

Gore navedeni test je sproveden na CentOS 6.8, 64-bit operativnom sistemu. Možete testirati i druge kombinacije operativnog sistema i veb servera radi dobijanja optimalnih rezultata.

Ne preferirate ApacheBench iz bilo kog razloga? Ne brinite, postoji još mnogo drugih alata za testiranje HTTP opterećenja.

SIEGE

SIEGE je HTTP alat za testiranje opterećenja koji je podržan na UNIX sistemima. Možete uneti više URL adresa u tekstualni fajl za testiranje opterećenja. Siege možete instalirati pomoću yum komande.

# yum install siege

Pokrenimo test sa 500 istovremenih zahteva u trajanju od 5 sekundi.

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

Hajde da analiziramo parametre.

-q – pokretanje u tihom režimu (ne prikazuje detalje zahteva)

-t – testiranje u trajanju od 5 sekundi

-c – 500 istovremenih zahteva

Kao što možete videti, dostupnost je 100%, a vreme odziva je 0.04 sekunde. Parametre testiranja opterećenja možete podesiti prema vašim potrebama.

Ali

Ali je relativno nov alat za testiranje opterećenja koji nudi analizu u realnom vremenu. Podržava više platformi za instalaciju, uključujući i Docker.

Nakon instalacije, pokrenite ali kako biste videli detalje o upotrebi.

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

Kao što vidite, imate opciju da šaljete HTTP zaglavlja, podešavate trajanje testa, ograničenje brzine, vremensko ograničenje i još mnogo toga. Ja sam uradio brzi test na vdzvdz alatima i ovo je rezultat:

Izveštaj je interaktivan i daje detaljne informacije o kašnjenju.

Gobench

Gobench je napisan u Go programskom jeziku i predstavlja jednostavan alat za testiranje opterećenja dizajniran za analizu performansi veb servera. Podržava više od 20.000 istovremenih korisnika, što ApacheBench ne podržava.

Apache JMeter

JMeter je jedan od najpopularnijih open-source alata za merenje performansi veb aplikacija. JMeter je Java aplikacija i možete ga koristiti ne samo za testiranje veb servera, već i za testiranje PHP, Java, ASP.net, SOAP, REST aplikacija itd.

JMeter ima intuitivni grafički interfejs. Najnovija verzija 3.0 zahteva Java 7 ili noviju verziju za pokretanje aplikacije. Ako vam je cilj optimizacija performansi veb aplikacije, svakako isprobajte JMeter.

wrk

wrk je još jedan moderan alat za analizu performansi koji opterećuje vaš veb server i daje detalje o kašnjenju, zahtevima u sekundi, brzini prenosa podataka itd.

Sa wrk možete podesiti test opterećenja sa određenim brojem niti.

Uzmimo primer pokretanja testa u trajanju od 5 minuta sa 500 istovremenih korisnika sa 8 niti.

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

Autocannon

Inspirisan sa wrk, autocannon je napisan u Node.js. Možete ga koristiti programski, preko API-ja ili kao samostalni uslužni program. Sve što vam treba je instaliran Node.js.

Možete kontrolisati broj konekcija, zahteve, trajanje, radnike, vremensko ograničenje, brzinu konekcije i nudi mnoštvo opcija za analizu performansi vaše veb aplikacije.

curl-loader

curl-loader je napisan u C-u i služi za simulaciju opterećenja aplikacija i podržava SSL/TLS. Osim testiranja veb stranica, ovaj open-source alat možete koristiti i za testiranje FTP servera.

Možete kreirati plan testiranja sa kombinacijom HTTP, HTTPS, FTP i FTPS unutar jedne serije konfiguracija.

httperf

httperf je alat visokih performansi koji se fokusira na mikronivo i makronivo analize. Podržava HTTP/1.1 i SSL protokole.

Ako imate očekivan broj istovremenih korisnika i želite da testirate da li vaš veb server može da podnese određeni broj zahteva, možete koristiti sledeću komandu:

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

Gore navedena komanda će testirati sa 100 zahteva u sekundi za 1000 HTTP zahteva.

Tsung

Tsung je multi-protokol alat za testiranje opterećenja koji podržava HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL servere. Podržava HTTP/1.0 i HTTP/1.1 i automatsku obradu kolačića.

Generisanje izveštaja je takođe moguće uz pomoć Tsunga.

Zaključak

Nadam se da će vam gore navedeni alati za analizu performansi pomoći da steknete uvid u performanse vašeg veb servera i da odlučite koji server najbolje odgovara vašem projektu.

Pored toga, ne zaboravite da pratite performanse vaše veb lokacije.