{"id":35106,"date":"2019-10-31T22:02:22","date_gmt":"2019-10-31T19:02:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\/"},"modified":"2019-10-31T22:02:22","modified_gmt":"2019-10-31T19:02:22","slug":"proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Izvedba mre\u017enih aplikacija na Linuxu. Uvod","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Web aplikacije se danas koriste svugdje, a me\u0111u svim transportnim protokolima HTTP zauzima najve\u0107i dio. Kada se prou\u010davaju nijanse razvoja web aplikacija, ve\u0107ina posve\u0107uje vrlo malo pa\u017enje operativnom sustavu na kojem se te aplikacije zapravo pokre\u0107u. Razdvajanje razvoja (Dev) i operacija (Ops) samo je pogor\u0161avalo situaciju. No, s porastom DevOps kulture, programeri po\u010dinju preuzimati odgovornost za pokretanje svojih aplikacija u oblaku, stoga im je od velike koristi detaljno upoznavanje sa backendom operativnog sustava. To je posebno korisno ako poku\u0161avate postaviti sustav za tisu\u0107e ili desetke tisu\u0107a istodobnih veza.<\/p>\n<p>Ograni\u010denja u web uslugama vrlo su sli\u010dna onima u drugim aplikacijama. Bilo da se radi o balansiranim optere\u0107enjima ili poslu\u017eiteljima baza podataka, sva ta rje\u0161enja imaju sli\u010dne probleme u visoko performansnim okru\u017eenjima. Razumijevanje tih temeljnih ograni\u010denja i na\u010dina na koje ih mo\u017eemo prevladati op\u0107enito \u0107e omogu\u0107iti procjenu performansi i skalabilnosti va\u0161ih web aplikacija.<\/p>\n<p>Pi\u0161em ovu seriju \u010dlanaka kao odgovor na pitanja mladih programera koji \u017eele postati dobro informirani sistemski arhitekti. Nemogu\u0107e je jasno razumjeti metode optimizacije aplikacija na Linuxu bez uranjanja u osnove, kako one rade na razini operativnog sustava. Iako postoji mnogo vrsta aplikacija, u ovom ciklusu \u017eelim istra\u017eiti mre\u017ene aplikacije, a ne desktop aplikacije poput preglednika ili tekstualnog urednika. Ovaj materijal namijenjen je programerima i arhitektama koji \u017eele shvatiti kako funkcioniraju programi na Linuxu ili Unixu i kako ih strukturirati za visoke performanse.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux je <i>poslu\u017eiteljski<\/i> operativni sustav, i naj\u010de\u0161\u0107e va\u0161e aplikacije rade upravo na ovom OS-u. Iako govorim \"Linux\", ve\u0107inu vremena mo\u017eete s povjerenjem pretpostaviti da se misli na sve Unix-sli\u010dne operativne sustave op\u0107enito. Ipak, nisam testirao prate\u0107i kod na drugim sustavima. Dakle, ako vas zanima FreeBSD ili OpenBSD, rezultati se mogu razlikovati. Kada isprobavam ne\u0161to \u0161to je specifi\u010dno za Linux, to jasno nagla\u0161avam.<\/p>\n<p>Iako mo\u017eete iskoristiti ste\u010deno znanje za izradu aplikacije od nule koja \u0107e biti odli\u010dno optimizirana, bolje je to ne raditi. Ako napi\u0161ete novi web poslu\u017eitelj u C ili C++ za poslovnu aplikaciju va\u0161e organizacije, mo\u017eda \u0107e to biti va\u0161 posljednji dan na poslu. Ipak, poznavanje strukture tih aplikacija pomo\u0107i \u0107e vam u odabiru ve\u0107 postoje\u0107ih programa. Mo\u0107i \u0107ete uspore\u0111ivati sustave temeljem procesa, sustavima temeljenim na nitima, kao i temeljenim na doga\u0111ajima. Razumjet \u0107ete i cijeniti za\u0161to Nginx radi bolje od Apache httpd-a, za\u0161to aplikacija Python temeljena na Tornadu mo\u017ee opslu\u017eiti vi\u0161e korisnika u usporedbi s aplikacijom Python temeljene na Djangou.<\/p>\n<h1>ZeroHTTPd: alat za u\u010denje<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 web poslu\u017eitelj koji sam napisao od nule u C-u kao alat za u\u010denje. Nemamo vanjskih ovisnosti, uklju\u010duju\u0107i pristup Redis-u. Pokre\u0107emo vlastite Redis procedure. Vi\u0161e informacija mo\u017eete prona\u0107i u nastavku.<\/p>\n<p>Iako bismo mogli dugo raspravljati o teoriji, nema ni\u010dega boljeg od pisanja koda, pokretanja i usporedbe svih arhitektura poslu\u017eitelja. Ovo je najjasnija metoda. Zato \u0107emo napisati jednostavni web poslu\u017eitelj ZeroHTTPd, koriste\u0107i svaki model: temeljen na procesima, nitima i doga\u0111ajima. Provjerit \u0107emo svaki od ovih poslu\u017eitelja i vidjeti kako rade u usporedbi jedni s drugima. ZeroHTTPd je implementiran u jednoj C datoteci. U sustav poslu\u017eitelja temeljenog na doga\u0111ajima uklju\u010dena je <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, izvrsna implementacija hash tablice koja dolazi u jednom zaglavlju. U ostalim slu\u010dajevima nema ovisnosti kako bi se izbjeglo kompliciranje projekta.<\/p>\n<p>Kod sadr\u017ei mnogo komentara kako bi pomogao razumijevanju. Kao jednostavan web poslu\u017eitelj u nekoliko redaka koda, ZeroHTTPd tako\u0111er predstavlja minimalni okvir za web razvoj. Ima ograni\u010dene funkcionalnosti, ali mo\u017ee isporu\u010divati stati\u010dne datoteke i vrlo jednostavne \"dinami\u010dke\" stranice. Moram re\u0107i da je ZeroHTTPd dobar alat za u\u010denje kako stvarati visoko performatne Linux aplikacije. Uglavnom, ve\u0107ina web usluga \u010deka na zahtjeve, provjerava ih i obra\u0111uje. To \u0107e raditi ZeroHTTPd. To je alat za u\u010denje, a ne za produkciju. Nije jak u obradi pogre\u0161aka i vjerojatno se ne mo\u017ee pohvaliti najboljim praksama sigurnosti (oh da, koristio sam <code>strcpy<\/code>) ili neobi\u010dnim trikovima jezika C. Ali se nadam da \u0107e se dobro sna\u0107i u svom zadatku.<\/p>\n<p><img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Po\u010detna stranica ZeroHTTPd. Mo\u017ee izdavati razli\u010dite tipove datoteka, uklju\u010duju\u0107i slike.<\/i><\/p>\n<h1>Aplikacija za knjigu gostiju.<\/h1>\n<p>\nModerne web aplikacije obi\u010dno nisu ograni\u010dene na stati\u010dke datoteke. Imaju slo\u017eene interakcije s raznim bazama podataka, ke\u0161ovima itd. Stoga \u0107emo stvoriti jednostavnu web aplikaciju pod nazivom \"Knjiga gostiju\", gdje posjetitelji ostavljaju zapise pod svojim imenima. U knjizi gostiju se \u010duvaju prethodno ostavljeni zapisi. Tako\u0111er, na dnu stranice postoji broj\u010danik posjetitelja.<\/p>\n<p><img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Web aplikacija \"Knjiga gostiju\" ZeroHTTPd.<\/i><\/p>\n<p>Broj\u010danik posjetitelja i zapisi knjige gostiju \u010duvaju se u Redis-u. Za komunikaciju s Redis-om implementirane su vlastite procedure, koje ne ovise o vanjskoj biblioteci. Nisam veliki obo\u017eavatelj kori\u0161tenja doma\u0107eg koda kada postoje javno dostupna i dobro testirana rje\u0161enja. Ali cilj ZeroHTTPd-a je istra\u017eiti performanse Linux-a i pristup vanjskim uslugama, dok odr\u017eavanje HTTP zahtjeva ozbiljno utje\u010de na performanse. Moramo potpuno kontrolirati komunikaciju s Redis-om u svakoj od na\u0161ih serverskih arhitektura. U jednoj arhitekturi koristimo blokiraju\u0107e pozive, a u drugima procedure temeljene na doga\u0111ajima. Kori\u0161tenje vanjske klijentske biblioteke Redis ne bi omogu\u0107ilo takvu kontrolu. Osim toga, na\u0161 mali Redis klijent izvodi samo nekoliko funkcija (dobivanje, postavljanje i pove\u0107anje klju\u010da; dobivanje i dodavanje u niz). Tako\u0111er, Redis protokol je iznimno elegantan i jednostavan. Njega \u010dak ne treba posebno u\u010diti. Samo to \u0161to cijeli posao protokol obavlja s otprilike stotinjak redaka koda govori koliko je dobro osmi\u0161ljen.<\/p>\n<p>Na sljede\u0107em dijagramu prikazano je pona\u0161anje aplikacije kada klijent (preglednik) \u0161alje zahtjev. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mehanizam rada aplikacije knjige gostiju.<\/i><\/p>\n<p>Kada treba prikazati stranicu gostuju\u0107e knjige, izvr\u0161ava se jedan poziv prema datote\u010dnom sustavu za u\u010ditavanje predlo\u0161ka u memoriju i tri mre\u017ena poziva prema Redis-u. Datoteka predlo\u0161ka sadr\u017ei ve\u0107inu HTML sadr\u017eaja za stranicu na gornjem ekranu. Tu su i posebne oznake za dinami\u010dki dio sadr\u017eaja: unose i broja\u010d posjetitelja. Dobivamo ih iz Redis-a, umetnemo na stranicu i isporu\u010dimo klijentu potpuno oblikovani sadr\u017eaj. Tre\u0107i poziv Redis-u mo\u017eemo izbje\u0107i, jer Redis vra\u0107a novu vrijednost klju\u010da prilikom pove\u0107anja. Me\u0111utim, za na\u0161 poslu\u017eitelj s asinkronom arhitekturom temeljenom na doga\u0111ajima, mnogo mre\u017enih poziva je dobar test u obrazovne svrhe. Tako odbacujemo vra\u0107enu vrijednost Redis-a o broju posjetitelja i tra\u017eimo je zasebnim pozivom.<\/p>\n<h1>Poslu\u017eiteljske arhitekture ZeroHTTPd<\/h1>\n<p>\nGradimo sedam verzija ZeroHTTPd s istom funkcionalno\u0161\u0107u, ali razli\u010ditim arhitekturama:<\/p>\n<ul>\n<li>Iterativna\n<\/li>\n<li>Fork poslu\u017eitelj (jedan podproces po zahtjevu)\n<\/li>\n<li>Pre-fork poslu\u017eitelj (prethodno forkiranje procesa)\n<\/li>\n<li>Poslu\u017eitelj s izvo\u0111enjem niti (jedna nit po zahtjevu)\n<\/li>\n<li>Poslu\u017eitelj s prethodnim stvaranjem niti\n<\/li>\n<li>Arhitektura temeljena na <code>poll()<\/code>\n<\/li>\n<li>Arhitektura temeljena na <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nMjerimo performanse svake arhitekture optere\u0107uju\u0107i poslu\u017eitelj HTTP zahtjevima. Me\u0111utim, prilikom usporedbe arhitektura s visokim stupnjem paralelizma, broj zahtjeva se pove\u0107ava. Testiramo tri puta i ra\u010dunamo prosjek.<\/p>\n<h1>Metodologija testiranja<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Postavka za optere\u0107uju\u0107e testiranje ZeroHTTPd<\/i> <\/p>\n<p>Va\u017eno je da prilikom izvo\u0111enja testova svi sastavni dijelovi ne rade na jednoj ma\u0161ini. U tom slu\u010daju, operativni sustav nosi dodatne tro\u0161kove planiranja jer se dijelovi natje\u010du za CPU. Mjerenje tro\u0161kova operativnog sustava s svakom od odabranih poslu\u017eiteljskih arhitektura jedan je od najva\u017enijih ciljeva ove vje\u017ebe. Dodavanje ve\u0107eg broja varijabli bit \u0107e pogubno za proces. Stoga konfiguracija na gornjoj slici najbolje funkcionira.<\/p>\n<h3>\u0160to \u010dini svaki od ovih poslu\u017eitelja<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: ovdje pokre\u0107emo <code>ab<\/code>, Apache Benchmark alat. Generira optere\u0107enje potrebno za testiranje na\u0161ih poslu\u017eiteljskih arhitektura.\n<\/li>\n<li>nginx.unixism.net: ponekad \u017eelimo pokrenuti vi\u0161e od jednog primjerka poslu\u017eiteljske aplikacije. Za to Nginx poslu\u017eitelj s odgovaraju\u0107im postavkama radi kao balansirnik optere\u0107enja koji dolazi od <i>ab<\/i> na\u0161e poslu\u017eiteljske procese.\n<\/li>\n<li>zerohttpd.unixism.net: ovdje pokre\u0107emo na\u0161e poslu\u017eiteljske programe na sedam razli\u010ditih arhitektura, jedan po jedan.\n<\/li>\n<li>redis.unixism.net: na ovom poslu\u017eitelju radi daemon Redis, gdje se pohranjuju zapisi u knjigu gostiju i broj posjetitelja.<\/li>\n<\/ul>\n<p>\nSvi poslu\u017eitelji rade na jednom procesorskom jezgru. Ideja je procijeniti maksimalnu izvedbu svake od arhitektura. Budu\u0107i da se svi poslu\u017eiteljski programi testiraju na jednoj opremi, to je osnovna razina za njihovo uspore\u0111ivanje. Moja testna postavka sastoji se od virtualnih poslu\u017eitelja, iznajmljenih od Digital Oceana.<\/p>\n<h3>\u0160to mjerimo?<\/h3>\n<p>\nMogu se izmjeriti razli\u010diti pokazatelji. Procjenjujemo izvedbu svake arhitekture u ovoj konfiguraciji, optere\u0107uju\u0107i poslu\u017eitelje upitima na razli\u010ditim razinama paralelizma: optere\u0107enje raste od 20 do 15,000 istodobnih korisnika.<\/p>\n<h1>Rezultati testova<\/h1>\n<p>\nNa sljede\u0107em dijAGRAMU prikazana je izvedba poslu\u017eitelja na razli\u010ditim arhitekturama pri razli\u010ditim razinama paralelizma. Na y-osi \u2014 broj upita po sekundi, na x-osi \u2014 paralelne veze.<\/p>\n<p><img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Izvedba mre\u017enih aplikacija na Linuxu. Uvod\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIspod je tablica s rezultatima.<\/p>\n<p> upita po sekundi <\/p>\n<p><strong>paralelizam<\/strong><br \/>\n<strong>iterativno<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>treding<\/strong><br \/>\n<strong>pre-threading<\/strong><br \/>\n<strong>poll<\/strong><br \/>\n<strong>epoll<\/strong><\/p>\n<p>20<br \/>\n7<br \/>\n112<br \/>\n2100<br \/>\n1800<br \/>\n2250<br \/>\n1900<br \/>\n2050<\/p>\n<p>50<br \/>\n7<br \/>\n190<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2000<br \/>\n2000<\/p>\n<p>100<br \/>\n7<br \/>\n245<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2150<br \/>\n2100<\/p>\n<p>200<br \/>\n7<br \/>\n330<br \/>\n2300<br \/>\n1750<br \/>\n2300<br \/>\n2200<br \/>\n2100<\/p>\n<p>300<br \/>\n\u2013<br \/>\n380<br \/>\n2200<br \/>\n1800<br \/>\n2400<br \/>\n2250<br \/>\n2150<\/p>\n<p>400<br \/>\n\u2013<br \/>\n410<br \/>\n2200<br \/>\n1750<br \/>\n2600<br \/>\n2000<br \/>\n2000<\/p>\n<p>500<br \/>\n\u2013<br \/>\n440<br \/>\n2300<br \/>\n1850<br \/>\n2700<br \/>\n1900<br \/>\n2212<\/p>\n<p>600<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1800<br \/>\n2500<br \/>\n1700<br \/>\n2519<\/p>\n<p>700<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2490<br \/>\n1550<br \/>\n2607<\/p>\n<p>800<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2540<br \/>\n1400<br \/>\n2553<\/p>\n<p>900<br \/>\n\u2013<br \/>\n460<br \/>\n2300<br \/>\n1600<br \/>\n2472<br \/>\n1200<br \/>\n2567<\/p>\n<p>1000<br \/>\n\u2013<br \/>\n475<br \/>\n2300<br \/>\n1700<br \/>\n2485<br \/>\n1150<br \/>\n2439<\/p>\n<p>1500<br \/>\n\u2013<br \/>\n490<br \/>\n2400<br \/>\n1550<br \/>\n2620<br \/>\n900<br \/>\n2479<\/p>\n<p>2000<br \/>\n\u2013<br \/>\n350<br \/>\n2400<br \/>\n1400<br \/>\n2396<br \/>\n550<br \/>\n2200<\/p>\n<p>2500<br \/>\n\u2013<br \/>\n280<br \/>\n2100<br \/>\n1300<br \/>\n2453<br \/>\n490<br \/>\n2262<\/p>\n<p>3000<br \/>\n\u2013<br \/>\n280<br \/>\n1900<br \/>\n1250<br \/>\n2502<br \/>\nveliki raspon<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nveliki raspon<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nveliki raspon<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nveliki raspon<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2200<\/p>\n<p>11\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2122<\/p>\n<p>12\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n970<br \/>\n\u2013<br \/>\n1958<\/p>\n<p>13\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n730<br \/>\n\u2013<br \/>\n1897<\/p>\n<p>14\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n590<br \/>\n\u2013<br \/>\n1466<\/p>\n<p>15\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n532<br \/>\n\u2013<br \/>\n1281<\/p>\n<p>\nIz grafikona i tablice vidljivo je da iznad 8000 istodobnih upita ostaju samo dva igra\u010da: pre-fork i epoll. Kako optere\u0107enje raste, poslu\u017eitelj temeljen na poll radi lo\u0161ije od threaded. Arhitektura s prethodnim stvaranjem niti predstavlja dostojnu konkurenciju epoll-u: to je svjedo\u010danstvo koliko dobro kernal Linuxa upravlja velikim brojem niti.<\/p>\n<h1>Izvorni kod ZeroHTTPd<\/h1>\n<p>\nIzvorni kod ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ovdje<\/a><\/noindex>. Za svaku arhitekturu zaseban direktorij.<\/p>\n<pre>ZeroHTTPd\n\u2502\n\u251c\u2500\u2500 01_iterative\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 02_forking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 03_preforking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 04_threading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 05_prethreading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 06_poll\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 07_epoll\n\u2502    \u2514\u2500\u2500 main.c\n\u251c\u2500\u2500 Makefile\n\u251c\u2500\u2500 public\n\u2502   \u251c\u2500\u2500 index.html\n\u2502   \u2514\u2500\u2500 tux.png\n\u2514\u2500\u2500 templates\n    \u2514\u2500\u2500 guestbook\n        \u2514\u2500\u2500 index.html<\/pre>\n<p>\nOsim sedam direktorija za sve arhitekture, u gornjem katalogu postoje jo\u0161 dva: public i templates. U prvom se nalazi datoteka index.html i slika s prvog screenshot-a. Tamo mo\u017eete staviti druge datoteke i mape, a ZeroHTTPd treba bez problema isporu\u010diti te stati\u010dke datoteke. Ako putanja u pregledniku odgovara putu u mapi public, ZeroHTTPd tra\u017ei datoteku index.html u tom katalogu. Sadr\u017eaj za gostinsku knjigu generira se dinami\u010dki. Ima samo glavnu stranicu, a njen sadr\u017eaj temelji se na datoteci 'templates\/guestbook\/index.html'. U ZeroHTTPd lako se dodaju dinami\u010dke stranice za pro\u0161irenje. Ideja je da korisnici mogu dodavati u ovaj katalog predlo\u0161ke i pro\u0161iriti ZeroHTTPd prema potrebi.<\/p>\n<p>Za izgradnju svih sedam poslu\u017eitelja pokrenite <code>make all<\/code> iz glavnog direktorija \u2014 i sve gradnje \u0107e se pojaviti u ovom direktoriju. Izvr\u0161ne datoteke tra\u017ee mape public i templates u onom direktoriju iz kojeg su pokrenute.<\/p>\n<h1>Linux API<\/h1>\n<p>\nDa biste razumjeli informacije u ovom ciklusu \u010dlanaka, nije potrebno dobro poznavati Linux API. Me\u0111utim, preporu\u010dujem da pro\u010ditate vi\u0161e o ovoj temi, na mre\u017ei ima mnogo referentnih izvora. Iako \u0107emo se dotaknuti nekoliko kategorija Linux API-ja, na\u0161a \u0107e se pa\u017enja uglavnom usredoto\u010diti na procese, niti, doga\u0111aje i mre\u017eni stog. Osim knjiga i \u010dlanaka o Linux API-ju, tako\u0111er preporu\u010dujem da pro\u010ditate mann priru\u010dnike za sistemske pozive i kori\u0161tene bibliote\u010dke funkcije.<\/p>\n<h1>Performanse i skalabilnost<\/h1>\n<p>\nJedna napomena o performansama i skalabilnosti. Teoretski, izme\u0111u njih nema nikakve povezanosti. Mo\u017eete imati web uslugu koja radi vrlo dobro, s vremenom odgovora od nekoliko milisekundi, ali se uop\u0107e ne mo\u017ee skalirati. Ba\u0161 kao \u0161to mo\u017ee postojati lo\u0161e izvedena web aplikacija koja tra\u017ei nekoliko sekundi za odgovor, ali se mo\u017ee skalirati za desetine da bi obradila desetke tisu\u0107a istovremenih korisnika. Ipak, kombinacija visoke izvedbe i skalabilnosti je vrlo sna\u017ena kombinacija. Visoko performansni programi u cjelini ekonomi\u010dno koriste resurse i tako efikasno opslu\u017euju vi\u0161e istovremenih korisnika na poslu\u017eitelju, smanjuju\u0107i tro\u0161kove.<\/p>\n<h1>Zadaci CPU i I\/O<\/h1>\n<p>\nNa kraju, u ra\u010dunanju uvijek postoje dva mogu\u0107a tipa zadataka: za I\/O i CPU. Primanje zahtjeva putem interneta (mre\u017eni ulaz-izlaz), upravljanje datotekama (mre\u017eni i diskovni ulaz-izlaz), komunikacija s bazom podataka (mre\u017eni i diskovni ulaz-izlaz) \u2014 sve su to I\/O radnje. Neki zahtjevi za BDP-om mogu malo opteretiti CPU (sortiranje, izra\u010dunavanje prosjeka milijun rezultata itd.). Ve\u0107ina web aplikacija ograni\u010dena je na maksimalnu mogu\u0107u I\/O, dok se procesor rijetko koristi punom snagom. Kada primijetite da se za odre\u0111eni zadatak ulaz-izlaz koristi mnogo CPU-a, vjerojatno je to znak lo\u0161e arhitekture aplikacije. To mo\u017ee zna\u010diti da se resursi CPU-a tro\u0161e na upravljanje procesima i prebacivanje konteksta \u2014 i to nije posve korisno. Ako radite ne\u0161to poput obrade slika, konverzije audio datoteka ili strojnog u\u010denja, tada aplikacija zahtijeva jake CPU resurse. No za ve\u0107inu aplikacija to nije slu\u010daj.<\/p>\n<h1>Detaljnije o servernim arhitekturama<\/h1>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-i-iterative-servers\/\">Dio I. Iterativna arhitektura<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Dio II. Fork-serveri<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Dio III. Pre-fork serveri<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Dio IV. Serveri s izvr\u0161nim nitima<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Dio V. Serveri s unaprijed stvor\u0435\u043d\u0438\u043c nitima<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Dio VI. Arhitektura temeljena na poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Dio VII. Arhitektura temeljena na epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/455212\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP. \u0418\u0437\u0443\u0447\u0430\u044f \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0443\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0433\u0434\u0435 \u044d\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (Dev) \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 (Ops) \u043b\u0438\u0448\u044c \u0443\u0445\u0443\u0434\u0448\u0430\u043b\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041d\u043e \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b DevOps \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043d\u0435\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35106","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Performanse mre\u017enih aplikacija u Linuxu. Uvod | ProHoster","description":"Web aplikacije se danas koriste posvuda, a me\u0111u svim transportnim protokolima HTTP zauzima veliki dio.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:02:22+00:00","article:modified_time":"2019-10-31T19:02:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35106","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 21:51:33","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:09:55","updated":"2026-01-21 21:51:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}