{"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\/no\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Ytelsen til nettapplikasjoner i Linux. Introduksjon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Webapplikasjoner brukes n\u00e5 overalt, og blant alle transportprotokoller utgj\u00f8r HTTP en stor del. N\u00e5r man utforsker detaljene ved utvikling av webapplikasjoner, legger de fleste sv\u00e6rt lite vekt p\u00e5 operativsystemet der disse applikasjonene faktisk kj\u00f8rer. Delingen av utvikling (Dev) og drift (Ops) har bare forverret situasjonen. Men med spredningen av DevOps-kulturen begynner utviklerne \u00e5 ta ansvar for \u00e5 kj\u00f8re sine applikasjoner i skyen, s\u00e5 det er sv\u00e6rt nyttig for dem \u00e5 bli godt kjent med backend-operativsystemet. Dette er spesielt nyttig hvis du pr\u00f8ver \u00e5 distribuere et system for tusenvis eller titusenvis av samtidige tilkoblinger.<\/p>\n<p>Begrensninger i webtjenester ligner veldig p\u00e5 begrensninger i andre applikasjoner. Enten det er lastbalanserere eller databaser, har alle disse applikasjonene lignende utfordringer i h\u00f8yytelsesmilj\u00f8et. \u00c5 forst\u00e5 disse grunnleggende begrensningene og m\u00e5tene \u00e5 omg\u00e5 dem p\u00e5, vil generelt gj\u00f8re det lettere \u00e5 evaluere ytelsen og skalerbarheten til webapplikasjonene dine.<\/p>\n<p>Jeg skriver denne serien med artikler som svar p\u00e5 sp\u00f8rsm\u00e5l fra unge utviklere som \u00f8nsker \u00e5 bli godt informerte systemarkitekter. Det er umulig \u00e5 forst\u00e5 metodene for optimalisering av Linux-applikasjoner klart uten \u00e5 dykke ned i grunnleggende prinsipper for hvordan de fungerer p\u00e5 operativsystemniv\u00e5. Selv om det finnes mange typer applikasjoner, \u00f8nsker jeg \u00e5 utforske nettverksapplikasjoner i denne syklusen, ikke skrivebordsapplikasjoner som nettlesere eller tekstredigerere. Dette materialet er rettet mot utviklere og arkitekter som \u00f8nsker \u00e5 forst\u00e5 hvordan programmer p\u00e5 Linux eller Unix fungerer og hvordan de kan struktureres for h\u00f8y ytelse.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux er <i>et server<\/i> operativsystem, og oftest kj\u00f8rer applikasjonene dine p\u00e5 dette OS-et. Selv om jeg sier \u00abLinux\u00bb, kan du stort sett med trygghet anta at jeg refererer til alle Unix-lignende operativsystemer generelt. Likevel har jeg ikke testet den medf\u00f8lgende koden p\u00e5 andre systemer. S\u00e5 hvis du er interessert i FreeBSD eller OpenBSD, kan resultatet variere. N\u00e5r jeg pr\u00f8ver noe spesifikt for Linux, vil jeg p\u00e5peke dette.<\/p>\n<p>Selv om du kan bruke den tilegnede kunnskapen til \u00e5 lage en applikasjon fra bunnen av, og den vil v\u00e6re str\u00e5lende optimalisert, er det best \u00e5 ikke gj\u00f8re det. Hvis du skriver en ny webserver i C eller C++ for forretningsapplikasjonen til organisasjonen din, kan det v\u00e6re din siste dag p\u00e5 jobben. Men kunnskap om strukturen til disse applikasjonene vil hjelpe deg \u00e5 velge eksisterende programmer. Du vil kunne sammenligne systemer basert p\u00e5 prosesser med systemer basert p\u00e5 tr\u00e5der, samt basert p\u00e5 hendelser. Du vil forst\u00e5 og vurdere hvorfor Nginx fungerer bedre enn Apache httpd, samt hvorfor en Python-applikasjon basert p\u00e5 Tornado kan betjene flere brukere sammenlignet med en Python-applikasjon basert p\u00e5 Django.<\/p>\n<h1>ZeroHTTPd: l\u00e6ringsverkt\u00f8y<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 en webserver som jeg skrev fra bunnen av i C som et l\u00e6ringsverkt\u00f8y. Den har ingen eksterne avhengigheter, inkludert tilgang til Redis. Vi kj\u00f8rer v\u00e5re egne Redis-prosedyrer. Se mer nedenfor.<\/p>\n<p>Selv om vi kunne diskutere teorien i lang tid, er det ingenting bedre enn \u00e5 skrive kode, kj\u00f8re den og sammenligne de ulike serverarkitekturene. Dette er den mest illustrative metoden. Derfor skal vi skrive en enkel webserver, ZeroHTTPd, og bruke hver modell: basert p\u00e5 prosesser, tr\u00e5der og hendelser. Vi vil teste hver av disse serverne og se hvordan de fungerer sammenlignet med hverandre. ZeroHTTPd implementeres i \u00e9n C-fil. Serveren basert p\u00e5 hendelser inkluderer <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, en utmerket implementering av en hashtabell som leveres i \u00e9n header-fil. Ellers er det ingen avhengigheter for \u00e5 unng\u00e5 \u00e5 komplisere prosjektet.<\/p>\n<p>Koden har mange kommentarer for \u00e5 hjelpe med forst\u00e5elsen. Som en enkel webserver med noen f\u00e5 linjer kode fungerer ZeroHTTPd ogs\u00e5 som et minimalt rammeverk for webutvikling. Den har begrenset funksjonalitet, men kan levere statiske filer og veldig enkle \u00abdynamiske\u00bb sider. Jeg m\u00e5 si at ZeroHTTPd er godt egnet for \u00e5 l\u00e6re hvordan man lager h\u00f8yytelses Linux-applikasjoner. I bunn og grunn venter de fleste webtjenester p\u00e5 foresp\u00f8rslene, sjekker dem og behandler dem. Det er nettopp det ZeroHTTPd vil gj\u00f8re. Det er et l\u00e6ringsverkt\u00f8y, ikke for produksjon. Den er ikke sterk p\u00e5 feilh\u00e5ndtering og kan knapt skryte av beste sikkerhetspraksis (\u00e5 ja, jeg brukte <code>strcpy<\/code>) eller med sm\u00e5spr\u00e5kelige triks av C-spr\u00e5ket. Men jeg h\u00e5per det vil gj\u00f8re oppgaven sin godt.<\/p>\n<p><img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Forside for ZeroHTTPd. Den kan levere forskjellige filtyper, inkludert bilder.<\/i><\/p>\n<h1>Gjestebok-applikasjonen<\/h1>\n<p>\nModerne webapplikasjoner er vanligvis ikke begrenset til statiske filer. De har kompliserte interaksjoner med forskjellige databaser, cacher, etc. Derfor vil vi lage en enkel webapplikasjon kalt \u00abGjestebok\u00bb, hvor bes\u00f8kende kan legge igjen meldinger med navnet sitt. I gjesteboken lagres tidligere meldinger. Det finnes ogs\u00e5 en bes\u00f8ksteller nederst p\u00e5 siden.<\/p>\n<p><img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Webapplikasjonen \u00abGjestebok\u00bb ZeroHTTPd<\/i><\/p>\n<p>Bes\u00f8kstelleren og meldinger fra gjesteboken lagres i Redis. For kommunikasjon med Redis er det implementert egne prosedyrer som ikke er avhengige av eksterne biblioteker. Jeg er ikke en stor fan av \u00e5 utvikle egen kode n\u00e5r det finnes offentlige og godt testede l\u00f8sninger. Men m\u00e5let med ZeroHTTPd er \u00e5 utforske ytelsen til Linux og tilgangen til eksterne tjenester, mens h\u00e5ndtering av HTTP-foresp\u00f8rselene alvorlig p\u00e5virker ytelsen. Vi m\u00e5 ha full kontroll over kommunikasjonen med Redis i hver av v\u00e5re serverarkitekturer. I en arkitektur bruker vi blokkerende kall, i andre - hendelsesbaserte prosedyrer. Bruken av et eksternt klientbibliotek for Redis vil ikke gi en slik kontroll. I tillegg utf\u00f8rer v\u00e5r lille Redis-klient bare et par funksjoner (hente, sette og inkrementere en n\u00f8kkel; hente og legge til i en array). Dessuten er protokollen til Redis eksepsjonelt elegant og enkel. Den trenger ikke spesiell oppl\u00e6ring. Det faktum at hele arbeidet protokollen gj\u00f8r, kan utf\u00f8res p\u00e5 omtrent hundre linjer med kode, sier noe om hvor godt det er gjennomtenkt.<\/p>\n<p>I det f\u00f8lgende bildet vises aktiviteter i applikasjonen n\u00e5r klienten (nettleseren) sender en foresp\u00f8rsel. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mekanismen for drift av gjestebok-applikasjonen<\/i><\/p>\n<p>N\u00e5r en side for gjesteboken skal genereres, skjer det ett kall til filsystemet for \u00e5 lese malen inn i minnet, og tre nettverkskall til Redis. Malfilen inneholder mesteparten av HTML-innholdet for siden p\u00e5 skjermbildet over. Det finnes ogs\u00e5 spesielle plassholdere for den dynamiske delen av innholdet: innlegg og bes\u00f8kstelleren. Vi henter dem fra Redis, setter dem inn p\u00e5 siden og leverer kunden det fullstendig formede innholdet. Det tredje kallet til Redis kan unng\u00e5s, siden Redis returnerer en ny verdi for n\u00f8kkelen n\u00e5r den \u00f8kes. Imidlertid, for v\u00e5r server med en asynkron arkitektur basert p\u00e5 hendelser, er mange nettverkskall en god trening i l\u00e6rings\u00f8yemed. Dermed slipper vi den returnerte verdien fra Redis om antall bes\u00f8kende og ber om den med et eget kall.<\/p>\n<h1>Serverarkitekturer ZeroHTTPd<\/h1>\n<p>\nVi bygger syv versjoner av ZeroHTTPd med identisk funksjonalitet, men forskjellige arkitekturer:<\/p>\n<ul>\n<li>Iterativ\n<\/li>\n<li>Fork-server (ett dataprogramprosess per foresp\u00f8rsel)\n<\/li>\n<li>Pre-fork server (forh\u00e5ndsforgrening av prosesser)\n<\/li>\n<li>Server med tr\u00e5der (en tr\u00e5d per foresp\u00f8rsel)\n<\/li>\n<li>Server med forh\u00e5ndsskaping av tr\u00e5der\n<\/li>\n<li>Arkitektur basert p\u00e5 <code>poll()<\/code>\n<\/li>\n<li>Arkitektur basert p\u00e5 <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nVi m\u00e5ler ytelsen til hver arkitektur ved \u00e5 belaste serveren med HTTP-foresp\u00f8rsel. Men n\u00e5r man sammenligner arkitekturer med h\u00f8y grad av parallellisme, \u00f8ker antallet foresp\u00f8rsel. Vi tester tre ganger og regner ut gjennomsnittet.<\/p>\n<h1>Testmetodologi<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Oppsett for belastningstest av ZeroHTTPd<\/i> <\/p>\n<p>Det er viktig at ikke alle komponenter kj\u00f8rer p\u00e5 \u00e9n maskin n\u00e5r testene utf\u00f8res. I s\u00e5 fall p\u00e5f\u00f8rer operativsystemet ekstra kostnader for planlegging, ettersom komponentene konkurrerer om CPU-en. \u00c5 m\u00e5le operativsystemets overhead med hver av de valgte serverarkitekturene er et av de viktigste m\u00e5lene med dette \u00f8velsen. \u00c5 legge til flere variabler vil v\u00e6re skadelig for prosessen. Derfor fungerer oppsettet p\u00e5 bildet over best.<\/p>\n<h3>Hva gj\u00f8r hver av disse serverne<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: her kj\u00f8rer vi <code>ab<\/code>, Apache Benchmark-verkt\u00f8yet. Det genererer belastningen som kreves for \u00e5 teste v\u00e5re serverarkitekturer.\n<\/li>\n<li>nginx.unixism.net: noen ganger \u00f8nsker vi \u00e5 kj\u00f8re mer enn \u00e9n instans av serverprogrammet. For dette fungerer Nginx-serveren med de riktige innstillingene som en belastningsfordeler som mottar <i>ab<\/i> til v\u00e5re serverprosesser.\n<\/li>\n<li>zerohttpd.unixism.net: her kj\u00f8rer vi programmene v\u00e5re p\u00e5 syv ulike arkitekturer, \u00e9n av gangen.\n<\/li>\n<li>redis.unixism.net: p\u00e5 denne serveren kj\u00f8rer Redis-daemonen, der oppf\u00f8ringene i gjesteboken og bes\u00f8ksstatistikken lagres.<\/li>\n<\/ul>\n<p>\nAlle servere kj\u00f8rer p\u00e5 ett prosessorkjerne. Ideen er \u00e5 vurdere den maksimale ytelsen til hver arkitektur. Siden alle serverprogrammer blir testet p\u00e5 det samme utstyret, er dette et basisniv\u00e5 for sammenligning. Min testoppsett best\u00e5r av virtuelle servere leid fra Digital Ocean.<\/p>\n<h3>Hva m\u00e5ler vi?<\/h3>\n<p>\nVi kan m\u00e5le ulike indikatorer. Vi evaluerer ytelsen til hver arkitektur i denne konfigurasjonen, ved \u00e5 laste serverne med foresp\u00f8rselene p\u00e5 forskjellige niv\u00e5er av parallellisme: belastningen \u00f8ker fra 20 til 15 000 samtidige brukere.<\/p>\n<h1>Testresultater<\/h1>\n<p>\nI diagrammet nedenfor vises ytelsen til serverne p\u00e5 forskjellige arkitekturer ved forskjellige niv\u00e5er av parallellisme. P\u00e5 y-aksen er antall foresp\u00f8rseler per sekund, p\u00e5 x-aksen er parallelle tilkoblinger.<\/p>\n<p><img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Ytelsen til nettapplikasjoner i Linux. Introduksjon\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnder er tabellen med resultatene.<\/p>\n<p> foresp\u00f8rseler per sekund <\/p>\n<p><strong>parallellisme<\/strong><br \/>\n<strong>iterativ<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>tr\u00e5d-basert<\/strong><br \/>\n<strong>pre-tr\u00e5d-basert<\/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 \/>\nstor spredning<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nstor spredning<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nstor spredning<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nstor spredning<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>\nFra grafen og tabellen kan vi se at over 8000 samtidige foresp\u00f8rseler er det bare to akt\u00f8rer igjen: pre-fork og epoll. Med \u00f8kende belastning fungerer serveren basert p\u00e5 poll d\u00e5rligere enn den tr\u00e5d-baserte. Arkitekturen med forh\u00e5ndsopprettede tr\u00e5der gir en solid konkurranse til epoll: dette vitner om hvor godt Linux-kjernen planlegger et stort antall tr\u00e5der.<\/p>\n<h1>Kildekode for ZeroHTTPd<\/h1>\n<p>\nKildekode for ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">her<\/a><\/noindex>. For hver arkitektur er det en egen katalog.<\/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>\nI tillegg til syv kataloger for alle arkitekturer, finnes det ytterligere to i rotkatalogen: public og templates. I den f\u00f8rste ligger filen index.html og bildet fra det f\u00f8rste skjermbildet. Her kan du plassere andre filer og mapper, og ZeroHTTPd skal uten problemer kunne servere disse statiske filene. Hvis stien i nettleseren samsvarer med stien i public-mappen, ser ZeroHTTPd etter filen index.html i denne katalogen. Innholdet for gjesteboken genereres dynamisk. Den har kun en hovedside, og innholdet er basert p\u00e5 filen 'templates\/guestbook\/index.html'. Det er enkelt \u00e5 legge til dynamiske sider i ZeroHTTPd for utvidelse. Ideen er at brukere kan legge til maler i denne katalogen og utvide ZeroHTTPd etter behov.<\/p>\n<p>For \u00e5 bygge alle de syv serverne, kj\u00f8r <code>make all<\/code> fra rotkatalogen - og alle byggefilene vil dukke opp i denne katalogen. Kj\u00f8rbare filer leter etter katalogene public og templates i den katalogen de kj\u00f8res fra.<\/p>\n<h1>Linux API<\/h1>\n<p>\nFor \u00e5 forst\u00e5 informasjonen i denne artikkelserien, trenger du ikke \u00e5 ha en god forst\u00e5else av Linux API. Jeg anbefaler imidlertid \u00e5 lese mer om emnet; det finnes mange referanser p\u00e5 nettet. Selv om vi vil ber\u00f8re flere kategorier av Linux API, vil v\u00e5rt fokus hovedsakelig v\u00e6re p\u00e5 prosesser, tr\u00e5der, hendelser og nettverksstabler. I tillegg til b\u00f8ker og artikler om Linux API, anbefaler jeg ogs\u00e5 \u00e5 lese man-sider for systemkall og brukte biblioteksfunksjoner.<\/p>\n<h1>Ytelse og skalerbarhet<\/h1>\n<p>\nEn kommentar om ytelse og skalerbarhet. Teoretisk sett er det ingen sammenheng mellom dem. Du kan ha en webtjeneste som fungerer veldig bra, med responstider p\u00e5 noen millisekunder, men som ikke skaleres i det hele tatt. P\u00e5 samme m\u00e5te kan det v\u00e6re en d\u00e5rlig fungerende webapplikasjon som tar flere sekunder \u00e5 svare, men som skalerer til titalls for \u00e5 h\u00e5ndtere titusener av samtidige brukere. Likevel er kombinasjonen av h\u00f8y ytelse og skalerbarhet en veldig kraftig kombinasjon. H\u00f8yytelsesapplikasjoner bruker generelt ressurser \u00f8konomisk og betjener dermed flere samtidige brukere p\u00e5 serveren, noe som reduserer kostnadene.<\/p>\n<h1>CPU- og I\/O-oppgaver<\/h1>\n<p>\nTil slutt, i beregningene finnes det alltid to mulige typer oppgaver: for I\/O og CPU. H\u00e5ndtering av foresp\u00f8rslene via internett (nettverksinngang\/utgang), filbearbeiding (nettverks og disk I\/O), kommunikasjon med databasen (nettverks og disk I\/O) \u2013 alt dette er I\/O-oppgaver. Enkelte foresp\u00f8rsel til databasen kan belaste CPU en smule (sortering, beregning av gjennomsnittet av millioner av resultater, osv.). De fleste webapplikasjoner er begrenset av det maksimalt mulige I\/O, mens prosessoren sjeldent brukes til sin fulle kapasitet. N\u00e5r du ser at en eller annen oppgave for inngang\/utgang bruker mye CPU, er det mest sannsynlig et tegn p\u00e5 d\u00e5rlig applikasjonsarkitektur. Dette kan bety at CPU-ressursene brukes til prosessh\u00e5ndtering og kontekstbytter - og det er ikke helt nyttig. Hvis du gj\u00f8r noe som bildebehandling, konvertering av lydfiler eller maskinl\u00e6ring, vil applikasjonen kreve kraftige CPU-ressurser. Men for de fleste applikasjoner er det ikke tilfelle.<\/p>\n<h1>Mer om serverarkitekturer<\/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. Iterativ arkitektur<\/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-servere<\/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 servere<\/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. Servere med tr\u00e5der<\/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. Servere med forh\u00e5ndsskapt tr\u00e5der<\/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. Arkitektur basert p\u00e5 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. Arkitektur basert p\u00e5 epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Kilde: <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\/no\/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=\"nn_NO\" \/>\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\/no\/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\udd47Ytelse i nettverksapplikasjoner p\u00e5 Linux. Introduksjon | ProHoster","description":"Webapplikasjoner brukes n\u00e5 overalt, og blant alle transportprotokoller st\u00e5r HTTP for en betydelig andel.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}