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.
Sadržaj
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.
Š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 opcijeflagovi 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.
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.