{"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\/da\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Webapplikationer bruges nu overalt, og blandt alle transportprotokoller udg\u00f8r HTTP st\u00f8rstedelen. N\u00e5r man studerer detaljer i webapplikationsudvikling, bliver operativsystemet, hvor disse applikationer faktisk k\u00f8rer, ofte overset. Opdelingen mellem udvikling (Dev) og drift (Ops) har kun forv\u00e6rret situationen. Men med udbredelsen af DevOps-kulturen begynder udviklerne at p\u00e5tage sig ansvaret for at k\u00f8re deres applikationer i skyen, s\u00e5 det er meget nyttigt for dem at blive grundigt bekendt med backend'en i operativsystemet. Dette er is\u00e6r nyttigt, hvis du fors\u00f8ger at implementere et system til tusindvis eller titusindvis af samtidige forbindelser.<\/p>\n<p>Begr\u00e6nsningerne i webtjenester ligner meget dem i andre applikationer. Uanset om det er belastningsbalance eller databaser, har alle disse applikationer lignende problemer i h\u00f8jtydende milj\u00f8er. At forst\u00e5 disse grundl\u00e6ggende begr\u00e6nsninger og m\u00e5der at overvinde dem p\u00e5 vil generelt tillade dig at vurdere ydeevnen og skalerbarheden af dine webapplikationer.<\/p>\n<p>Jeg skriver denne serie artikler som svar p\u00e5 sp\u00f8rgsm\u00e5l fra unge udviklere, der \u00f8nsker at blive velbevandrede systemarkitekter. Det er umuligt at forst\u00e5 metoderne til optimering af Linux-applikationer uden at dykke ned i det grundl\u00e6ggende, og hvordan de fungerer p\u00e5 operativsystemniveau. Selvom der findes mange typer applikationer, vil jeg i denne cyklus unders\u00f8ge netv\u00e6rksapplikationer og ikke desktop-applikationer som browsere eller tekstbehandlere. Dette materiale er rettet mod udviklere og arkitekter, der \u00f8nsker at forst\u00e5, hvordan Linux- eller Unix-programmer fungerer, og hvordan man strukturerer dem til h\u00f8j ydeevne.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux er <i>et server-<\/i> operativsystem, og oftest k\u00f8rer dine applikationer netop p\u00e5 dette OS. Selvom jeg siger \"Linux\", kan du st\u00f8rstedelen af tiden med sikkerhed antage, at der menes alle Unix-lignende operativsystemer generelt. Jeg har dog ikke testet den medf\u00f8lgende kode p\u00e5 andre systemer. S\u00e5 hvis du er interesseret i FreeBSD eller OpenBSD, kan resultaterne variere. N\u00e5r jeg pr\u00f8ver noget, der er specifikt for Linux, angiver jeg det.<\/p>\n<p>Selvom du kan bruge den viden, du f\u00e5r, til at bygge en applikation fra bunden, som vil v\u00e6re fremragende optimeret, er det bedst ikke at g\u00f8re det. Hvis du skriver en ny webserver i C eller C++ til din organisations forretningsapplikation, kan det v\u00e6re din sidste dag p\u00e5 jobbet. Men at have kendskab til strukturen af disse applikationer vil hj\u00e6lpe dig med at v\u00e6lge mellem allerede eksisterende programmer. Du vil kunne sammenligne systemer baseret p\u00e5 processer med systemer baseret p\u00e5 tr\u00e5de samt systemer baseret p\u00e5 begivenheder. Du vil forst\u00e5 og v\u00e6rds\u00e6tte, hvorfor Nginx fungerer bedre end Apache httpd, og hvorfor en Python-applikation baseret p\u00e5 Tornado kan betjene flere brugere sammenlignet med en Python-applikation baseret p\u00e5 Django.<\/p>\n<h1>ZeroHTTPd: l\u00e6ringsv\u00e6rkt\u00f8j<\/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 bunden i C som et l\u00e6ringsv\u00e6rkt\u00f8j. Den har ingen eksterne afh\u00e6ngigheder, herunder adgang til Redis. Vi k\u00f8rer vores egne Redis-processer. L\u00e6s mere nedenfor.<\/p>\n<p>Selvom vi kunne diskutere teorien l\u00e6nge, er der ikke noget bedre end at skrive noget kode, k\u00f8re det og sammenligne alle serverarkitekturer. Det er den mest visuelle metode. Derfor vil vi skrive en simpel webserver, ZeroHTTPd, ved at anvende hver model: baseret p\u00e5 processer, tr\u00e5de og begivenheder. Vi vil teste hver af disse servere og se, hvordan de fungerer i forhold til hinanden. ZeroHTTPd er implementeret i en enkelt C-fil. Serveren baseret p\u00e5 begivenheder inkluderer <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, en fremragende implementering af en hash-tabel, der leveres i \u00e9n header-fil. I \u00f8vrige tilf\u00e6lde er der ingen afh\u00e6ngigheder for ikke at komplicere projektet.<\/p>\n<p>Der er mange kommentarer i koden for at hj\u00e6lpe med forst\u00e5elsen. Som en simpel webserver med et par linjer kode fungerer ZeroHTTPd ogs\u00e5 som et minimalt framework for webudvikling. Den har begr\u00e6nset funktionalitet, men den kan levere statiske filer og meget enkle 'dynamiske' sider. Jeg m\u00e5 sige, at ZeroHTTPd er godt til at l\u00e6re, hvordan man skaber h\u00f8jtydende Linux-applikationer. Generelt set venter de fleste webtjenester p\u00e5 foresp\u00f8rgsler, kontrollerer dem og behandler dem. Det er pr\u00e6cis, hvad ZeroHTTPd vil g\u00f8re. Det er et l\u00e6ringsv\u00e6rkt\u00f8j, ikke til produktion. Den er ikke st\u00e6rk i fejlbehandling og vil n\u00e6ppe prale af de bedste sikkerhedspraksisser (\u00e5h ja, jeg brugte <code>strcpy<\/code>) eller med komplicerede tricks i C-sproget. Men jeg h\u00e5ber, det vil klare sin opgave godt.<\/p>\n<p><img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Hjemmesiden for ZeroHTTPd. Den kan server forskellige filtyper, inklusive billeder.<\/i><\/p>\n<h1>G\u00e6stebogsapplikation<\/h1>\n<p>\nModerne webapplikationer er normalt ikke begr\u00e6nset til statiske filer. De har komplekse interaktioner med forskellige databaser, caches osv. Derfor vil vi skabe en simpel webapplikation kaldet \"G\u00e6stebog\", hvor bes\u00f8gende kan efterlade indl\u00e6g under deres navne. I g\u00e6stebogen gemmes tidligere efterladte indl\u00e6g. Der er ogs\u00e5 en t\u00e6ller for bes\u00f8gende nederst p\u00e5 siden.<\/p>\n<p><img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Webapplikationen \"G\u00e6stebog\" ZeroHTTPd<\/i><\/p>\n<p>T\u00e6lleren for bes\u00f8gende og indl\u00e6g i g\u00e6stebogen gemmes i Redis. Der er implementeret egne procedurer til kommunikation med Redis, som ikke er afh\u00e6ngige af eksterne biblioteker. Jeg er ikke stor fan af at rulle egen kode ud, n\u00e5r der er offentligt tilg\u00e6ngelige og veldokumenterede l\u00f8sninger. Men m\u00e5let med ZeroHTTPd er at unders\u00f8ge ydeevnen i Linux og adgangen til eksterne tjenester, mens behandling af HTTP-anmodninger har en alvorlig indvirkning p\u00e5 ydeevnen. Vi skal have fuld kontrol over kommunikationen med Redis i hver af vores serverarkitekturer. I en arkitektur bruger vi blokkerende kald, i andre er der procedurer baseret p\u00e5 h\u00e6ndelser. Brug af et eksternt Redis-klientbibliotek vil ikke give den kontrol. Derudover udf\u00f8rer vores lille Redis-klient kun f\u00e5 funktioner (hentning, indstilling og inkrementering af n\u00f8gler; hentning og tilf\u00f8jelse til arrays). Desuden er Redis-protokollen s\u00e6rdeles elegant og enkel. Man beh\u00f8ver endda ikke at l\u00e6re det specifikt. Faktisk viser det, at hele arbejdet udf\u00f8res af protokollen i cirka hundrede linjer kode, hvor godt designet det er.<\/p>\n<p>Den f\u00f8lgende illustration viser handlingerne i applikationen, n\u00e5r klienten (browseren) anmoder <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mekanismen bag g\u00e6stebogsapplikationen<\/i><\/p>\n<p>N\u00e5r der skal vises en side fra g\u00e6stebogen, foretages der et kald til filsystemet for at l\u00e6se skabelonen ind i hukommelsen og tre netv\u00e6rkskald til Redis. Skabelonfilen indeholder det meste af HTML-indholdet til siden p\u00e5 sk\u00e6rmbilledet ovenfor. Der er ogs\u00e5 specielle pladsholdere til den dynamiske del af indholdet: indl\u00e6g og bes\u00f8gst\u00e6ller. Vi henter dem fra Redis, inds\u00e6tter dem p\u00e5 siden og leverer det fuldt udformede indhold til klienten. Det tredje kald til Redis kan undg\u00e5s, da Redis returnerer den nye v\u00e6rdi af n\u00f8glen ved opdatering. Men for vores server med asynkron event-baseret arkitektur er mange netv\u00e6rkskald en god \u00f8velse med hensyn til l\u00e6ring. Derfor forkaster vi den returnerede v\u00e6rdi fra Redis om antallet af bes\u00f8gende og anmoder om den med et separat kald.<\/p>\n<h1>Serverarkitekturer ZeroHTTPd<\/h1>\n<p>\nVi bygger syv versioner af ZeroHTTPd med ens funktionalitet, men forskellige arkitekturer:<\/p>\n<ul>\n<li>Iterativ\n<\/li>\n<li>Fork server (\u00e9n dataproces pr. anmodning)\n<\/li>\n<li>Pre-fork server (forudg\u00e5ende forking af processer)\n<\/li>\n<li>Tr\u00e5d-server (\u00e9n tr\u00e5d pr. anmodning)\n<\/li>\n<li>Server med forudoprettede tr\u00e5de\n<\/li>\n<li>Arkitektur baseret p\u00e5 <code>poll()<\/code>\n<\/li>\n<li>Arkitektur baseret p\u00e5 <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nVi m\u00e5ler ydeevnen af hver arkitektur ved at belaste serveren med HTTP-anmodninger. Men n\u00e5r man sammenligner arkitekturer med h\u00f8j parallelisme, \u00f8ges antallet af anmodninger. Vi tester tre gange og beregner gennemsnittet.<\/p>\n<h1>Testmetodologi<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Ops\u00e6tning til belastningstestning af ZeroHTTPd<\/i> <\/p>\n<p>Det er vigtigt, at alle komponenter ikke k\u00f8rer p\u00e5 \u00e9n maskine under testene. I dette tilf\u00e6lde p\u00e5drager OS ekstra omkostninger til planl\u00e6gning, da komponenterne konkurrerer om CPU'en. At m\u00e5le de operationelle systemomkostninger med hver af de valgte serverarkitekturer er et af de vigtigste m\u00e5l med denne \u00f8velse. At tilf\u00f8je flere variabler vil v\u00e6re skadeligt for processen. Derfor fungerer ops\u00e6tningen p\u00e5 billedet ovenfor bedst.<\/p>\n<h3>Hvad g\u00f8r hver af disse servere<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: her k\u00f8rer vi <code>ab<\/code>, Apache Benchmark-v\u00e6rkt\u00f8jet. Det genererer den belastning, der er n\u00f8dvendig for at teste vores serverarkitekturer.\n<\/li>\n<li>nginx.unixism.net: Nogle gange \u00f8nsker vi at k\u00f8re mere end \u00e9n instans af serverprogrammet. For dette fungerer Nginx-serveren med de passende indstillinger som en belastningsfordeler for indkommende <i>ab<\/i> til vores serverprocesser.\n<\/li>\n<li>zerohttpd.unixism.net: Her k\u00f8rer vi vores serverprogrammer p\u00e5 syv forskellige arkitekturer, en ad gangen.\n<\/li>\n<li>redis.unixism.net: P\u00e5 denne server k\u00f8rer Redis-d\u00e6monen, hvor g\u00e6stebogsindl\u00e6g og bes\u00f8gsregistreringer opbevares.<\/li>\n<\/ul>\n<p>\nAlle servere k\u00f8rer p\u00e5 en enkelt CPU-kerne. Ideen er at vurdere den maksimale ydeevne for hver af arkitekturerne. Da alle serverprogrammer testes p\u00e5 det samme udstyr, er dette en basislinje for deres sammenligning. Min testops\u00e6tning best\u00e5r af virtuelle servere lejet fra Digital Ocean.<\/p>\n<h3>Hvad m\u00e5ler vi?<\/h3>\n<p>\nForskellige metrikker kan m\u00e5les. Vi vurderer ydeevnen for hver arkitektur i denne konfiguration ved at belaste serverne med anmodninger p\u00e5 forskellige niveauer af parallelisme: belastningen stiger fra 20 til 15.000 samtidige brugere.<\/p>\n<h1>Test Results<\/h1>\n<p>\nI det f\u00f8lgende diagram vises servernes ydeevne p\u00e5 forskellige arkitekturer ved forskellige niveauer af parallelisme. P\u00e5 y-aksen er antallet af anmodninger pr. sekund, og p\u00e5 x-aksen er de parallelle forbindelser.<\/p>\n<p><img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Ydelsen af netv\u00e6rksapplikationer i Linux. Introduktion\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNedenfor er en tabel med resultaterne.<\/p>\n<p> anmodninger pr. sekund <\/p>\n<p><strong>parallelisme<\/strong><br \/>\n<strong>iterativ<\/strong><br \/>\n<strong>en fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>tr\u00e5det<\/strong><br \/>\n<strong>pre-threaded<\/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 \/>\nstort spredning<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nstort 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 \/>\nstort spredning<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nstort 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 anmodninger har vi kun to spillere tilbage: pre-fork og epoll. Efterh\u00e5nden som belastningen stiger, pr\u00e6sterer serveren baseret p\u00e5 poll d\u00e5rligere end den tr\u00e5dede. Arkitekturen med forudlavede tr\u00e5de udg\u00f8r en v\u00e6rdig konkurrence mod epoll: dette viser, hvor godt Linux-kernen planl\u00e6gger et stort antal tr\u00e5de.<\/p>\n<h1>Kildekoden til ZeroHTTPd<\/h1>\n<p>\nKildekoden til ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">her<\/a><\/noindex>. For hver arkitektur er der et separat 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>\nUd over syv kataloger til alle arkitekturer findes der to ekstra i rodkataloget: public og templates. I det f\u00f8rste katalog ligger filen index.html og et billede fra det f\u00f8rste screenshot. Der kan placeres andre filer og mapper her, og ZeroHTTPd skal uden problemer kunne levere disse statiske filer. Hvis stien i browseren svarer til stien i mappen public, s\u00f8ger ZeroHTTPd efter filen index.html i dette katalog. Indholdet til g\u00e6stebogen genereres dynamisk. Den har kun en hovedside, og dens indhold er baseret p\u00e5 filen 'templates\/guestbook\/index.html'. Det er nemt at tilf\u00f8je dynamiske sider til ZeroHTTPd for at udvide funktionaliteten. Ideen er, at brugere kan tilf\u00f8je skabeloner i dette katalog og udvide ZeroHTTPd efter behov.<\/p>\n<p>For at bygge alle syv servere, k\u00f8r <code>make all<\/code> fra rodkatalogen - og alle builds vil dukke op i denne katalog. De eksekverbare filer s\u00f8ger efter katalogerne public og templates i den katalog, de k\u00f8res fra.<\/p>\n<h1>Linux API<\/h1>\n<p>\nFor at forst\u00e5 informationen i denne artikelcyklus er det ikke n\u00f8dvendigt at have en dyb forst\u00e5else af Linux API. Jeg anbefaler dog at l\u00e6se mere om emnet, da der findes mange ressourcer online. Selvom vi vil ber\u00f8re flere kategorier af Linux API, vil vores fokus prim\u00e6rt v\u00e6re p\u00e5 processer, tr\u00e5de, begivenheder og netv\u00e6rksstakken. Udover b\u00f8ger og artikler om Linux API anbefaler jeg ogs\u00e5 at l\u00e6se manualerne for systemopkald og de biblioteksfunktioner, der anvendes.<\/p>\n<h1>Ydelse og skalerbarhed<\/h1>\n<p>\nEn bem\u00e6rkning om ydelse og skalerbarhed. Teoretisk set er der ingen forbindelse mellem dem. Du kan have en webservice, der fungerer rigtig godt, med svartider p\u00e5 f\u00e5 millisekunder, men som ikke skalerer overhovedet. P\u00e5 samme m\u00e5de kan der v\u00e6re en webapplikation, der fungerer d\u00e5rligt og tager flere sekunder at svare, men som skalerer til at h\u00e5ndtere titusinder af samtidige brugere. Ikke desto mindre er kombinationen af h\u00f8j ydelse og skalerbarhed en meget kraftfuld kombination. H\u00f8jtydende applikationer bruger generelt ressourcer sparsomt og kan derfor effektivt betjene flere samtidige brugere p\u00e5 serveren, hvilket reducerer omkostningerne.<\/p>\n<h1>CPU- og I\/O-opgaver<\/h1>\n<p>\nEndelig er der altid to mulige typer opgaver i beregninger: I\/O og CPU. Modtagelse af anmodninger over internettet (netv\u00e6rksind- og uddata), administration af filer (netv\u00e6rks- og diskind- og uddata), kommunikation med databaser (netv\u00e6rks- og diskind- og uddata) \u2013 alt dette er I\/O-handlinger. Nogle anmodninger til databasen kan belaste CPU'en lidt (sortering, beregning af gennemsnittet af en million resultater osv.). De fleste webapplikationer er begr\u00e6nset af den maksimalt mulige I\/O, mens CPU'en sj\u00e6ldent anvendes fuldt ud. N\u00e5r du ser, at en eller anden I\/O-opgave bruger meget CPU, er det sandsynligvis et tegn p\u00e5 d\u00e5rlig applikationsarkitektur. Det kan betyde, at CPU-ressourcer bruges p\u00e5 processtyring og kontekstskift \u2013 og det er ikke s\u00e6rlig nyttigt. Hvis du laver noget som billedbehandling, konvertering af lydfiler eller maskinl\u00e6ring, s\u00e5 kr\u00e6ver applikationen kraftige CPU-ressourcer. Men for de fleste applikationer er det ikke tilf\u00e6ldet.<\/p>\n<h1>Mere 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 udf\u00f8relsestr\u00e5de<\/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 pr\u00e6kompilerede tr\u00e5de<\/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. Poll-baseret arkitektur<\/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. Epoll-baseret arkitektur<\/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.3 - 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\/da\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Ydelse for netv\u00e6rksapplikationer i Linux. Introduktion | ProHoster","description":"Webapplikationer bruges nu overalt, og blandt alle transportprotokoller udg\u00f8r HTTP en stor del.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}