{"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\/sl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Zmogljivost omre\u017enih aplikacij Linux. Uvod","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Spletne aplikacije se danes uporabljajo povsod, med vsemi transportnimi protokoli pa HTTP prevladuje. Pri raziskovanju podrobnosti razvoja spletnih aplikacij ve\u010dina zelo malo pozornosti posveti operacijskemu sistemu, kjer se te aplikacije dejansko izvajajo. Lo\u010devanje razvoja (Dev) in delovanja (Ops) je le poslab\u0161alo situacijo. Vendar pa z nara\u0161\u010danjem kulture DevOps razvijalci za\u010dnejo prevzemati odgovornost za zagon svojih aplikacij v oblaku, zato je zanje zelo koristno, da se podrobno seznanijo z ozadjem operacijskega sistema. To je \u0161e posebej koristno, \u010de posku\u0161ate vzpostaviti sistem za tiso\u010de ali deset tiso\u010d so\u010dasnih povezav.<\/p>\n<p>Omejitve v spletnih storitvah so zelo podobne omejitvam v drugih aplikacijah. Ne glede na to, ali gre za ravnote\u017ene obremenitve ali stre\u017enike baz podatkov, imajo vse te aplikacije podobne te\u017eave v visokozmogljivem okolju. Razumevanje teh osnovnih omejitev in na\u010dinov za njihovo premagovanje vam bo omogo\u010dilo oceno zmogljivosti in raz\u0161irljivosti va\u0161ih spletnih aplikacij.<\/p>\n<p>To serijo \u010dlankov pi\u0161em kot odgovor na vpra\u0161anja mladih razvijalcev, ki \u017eelijo postati dobro obve\u0161\u010deni sistemski arhitekti. Nemogo\u010de je jasno razumeti metode optimizacije aplikacij Linux, ne da bi se poglobili v osnove njihovega delovanja na ravni operacijskega sistema. \u010ceprav obstaja veliko vrst aplikacij, v tem ciklu \u017eelim raziskati mre\u017ene aplikacije, ne namiznih, kot so brskalniki ali urejevalniki besedil. Ta material je namenjen razvijalcem in arhitektom, ki \u017eelijo razumeti, kako delujejo programi Linux ali Unix ter kako jih strukturirati za visoko zmogljivost.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux je <i>stre\u017eni<\/i> operacijski sistem, in najpogosteje va\u0161e aplikacije delujejo prav na tej OS. \u010ceprav govorim \"Linux\", lahko ve\u010dino \u010dasa z gotovostjo domnevate, da imam v mislih vse Unix-podobne operacijske sisteme na splo\u0161no. Kljub temu koda, ki jo spremljam, ni bila testirana na drugih sistemih. Zato, \u010de vas zanima FreeBSD ali OpenBSD, se lahko rezultati razlikujejo. Ko poskusim kaj specifi\u010dnega za Linux, to jasno ozna\u010dim.<\/p>\n<p>\u010ceprav lahko pridobljeno znanje uporabite za razvoj aplikacije od osnov, ki bo odli\u010dno optimizirana, je bolje, da tega ne storite. \u010ce napi\u0161ete nov spletni stre\u017enik v C ali C++ za poslovno aplikacijo va\u0161e organizacije, bi lahko to bil va\u0161 zadnji dan na delu. Kljub temu vam znanje strukture teh aplikacij lahko pomaga pri izbiri \u017ee obstoje\u010dih programov. Lahko primerjate sisteme na osnovi procesov s sistemi na osnovi niti, prav tako kot tiste, ki temeljijo na dogodkih. Razumeli boste in cenili, zakaj Nginx deluje bolje kot Apache httpd, zakaj Pythonova aplikacija na osnovi Tornado lahko obravnava ve\u010d uporabnikov v primerjavi s Pythonovo aplikacijo na osnovi Django.<\/p>\n<h1>ZeroHTTPd: u\u010dni pripomo\u010dek<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0je spletni stre\u017enik, ki sem ga napisal od osnov s C kot u\u010dni pripomo\u010dek. Nima zunanjih odvisnosti, vklju\u010dno z dostopom do Redis. Zagonimo lastne Redis postopke. Ve\u010d podrobnosti si oglejte spodaj.<\/p>\n<p>\u010ceprav bi lahko dolgo razpravljali o teoriji, ni ni\u010d bolj\u0161ega, kot pisanje kode, njeno zagon in primerjava vseh arhitektur stre\u017enikov. To je najbolj o\u010diten na\u010din. Zato bomo pisali preprost spletni stre\u017enik ZeroHTTPd, ki bo uporabljal vsak model: temelje\u010d na procesih, threadih in dogodkih. Preverili bomo vsakega od teh stre\u017enikov in pogledali, kako delujejo v primerjavi drug z drugim. ZeroHTTPd je implementiran v eni C datoteki. Stre\u017enik na osnovi dogodkov vklju\u010duje <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, odli\u010dna implementacija hash tabele, ki prihaja v eni glavni datoteki. V drugih primerih ni dodatnih odvisnosti, da ne bi zapletali projekta.<\/p>\n<p>V kodi je veliko komentarjev, da bi pomagali razumeti. Kot preprost spletni stre\u017enik v nekaj vrsticah kode, ZeroHTTPd predstavlja tudi minimalni okvir za spletni razvoj. Ima omejeno funkcionalnost, vendar je sposoben slu\u017eiti stati\u010dne datoteke in zelo preproste \"dinami\u010dne\" strani. Moram re\u010di, da je ZeroHTTPd odli\u010den za u\u010denje, kako ustvarjati visoko performantne Linux aplikacije. Na splo\u0161no, ve\u010dina spletnih storitev \u010daka na zahteve, jih preverja in obravnava. To\u010dno to bo ZeroHTTPd po\u010del. Je u\u010dni pripomo\u010dek, ne pa instrument za produkcijo. Ni mo\u010dan pri obravnavi napak in ima malo najbolj\u0161ih praks varnosti (oh ja, uporabil sem <code>strcpy<\/code>) ali z zapletenimi triki jezika C. A upam, da bo dobro opravil svojo nalogo.<\/p>\n<p><img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Za\u010detna stran ZeroHTTPd. Lahko posreduje razli\u010dne vrste datotek, vklju\u010dno z slikami<\/i><\/p>\n<h1>Aplikacija gostinske knjige<\/h1>\n<p>\nSodobne spletne aplikacije obi\u010dajno niso omejene na stati\u010dne datoteke. Imajo kompleksne interakcije z razli\u010dnimi BDP-ji, predpomnilniki itd. Zato bomo ustvarili preprosto spletno aplikacijo z imenom 'Gostinska knjiga', kjer obiskovalci pustijo zapise pod svojimi imeni. V gostinski knjigi so shranjeni prej\u0161nji zapisi. Na dnu strani je prav tako \u0161tevec obiskovalcev.<\/p>\n<p><img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Spletna aplikacija 'Gostinska knjiga' ZeroHTTPd<\/i><\/p>\n<p>\u0160tevec obiskovalcev in zapisi gostinske knjige se shranjujejo v Redis. Za komunikacijo z Redisom so implementirani lastni postopki, ki ne odvisijo od zunanjih knji\u017enic. Nisem velik obo\u017eevalec razvoja lastne kode, ko so na voljo javna in dobro testirana re\u0161itev. A cilj ZeroHTTPd je raziskati zmogljivost Linuxa in dostop do zunanjih storitev, medtem ko vzdr\u017eevanje HTTP zahtevkov resno vpliva na zmogljivost. Moramo popolnoma nadzorovati komunikacijo z Redisom v vsaki na\u0161i stre\u017eni\u0161ki arhitekturi. V eni arhitekturi uporabljamo blokirajo\u010de klice, v drugih pa postopke temelje\u010de na dogodkih. Uporaba zunanje odjemalske knji\u017enice Redis ne bi dala tak\u0161nega nadzora. Poleg tega na\u0161 mali odjemalec Redis izvaja le nekaj funkcij (pridobivanje, nastavljanje in pove\u010danje klju\u010da; pridobivanje in dodajanje v tabelo). Prav tako je protokol Redis izjemno eleganten in preprost. U\u010diti se ga ni treba posebej. Samo dejstvo, da celotno delo protokol opravlja v pribli\u017eno sto vrsticah kode, ka\u017ee, kako dobro je zasnovan.<\/p>\n<p>Na naslednji sliki so prikazane dejavnosti aplikacije, ko odjemalec (brskalnik) po\u0161lje zahtevo <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mehanizem delovanja aplikacije gostinske knjige<\/i><\/p>\n<p>Ko zaman da treba prikazati stranicu knjige gostiju, dolazi do jednog poziva datote\u010dnom sistemu za u\u010ditavanje \u0161ablona u memoriju i tri mre\u017ena poziva prema Redis-u. Datoteka \u0161ablona sadr\u017ei ve\u0107inu HTML sadr\u017eaja za stranicu na gornjoj slici. Tu su tako\u0111e i posebni placeholderi za dinami\u010dki deo sadr\u017eaja: unose i broj posetilaca. Dobijamo ih iz Redis-a, umetnemo na stranicu i isporu\u010dujemo klijentu potpuno formirani sadr\u017eaj. Tre\u0107i poziv prema Redis-u mo\u017ee se izbe\u0107i, jer Redis vra\u0107a novu vrednost klju\u010da prilikom pove\u0107anja. Me\u0111utim, za na\u0161 server sa asinkronom arhitekturom zasnovanom na doga\u0111ajima, mno\u0161tvo mre\u017enih poziva je dobro isku\u0161enje u obrazovne svrhe. Stoga odbacujemo vra\u0107enu vrednost Redis-a o broju posetilaca i zahtevamo je odvojenim pozivom.<\/p>\n<h1>Serverne arhitekture ZeroHTTPd<\/h1>\n<p>\nGradimo sedam verzija ZeroHTTPd sa istom funkcionalno\u0161\u0107u, ali razli\u010ditim arhitekturama:<\/p>\n<ul>\n<li>Iterativna\n<\/li>\n<li>Fork server (jedan podproces po zahtevu)\n<\/li>\n<li>Pre-fork server (prethodno forkovanje procesa)\n<\/li>\n<li>Server sa izvr\u0161nim nitima (jedna nit po zahtevu)\n<\/li>\n<li>Server sa prethodno kreiranim nitima\n<\/li>\n<li>Arhitektura zasnovana na <code>poll()<\/code>\n<\/li>\n<li>Arhitektura zasnovana na <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nMjerimo performanse svake arhitekture optere\u0107uju\u0107i server HTTP zahtevima. No, prilikom upore\u0111ivanja arhitektura sa visokom paralelizmom, broj zahteva se pove\u0107ava. Testiramo tri puta i ra\u010dunamo prosek.<\/p>\n<h1>Metodologija testiranja<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pode\u0161avanje za optere\u0107uju\u0107e testiranje ZeroHTTPd<\/i> <\/p>\n<p>Va\u017eno je da tokom izvo\u0111enja testova svi komponenti ne rade na jednoj ma\u0161ini. U tom slu\u010daju, operativni sistem nosi dodatne tro\u0161kove planiranja, jer se komponente takmi\u010de za CPU. Merenje tro\u0161kova operativnog sistema sa svake od odabranih servernih arhitektura je jedan od najva\u017enijih ciljeva ove ve\u017ebe. Dodavanje ve\u0107eg broja varijabli postat \u0107e \u0161tetno za proces. Stoga, pode\u0161avanje prikazano na slici iznad najbolje funkcioni\u0161e.<\/p>\n<h3>\u0160ta radi svaki od ovih servera<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: ovde pokre\u0107emo <code>ab<\/code>, Apache Benchmark alat. On generi\u0161e optere\u0107enje potrebno za testiranje na\u0161ih servernih arhitektura.\n<\/li>\n<li>nginx.unixism.net: v\u010dasih \u017eelimo zagnati ve\u010d kot en izvod stre\u017eni\u0161kega programa. Za to stre\u017enik Nginx s primernimi nastavitvami deluje kot uravnote\u017eevalec obremenitev, ki prihaja od <i>ab<\/i> na\u0161e stre\u017eni\u0161ke procese.\n<\/li>\n<li>zerohttpd.unixism.net: tukaj zagnamo na\u0161e stre\u017eni\u0161ke programe na sedmih razli\u010dnih arhitekturah, po enega naenkrat.\n<\/li>\n<li>redis.unixism.net: na tem stre\u017eniku deluje demon Redis, kjer so shranjeni zapisi v knjigi gostov in \u0161tevec obiskovalcev.<\/li>\n<\/ul>\n<p>\nVsi stre\u017eniki delujejo na enem procesorskem jedru. Ideja je oceniti maksimalno zmogljivost posameznih arhitektur. Ker se vsi stre\u017eni\u0161ki programi testirajo na isti opremi, je to osnovna raven za njihovo primerjavo. Moja testna nastavitev je sestavljena iz virtualnih stre\u017enikov, najetih pri Digital Ocean.<\/p>\n<h3>Kaj merimo?<\/h3>\n<p>\nLahko izmerimo razli\u010dne kazalnike. Ocenjujemo zmogljivost vsake arhitekture v tej konfiguraciji, tako da obremenjujemo stre\u017enike z zahtevami na razli\u010dnih ravneh paralelizma: obremenitev nara\u0161\u010da od 20 do 15 000 hkratnih uporabnikov.<\/p>\n<h1>V\u00fdsledky test\u016f<\/h1>\n<p>\nNa naslednjem diagramu je prikazana zmogljivost stre\u017enikov na razli\u010dnih arhitekturah pri razli\u010dnih ravneh paralelizma. Na osi y je \u0161tevilo zahtevkov na sekundo, na osi x pa paralelne povezave.<\/p>\n<p><img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zmogljivost omre\u017enih aplikacij Linux. Uvod\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpodaj je tabela z rezultati.<\/p>\n<p> zahtevkov na sekundo <\/p>\n<p><strong>paralelizem<\/strong><br \/>\n<strong>iterativni<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pred-fork<\/strong><br \/>\n<strong>tudenjski<\/strong><br \/>\n<strong>pred-tudenjski<\/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 \/>\nveliko razpr\u0161enosti<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nveliko razpr\u0161enosti<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nveliko razpr\u0161enosti<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nveliko razpr\u0161enosti<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 in tabele je razvidno, da pri ve\u010d kot 8000 hkratnih zahtevkov ostaneta le dva igralca: pred-fork in epoll. Z nara\u0161\u010danjem obremenitve stre\u017enik na osnovi poll deluje slab\u0161e kot tudenjski. Arhitektura s predhodnim ustvarjanjem niti predstavlja dostojno konkurenco epoll: to pri\u010da o tem, kako dobro jedro Linux na\u010drtuje veliko \u0161tevilo niti.<\/p>\n<h1>Izvorna koda ZeroHTTPd<\/h1>\n<p>\nIzvorna koda ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ovde<\/a><\/noindex>. Za vsako arhitekturo je posebej imenik.<\/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>\nPoleg sedmih imenikov za vse arhitekture, v zgornjem nivoju mape sta \u0161e dva: public in templates. V prvem se nahaja datoteka index.html in slika iz prvega posnetka zaslona. Tja lahko postavite druge datoteke in mape, ZeroHTTPd pa mora brez te\u017eav dostaviti te stati\u010dne datoteke. \u010ce pot v brskalniku ustreza poti v mapi public, ZeroHTTPd i\u0161\u010de v tem imeniku datoteko index.html. Vsebina za knjigo gostov se dinami\u010dno generira. Ima samo glavno stran, njena vsebina pa temelji na datoteki 'templates\/guestbook\/index.html'. V ZeroHTTPd je enostavno dodajati dinami\u010dne strani za \u0161iritev. Ideja je v tem, da lahko uporabniki v tej mapi dodajo predloge in \u0161irijo ZeroHTTPd po potrebi.<\/p>\n<p>Za sestavljanje vseh sedmih stre\u017enikov za\u017eenite <code>make all<\/code> iz zgornjega imenika \u2014 in vsi gradniki se bodo pojavili v tem imeniku. Izvedljive datoteke i\u0161\u010dejo imenike public in templates v tistem imeniku, iz katerega so zagnane.<\/p>\n<h1>Linux API<\/h1>\n<p>\nDa bi razumeli informacije v tem ciklu \u010dlankov, ni nujno, da dobro obvladate Linux API. Kljub temu priporo\u010dam, da preberete ve\u010d o tej temi; na spletu je veliko referen\u010dnih virov. \u010ceprav se bomo dotaknili ve\u010d kategorij Linux API, se bomo osredoto\u010dili predvsem na procese, niti, dogodke in mre\u017eni sklad. Poleg knjig in \u010dlankov o Linux API priporo\u010dam tudi, da preberete menije za sistemske klice in uporabljene knji\u017eni\u010dne funkcije.<\/p>\n<h1>U\u010dinkovitost in raz\u0161irljivost<\/h1>\n<p>\nEna opomba o u\u010dinkovitosti in raz\u0161irljivosti. Teoreti\u010dno med njima ni nobene povezave. Imate lahko spletno storitev, ki deluje zelo dobro, z odzivnim \u010dasom v nekaj milisekundah, a se sploh ne raz\u0161irja. Enako lahko imate slabo delujo\u010do spletno aplikacijo, ki potrebuje nekaj sekund za odgovor, a se raz\u0161irja na desetine za obvladovanje desetih tiso\u010d so\u010dasnih uporabnikov. Kljub temu pa je kombinacija visoke u\u010dinkovitosti in raz\u0161irljivosti zelo mo\u010dna kombinacija. Visoko u\u010dinkovite aplikacije na splo\u0161no var\u010dno uporabljajo vire in tako u\u010dinkovito obravnavajo ve\u010d so\u010dasnih uporabnikov na stre\u017eniku, kar zmanj\u0161uje stro\u0161ke.<\/p>\n<h1>Naloge CPU in I\/O<\/h1>\n<p>\nNa koncu \u017ee obstajata dva mo\u017ena tipa nalog v izra\u010dunih: za I\/O in CPU. Sprejemanje zahtevkov prek interneta (omre\u017eni vhod-izhod), upravljanje datotek (omre\u017eni in diskovni vhod-izhod), komunikacije z bazo podatkov (omre\u017eni in diskovni vhod-izhod) \u2014 vse to so I\/O dejanja. Nekateri zahtevki za bazo podatkov lahko nekoliko obremenijo CPU (sortiranje, izra\u010dun povpre\u010dja milijona rezultatov itd.). Ve\u010dina spletnih aplikacij je omejena glede na najve\u010dji mo\u017eni I\/O, medtem ko se procesor redko uporablja na polno mo\u010d. Ko opazite, da neka naloga vhod-izhod uporablja veliko CPU, je verjetno to znak slabe arhitekture aplikacije. To lahko pomeni, da se CPU viri porabljajo za upravljanje procesov in preklapljanje kontekstov \u2014 kar ni povsem koristno. \u010ce izvajate naloge, kot so obdelava slik, pretvorba avdio datotek ali strojno u\u010denje, potem aplikacija potrebuje mo\u010dne CPU vire. Toda za ve\u010dino aplikacij temu ni tako.<\/p>\n<h1>Podrobneje o stre\u017eni\u0161kih arhitekturah<\/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\/\">Del 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\/\">Del II. Fork stre\u017eniki<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Del III. Pre-fork stre\u017eniki<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Del IV. Stre\u017eniki s tremi izvedbenimi nitmi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Del V. Stre\u017eniki s predhodnim ustvarjanjem niti<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Del VI. Arhitektura, ki temelji 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\/\">Del VII. Arhitektura, ki temelji 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.4 - 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\/sl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Zmogljivost omre\u017enih aplikacij Linux. Uvod | ProHoster","description":"Spletne aplikacije se danes uporabljajo povsod, medtem ko HTTP predstavlja velik dele\u017e vseh transportnih protokolov.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}