Testiranje performansi web servera pomoću alata Apache Bench – I deo

Ukoliko ste imali problema sa učitavanjem sajta usled prevelikog ili nepredvidivog saobraćaja, postoji mogućnost predviđanja i projektovanja resursa.

Uvod

Testiranje performansi veb portala se pokazalo kao jedna od veoma bitnih stavki za uspeh u poslu. Apache Bench je alat kojim lako možemo proveriti aplikacije na WEB-u.

Pored toga što sajt sa lošim performansama predstavlja finansijski gubitak, isti može dovesti i do neželjenih pravnih posledica. Niko ne želi da kupuje, obavlja bankarske transakcije i druge online poslove na nepouzdanim sajtovima, naročito što postoji konkurencija koja uvek može da iskoristi tu slabost u svoju korist. Iz tog razloga lakše je izgubiti, nego pridobiti klijente.

Istraživanja su pokazala da se 75% poseta sajtovima koji se učitavaju duže od 5 sekundi završava tako što korisnik odustaje od posete.

Portali za elektronsku trgovinu su investirali velike količine novca u marketing, a nisu proverili da li infrakstruktura može da podnese velik proj posetilaca u istom trenutku i onda umesto očekivanog profita nastaju još veći problemi. Zato je dobro, pre puštanja sajta na produkciju, proveriti i uvideti realne mogućnosti servera na kojem se sajt nalazi.

U ovom članku uvešćemo testove i videti kakve su performanse servera na kom se nalazi sajt Instituta za Matematiku i Informatiku, dok ćemo se u drugom delu pozabaviti postavljanjem našeg sopstvenog servera i nad njim ćemo vršiti testiranje performansi.

Šta je Apache Bench?

Apache Bench (ab) je alat za testiranje i ocenjivanje Hypertext Transfer Protocol (HTTP) servera. Alat je moguće pokrenuti iz komandne linije i jednostavan je za upotrebu. Najjednostavniji test opterećenja moguće je uraditi u par minuta. Pošto isti ne zahteva preveliko poznavanje testova opterećenja i performansi, predstavlja odličan alat za početnike. Što se tiče upotrebe alata, nije potrebna nikakva kompleksna instalacija, tj. isti se instalira automatski uz Apache Web Server, ili može biti manuelno instaliran kao jedan od Apache dodataka.

Iako nema sve funkcionalnosti kao popularniji alati poput jMeter-a ili Grinder-a, predstavlja odličan alat za početak.

Apache Bench alat je prevashodno namenjen za rad sa Apache web serverima, ali isto tako može se koristiti za testiranje performansi bilo kog drugog servera. Moguće je brzo dobiti informaciju koliko zahteva u sekundi određeni server može da obradi.

Kome je namenjen članak i šta je poželjno unapred znati?

Ovaj članak namenjen je svima koji žele da se upoznaju i steknu praktično znanje o Apache Bench alatu, a naročito je koristan programerima i sistem administratorima.

Poželjno je imati osnovno razumevanje interfejsa komandne linije (CLI), HTTP, tekst editora, web servera… pošto je sve to potrebno za uspešno pokretanje Apache Bench-a za testove. Dodatno, poželjno je osnovno znanje i iz web programiranja i testiranja aplikacija.

Karakteristike Apache Bench-a

  • Softver otvorenog koda.
  • Jednostavno rukovanje preko komandne linije.
  • Ne zavisi od platforme, moguće je korstiti ga i na Linux/Unix sistemima ili Windows serverima podjednako dobro.
  • Moguće je testirati samo web servere – HTTP ili HTTPS
  • Nije proširiv.
  • Apache Bench koristi samo jednu nit (thread) operativnog sistema. Kada se testiraju serveri visokih performansi, jedna instanca Apache Bench-a sama po sebi može biti usko grlo (bottleneck). Zato je potrebno paralelizovati proces uz više Apache Bench instanci.

Napomena

Potrebno je imati u vidu da upotreba Apache Bench alata ima isti uticaj na server kao i denial-of-service (DOS) napad. Zato je potrebno, ukoliko se koristi VPS servis provajder, isti obavestiti i zatražiti dozvolu kako bi se izvršilo testiranje. Takođe, ukoliko se testira sajt nekog drugog vlasnika, postoji realna opasnost da će IP adresa sa koje se vrši testiranje, biti blokirana.

Postavljanje okruženja

Sistemski zahtevi

Apache Bench sam po sebi nije zahtevan, a jedini zahtev koji se može pronaći u dokumentaciji jeste da na mašini bude minimum 128MB RAM-a. Kako su današnji desktop računari i serveri daleko jači od pomenutog minimuma, zahteve u pitanju hardvera ćemo zanemariti.

Instalacija Apache Bench-a

Apache Bench ćemo instalirati na operativnom sistemu Ubuntu 18.04 LTS, procedura je ista i za verziju Ubuntu 16.04. Operativni sistem nalazi se na virtuelnoj mašini koja ima 2GB RAM-a i 2 procesorska jezgra.

Hardverske karakteristike servera
Hardverske karakteristike servera

Što se tiče instalacije, ona je jednostavna pošto Apache Bench ne zavisi od Apache Web Server instalacije. Prvo je potrebno osvežiti bazu paketa, a nakon toga instalirati apache2-utils paket.

$ sudo apt-get update
$ sudo apt-get install apache2-utils

Nakon instalacije, možemo proveriti da li je sve prošlo kako treba sledećom komandom:

$ ab -V
Output
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Pokretanje prvog testa

U uvodnom delu naznačeno je da pomoću Apache Bench-a možemo vrlo brzo pokrenuti jednostavne testove, zato ćemo sada to i uraditi, a nakon toga analizirati rezultat.

Recimo da hoćemo da testiramo kako će se server na kom se nalazi portal Instituta za Matematiku i Informatiku ponašati ukoliko dobije 100 zahteva u kratkom vremenskom intervalu i to svaki put po 10 zahteva istovremeno. Ozbiljnije testove ćemo vršiti na podignutom Nginx serveru, više o tome u drugom delu.

Potrebno je izvršiti sledeću komandu:

$ ab -n 100 -c 10 https://imi.pmf.kg.ac.rs/

Šta smo uradili?

  • ab – Pokretanje Apache Bench alata.
  • -n – Broj zahteva koji će se izvršiti u sesiji testiranja performansi. Podrazumevano izvršava se samo jedan zahtev što nam i ne daje neke korisne informacije.
  • -c – Označava konkurentnost i odnosi se na izvršavanje više zahteva u određenom trenutku. Takođe, podrazumevana vrednost nije nam od prevelike koristi za testiranje.
  • https://imi.pmf.kg.ac.rs/ – Odnosi se na adresu sajta na kom vršimo testiranje.

Na osnovu komande iznad, možemo zaključiti kako izgleda opšti oblik komande za testiranje:

$ ab [options .....]  URL

Gde su opcije flagovi za specifične stvari koje treba odraditi prilikom testa.

Output
node01@node01:~$ ab -n 100 -c 10 https://imi.pmf.kg.ac.rs/
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking imi.pmf.kg.ac.rs (be patient).....done
 
 
Server Software:        Apache/2.4.10
Server Hostname:        imi.pmf.kg.ac.rs
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
TLS Server Name:        imi.pmf.kg.ac.rs
 
Document Path:          /
Document Length:        61869 bytes
 
Concurrency Level:      10
Time taken for tests:   2.683 seconds
Complete requests:      100
Failed requests:        44
   (Connect: 0, Receive: 0, Length: 44, Exceptions: 0)
Total transferred:      6234392 bytes
HTML transferred:       6186992 bytes
Requests per second:    37.27 [#/sec] (mean)
Time per request:       268.339 [ms] (mean)
Time per request:       26.834 [ms] (mean, across all concurrent requests)
Transfer rate:          2268.87 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       53   67   9.7     65      91
Processing:   100  191  49.1    187     486
Waiting:       77  149  45.2    145     448
Total:        165  258  52.5    253     562
 
Percentage of the requests served within a certain time (ms)
  50%    253
  66%    275
  75%    288
  80%    297
  90%    321
  95%    331
  98%    387
  99%    562
 100%    562 (longest request)

Razumevanje izlaznih vrednosti

U nastavku se nalazi spisak svih vrednosti koje smo dobili kao rezultat pokrenutog testa.

  • Server Software – Naziv web servera koji se nalazi u HTTP header-u (zaglavlju) prvog uspešnog odgovora servera.
  • Server Hostname – Predstavlja DNS ili IP adresu iz komandne linije.
  • Server Port – Predstavlja port na koji se Apache Bench konektuje. Ukoliko isti nije naveden, koristi se port 80 za HTTP ili 443 za HTTPS.
  • SSL/TLS Protocol – Parametar protokola, nastao kao rezultat dogovora klijenta i servera. Polje ima vrednost samo ukoliko se koristi SSL.
  • Document Path – Zahtevani URI (Uniform Resource Identifier) koji je prosleđen preko komandne linije. Npr. Mogli smo da testiramo https://imi.pmf.kg.ac.rs/oglasna-tabla, tada bi URI bio /oglasna-tabla
  • Document Length – Predstavlja veličinu, u bajtovima, prvog uspešno učitanog dokumenta (strane). Ukoliko se vrednost menja tokom testa, tumačiće se kao greška.
  • Concurrency Level – Broj konkurentnih klijenata (ekvivalentno broju web pretraživača) za vreme testa.
  • Time Taken for Test – Vreme proteklo od kreiranja prve konekcije do trenutka pristizanja poslednjeg odgovora od strane servera.
  • Complete requests – Broj uspešnih zahteva, tj. broj pristiglih odgovora od servera.
  • Failed requests – Broj zahteva koji su protumačeni kao neuspešni. Ukoliko je broj veći od nule, ispisaće se još jedna linija ispod koja sadrži broj zahteva koji nisu bili uspešni zbog konekcije, čitanja, nevalidne dužine sadržaja ili nekog izuzetka. (Connect, Receive, Length, Exceptions)
  • Total transfered – Ukupan broj bajtova primljenih od servera.
  • HTML transfered – Ukupan broj bajtova primljenih od servera, bez HTTP header-a (zaglavlja).
  • Requests per second – Broj zahteva po sekundi. Rezultat je deljenja ukupnog broja zahteva sa ukupnim vremenom.
  • Time per request – Prosečno vreme zahteva.
  • Transfer rate – Vrednost dobijena pomoću formule ukupno_pročitano / 1024 / vremena_trebalo

Analiza dobijenih rezultata

Nakon objašnjenja iznad, možemo doneti određene zaključke za pokrenuti test:

  • Institut za Matematiku i Informatiku koristi Apache Server Software i to verziju 2.4.10
  • Server sluša na portu 443 zbog HTTPS-a. Da je kojim slučajem bio u pitanju HTTP, rezultat bi bio 80 (podrazumevana vrednost).
  • Ukupno je transferovano 6234392 bajtova za 100 zahteva.
  • Test je ukupno trajao 2,683 sekunde, bilo je 44 neuspešnih zahteva zbog problema sa dužinom. U pitanju je specifičan problem koji se javlja kada se vrati različita dužina stranice u odnosu na prvu koja se vratila. Ovaj se problem može ignorisati, jer se na sajtu nalazi dinamički kreiran sadržaj.
  • Ukupan broj zahteva po sekundi je 37,27.
  • Vreme po zahtevu za 10 konkurentnih korisnika je 268,339 ms, tako da ukoliko taj broj podelimo sa 10 dobijamo 26,834 ms po zahtevu.
  • Protok podataka bio je 2268.87 Kbytes/sec

U prvom testu, posmatrali smo performanse aplikacije koja se nalazi na nekom drugom serveru. U drugom delu, testiraćemo našu aplikaciju koja će se nalaziti na drugoj virtuelnoj mašini kako bi rezultati bili što verodostojniji.

Vizuelizacija rezultata testa

Proširićemo početni test novim flag-om (-g) kako bismo izvukli u fajlu ponašanje servera kako broj zahteva raste. Rezultat testa biće sačuvan u fajlu out.data.

$ ab -n 100 -c 10 -g out.data https://imi.pmf.kg.ac.rs/

Pogledajmo šta se nalazi u out.data fajlu pre nego što vizuelno prikažemo sadržaj istog:

$ less out.data

Sada pored standardnog rezultata testa koji možemo videti u konzoli dobijamo dodatne informacije u vidu fajla out.data koji sadrži sledeće atribute:

  • starttime – Datum i vreme kada je zahtev kreiran.
  • seconds – Isto što i starttime samo u Unix timestamp formatu (Ukoliko bismo pozvali komandu date -d @1551631673 dobili bismo starttime vrednost).
  • ctime – Predstavlja vreme trajanja konekcije.
  • dtime – Predstavlja vreme obrade zahteva.
  • ttime – Predstavlja ukupno vreme (ctime + dtime).
  • wait – Vreme proteklo na čekanje da zahtev bude obrađen.
Output
starttime       seconds ctime   dtime   ttime   wait
Sun Mar 03 17:47:53 2019        1551631673      62      107     169     81
Sun Mar 03 17:47:53 2019        1551631673      55      125     180     97
Sun Mar 03 17:47:54 2019        1551631674      53      130     183     79
Sun Mar 03 17:47:53 2019        1551631673      59      126     184     93
Sun Mar 03 17:47:53 2019        1551631673      49      141     189     111
Sun Mar 03 17:47:53 2019        1551631673      67      127     194     96
Sun Mar 03 17:47:53 2019        1551631673      56      139     195     97
...

Na slici ispod je dodatno objašnjeno šta predstavljaju pomenuti podaci.

Pojašnjenje out.data atributa
Pojašnjenje out.data atributa

Sada kada razumemo kakvi podaci se nalaze u fajlu out.data, možemo instalirati alat gnuplot kako bismo iste grafički prikazali u terminalu. Prva komanda vrši instalaciju alata, dok druga pokreće gnuplot.

$ sudo apt-get install gnuplot
$ gnuplot
Output
    G N U P L O T
    Version 5.2 patchlevel 2    last modified 2017-11-01
 
    Copyright (C) 1986-1993, 1998, 2004, 2007-2017
    Thomas Williams, Colin Kelley and many others
 
    gnuplot home:     http://www.gnuplot.info
    faq, bugs, etc:   type "help FAQ"
    immediate help:   type "help"  (plot window: hit 'h')
 
Terminal type is now 'qt'
gnuplot>

U zavisnosti od toga na kakvom okruženju radite, tj. da li imate grafičko okruženje ili imate pristup samo terminalu, moguće je uraditi vizuelizaciju na dva načina. Prvi jeste štampanjem pravog grafika:

gnuplot> plot "out.data" using 9 w l

Štampamo ttime u milisekundama (deveta kolona u out.data fajlu) sa brojem zahteva.

Ukoliko je u pitanju operativni sistem bez grafičkog okruženja, grafik je moguće odštampati i u terminalu na sledeći način: Prvo moramo reći da želimo da koristimo “primitivnije iscrtavanje“ tj. iscrtavanje u ASCII formatu sledećom komandom:

gnuplot> set terminal dumb

Output
Terminal type set to 'dumb'
Options are 'feed  size 79, 24 aspect 2, 1 mono'

Nakon toga zatražiti iscrtavanje grafika:

gnuplot> plot "out.data" using 9 w l

Rezultat će biti grafik sledećeg oblika:

Output
gnuplot> plot "out.data" using 9 w l
 
                                                                               
  340 +--------------------------------------------------------------------+  
      |      +      +      +      +      +     +      +      +      +   ***|  
  320 |-+                                       "out.data" using 9 *******-|  
      |                                                              ***   |  
  300 |-+                                                            *   +-|  
      |                                                           ***      |  
      |                                                       ****         |  
  280 |-+                                                *****           +-|  
      |                                             *****                  |  
  260 |-+                                        ****                    +-|  
      |                                      *****                         |  
  240 |-+                             ********                           +-|  
      |                    ***********                                     |  
  220 |-+             ******                                             +-|  
      |          *****                                                     |  
      |       ***                                                          |  
  200 |-+ *****                                                          +-|  
      | **                                                                 |  
  180 |*+                                                                +-|  
      |*     +      +      +      +      +     +      +      +      +      |  
  160 +--------------------------------------------------------------------+  
      0      10     20     30     40     50    60     70     80     90    100  
   

Možemo primetiti da se početne i krajnje vrednosti na grafiku razlikuju više nego duplo.

Zaključak

U ovom delu smo se upoznali sa alatom Apache Bench, instalirali alat i pokrenuli prve testove, takođe rezultate smo vizuelizovali. U drugom delu pozabavićemo se testiranjem već postavljenog Nginx servera.

Korisni linkovi

Autor: Bojan Piskulić

Svestrana osoba koja voli tehnologiju, trenutno se pretežno bavim web-om, u slobodno vreme trudim se da naučim što više novih stvari.

Bojan Piskulić

Svestrana osoba koja voli tehnologiju, trenutno se pretežno bavim web-om, u slobodno vreme trudim se da naučim što više novih stvari.