{"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\/nl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Prestaties van netwerkapplicaties in Linux. Inleiding","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Webapplicaties worden tegenwoordig overal gebruikt, en onder alle transportprotocollen neemt HTTP een belangrijke plaats in. Bij het bestuderen van de nuances van webapplicatieontwikkeling, besteden de meeste mensen echter heel weinig aandacht aan het besturingssysteem waarop deze applicaties daadwerkelijk draaien. De scheiding tussen ontwikkeling (Dev) en operatie (Ops) heeft de situatie alleen maar verergerd. Maar met de opkomst van de DevOps-cultuur beginnen ontwikkelaars verantwoordelijkheden te nemen voor het draaien van hun applicaties in de cloud, waardoor het voor hen zeer nuttig is om zich grondig te verdiepen in de backend van het besturingssysteem. Dit is vooral handig als je een systeem probeert op te zetten voor duizenden of tienduizenden gelijktijdige verbindingen.<\/p>\n<p>Beperkingen in webservices zijn heel vergelijkbaar met beperkingen in andere applicaties. Of het nu gaat om load balancers of database servers, al deze applicaties hebben soortgelijke problemen in een omgeving met hoge prestaties. Begrip van deze fundamentele beperkingen en manieren om ze in het algemeen te overwinnen, zal helpen bij het beoordelen van de prestaties en schaalbaarheid van je webapplicaties.<\/p>\n<p>Ik schrijf deze serie artikelen als reactie op de vragen van jonge ontwikkelaars die goed ge\u00efnformeerde systeemsarchitecten willen worden. Het is onmogelijk om de optimalisatiemethoden voor Linux-applicaties goed te begrijpen zonder de basisprincipes te doorgronden van hoe ze werken op het niveau van het besturingssysteem. Hoewel er veel soorten applicaties zijn, wil ik in deze cyclus netwerkafflicaties onderzoeken, en niet desktopapplicaties zoals browsers of tekstverwerkers. Dit materiaal is gericht op ontwikkelaars en architecten die willen begrijpen hoe Linux- of Unix-programma's functioneren en hoe ze gestructureerd kunnen worden voor hoge prestaties.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux is <i>een server-<\/i> besturingssysteem, en vaak draaien je applicaties op dit OS. Hoewel ik \"Linux\" zeg, kun je in de meeste gevallen met een gerust hart aannemen dat alle Unix-achtige besturingssystemen in het algemeen worden bedoeld. Desondanks heb ik de bijbehorende code niet op andere systemen getest. Dus als je ge\u00efnteresseerd bent in FreeBSD of OpenBSD, kan het resultaat anders zijn. Wanneer ik iets specifieks voor Linux probeer, geef ik dat aan.<\/p>\n<p>Hoewel je de opgedane kennis kunt gebruiken om een applicatie vanuit het niets te cre\u00ebren, wat geweldig geoptimaliseerd kan zijn, is het beter om dat niet te doen. Als je een nieuwe webserver in C of C++ schrijft voor de zakelijke applicatie van je organisatie, kan het wel eens je laatste werkdag zijn. Echter, een begrip van de structuur van deze applicaties helpt bij het kiezen van reeds bestaande programma's. Je kunt systemen op basis van processen vergelijken met systemen op basis van threads en ook met die op basis van gebeurtenissen. Je zult begrijpen en waarderen waarom Nginx beter presteert dan Apache httpd, en waarom een Python-applicatie gebaseerd op Tornado meer gebruikers kan bedienen dan een Python-applicatie op basis van Django.<\/p>\n<h1>ZeroHTTPd: leermiddel<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 een webserver die ik vanaf nul heb geschreven in C als een leermiddel. Het heeft geen externe afhankelijkheden, ook geen toegang tot Redis. We draaien onze eigen Redis-processen. Zie hieronder voor meer informatie.<\/p>\n<p>Hoewel we lang over de theorie zouden kunnen discussi\u00ebren, is er niets beter dan het schrijven van code, deze uit te voeren en alle serverarchitecturen met elkaar te vergelijken. Dit is de meest visuele methode. Daarom gaan we een eenvoudige webserver ZeroHTTPd schrijven, waarbij we elk model toepassen: op basis van processen, threads en gebeurtenissen. We zullen elke server testen en kijken hoe ze zich verhouden tot elkaar. ZeroHTTPd is ge\u00efmplementeerd in \u00e9\u00e9n C-bestand. De event-based server bevat <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, een geweldige implementatie van een hash-tabel die wordt geleverd in \u00e9\u00e9n headerbestand. Verder zijn er geen afhankelijkheden, zodat het project niet wordt complicate.<\/p>\n<p>De code bevat veel comments om te helpen begrijpen. Als een eenvoudige webserver in een paar regels code, vormt ZeroHTTPd ook een minimaal framework voor webontwikkeling. Het heeft beperkte functionaliteit, maar kan statische bestanden en zeer eenvoudige 'dynamische' pagina's serveren. Ik moet zeggen dat ZeroHTTPd goed geschikt is voor het leren hoe je hoogpresterende Linux-applicaties kunt maken. Over het algemeen wachten de meeste webservices op verzoeken, controleren ze en verwerken ze. Dat is precies wat ZeroHTTPd zal doen. Het is een leermiddel, geen productie-oplossing. Het is niet sterk in foutafhandeling en zal waarschijnlijk niet de beste beveiligingspraktijken kunnen bieden (oh ja, ik heb gebruik gemaakt van <code>strcpy<\/code>) of with cryptic tricks of the C language. But I hope it will perform its task well.<\/p>\n<p><img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>De startpagina van ZeroHTTPd. Het kan verschillende soorten bestanden afleveren, waaronder afbeeldingen.<\/i><\/p>\n<h1>Gastenboek applicatie.<\/h1>\n<p>\nModerne webapplicaties zijn doorgaans niet beperkt tot statische bestanden. Ze hebben complexe interacties met verschillende databases, caches, enz. Daarom gaan we een eenvoudige webapplicatie maken genaamd 'Gastenboek', waar bezoekers berichten achterlaten onder hun naam. In het gastenboek worden eerder achtergelaten berichten opgeslagen. Er is ook een bezoekersaantal onderaan de pagina.<\/p>\n<p><img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Webapplicatie 'Gastenboek' van ZeroHTTPd.<\/i><\/p>\n<p>Het bezoekersaantal en de gastenboekberichten worden opgeslagen in Redis. Voor de communicatie met Redis zijn eigen procedures ge\u00efmplementeerd, die onafhankelijk zijn van externe bibliotheken. Ik ben geen grote fan van het uitrollen van zelfgemaakte code wanneer er publiek beschikbare en goed geteste oplossingen zijn. Maar het doel van ZeroHTTPd is om de prestaties van Linux en de toegang tot externe diensten te bestuderen, terwijl het afhandelen van HTTP-verzoeken een aanzienlijke invloed heeft op de prestaties. We moeten de communicatie met Redis in al onze serverarchitecturen volledig kunnen controleren. In de ene architectuur gebruiken we \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 aanroepen, in andere event-gebaseerde procedures. Het gebruik van een externe Redis-clientbibliotheek biedt deze controle niet. Bovendien voert onze kleine Redis-client slechts enkele functies uit (het ophalen, instellen en verhogen van een sleutel; het ophalen en toevoegen aan een array). Daarbij is het Redis-protocol uitzonderlijk elegant en eenvoudig. Het hoeft zelfs niet speciaal geleerd te worden. Het feit dat het hele werk door het protocol ongeveer in honderd regels code is uitgevoerd, toont aan hoe goed het is doordacht.<\/p>\n<p>In de volgende afbeelding worden de acties van de applicatie getoond wanneer de client (browser) een aanvraag doet. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Werking van de gastenboek applicatie.<\/i><\/p>\n<p>Wanneer een pagina van het gastenboek moet worden weergegeven, gebeurt er \u00e9\u00e9n aanroep naar het bestandssysteem om de sjabloon in het geheugen te lezen en drie netwerkaanroepen naar Redis. Het sjabloonbestand bevat het meeste HTML-inhoud voor de pagina op de screenshot bovenaan. Er zijn ook speciale plaatsaanduidingen voor het dynamische gedeelte van de inhoud: berichten en het bezoekersaantal. We halen deze uit Redis, voegen ze op de pagina in en geven de klant de volledig gevormde inhoud. De derde aanroep naar Redis kan worden vermeden, aangezien Redis een nieuwe waarde van de sleutel retourneert bij verhoging. Voor onze server met een op gebeurtenissen gebaseerde asynchrone architectuur zijn meerdere netwerkaanroepen echter een goede test voor educatieve doeleinden. Daarom negeren we de geretourneerde waarde van Redis over het aantal bezoekers en vragen we deze met een aparte aanroep aan.<\/p>\n<h1>Serverarchitecturen ZeroHTTPd<\/h1>\n<p>\nWe bouwen zeven versies van ZeroHTTPd met dezelfde functionaliteit, maar verschillende architecturen:<\/p>\n<ul>\n<li>Iteratief\n<\/li>\n<li>Fork-server (\u00e9\u00e9n subprocess per verzoek)\n<\/li>\n<li>Prefork server (vooraf forked processen)\n<\/li>\n<li>Server met uitvoerthreads (\u00e9\u00e9n thread per verzoek)\n<\/li>\n<li>Server met vooraf gecre\u00eberde threads\n<\/li>\n<li>Architectuur op basis van <code>poll()<\/code>\n<\/li>\n<li>Architectuur op basis van <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nWe meten de prestaties van elke architectuur door de server te belasten met HTTP-verzoeken. Maar bij het vergelijken van architecturen met een hoge mate van parallelisme neemt het aantal verzoeken toe. We testen drie keer en berekenen het gemiddelde.<\/p>\n<h1>Testmethodologie<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Installatie voor stress-testen van ZeroHTTPd<\/i> <\/p>\n<p>Het is belangrijk dat tijdens het testen alle componenten niet op \u00e9\u00e9n machine draaien. In dit geval heeft het besturingssysteem extra overhead voor scheduling, omdat de componenten concurreren om de CPU. Het meten van de overhead van het besturingssysteem met elk van de gekozen serverarchitecturen is een van de belangrijkste doelstellingen van deze oefening. Het toevoegen van meer variabelen zou schadelijk zijn voor het proces. Daarom werkt de configuratie op de afbeelding hierboven het beste.<\/p>\n<h3>Wat doet elk van deze servers?<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: hier draaien we <code>ab<\/code>, de Apache Benchmark-tool. Deze genereert de vereiste belasting om onze serverarchitecturen te testen.\n<\/li>\n<li>nginx.unixism.net: Soms willen we meer dan \u00e9\u00e9n instantie van een serverprogramma uitvoeren. Hiervoor fungeert de Nginx-server met de juiste instellingen als een load balancer voor <i>ab<\/i> onze serverprocessen.\n<\/li>\n<li>zerohttpd.unixism.net: hier draaien we onze serverprogramma's op zeven verschillende architecturen, \u00e9\u00e9n tegelijk.\n<\/li>\n<li>redis.unixism.net: op deze server draait de Redis-daemon, waar de gegevens van het gastenboek en de bezoekerscounter worden opgeslagen.<\/li>\n<\/ul>\n<p>\nAlle servers draaien op \u00e9\u00e9n CPU-kern. Het idee is om de maximale prestaties van elke architectuur te evalueren. Aangezien alle serverprogramma's op dezelfde hardware worden getest, is dit de basislijn voor hun vergelijking. Mijn testopstelling bestaat uit virtuele servers die zijn gehuurd van Digital Ocean.<\/p>\n<h3>Wat meten we?<\/h3>\n<p>\nEr kunnen verschillende statistieken worden gemeten. We evalueren de prestaties van elke architectuur in deze configuratie door de servers te belasten met aanvragen op verschillende niveaus van parallelisme: de belasting stijgt van 20 tot 15.000 gelijktijdige gebruikers.<\/p>\n<h1>Testresultaten<\/h1>\n<p>\nIn de volgende diagram wordt de prestaties van de servers op verschillende architecturen bij verschillende niveaus van parallelisme weergegeven. Op de y-as staat het aantal aanvragen per seconde, op de x-as de parallelle verbindingen.<\/p>\n<p><img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Prestaties van netwerkapplicaties in Linux. Inleiding\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHieronder staat een tabel met resultaten.<\/p>\n<p> aanvragen per seconde <\/p>\n<p><strong>parallelisme<\/strong><br \/>\n<strong>iteratief<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>vooraf fork<\/strong><br \/>\n<strong>draad<\/strong><br \/>\n<strong>vooraf draad<\/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 \/>\ngrote spreiding<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\ngrote spreiding<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\ngrote spreiding<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\ngrote spreiding<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>\nUit de grafiek en tabel blijkt dat bij meer dan 8000 gelijktijdige aanvragen er alleen twee spelers overblijven: vooraf fork en epoll. Naarmate de belasting toeneemt, presteert de op polling gebaseerde server slechter dan de draad-architectuur. De architectuur met vooraf aangemaakte draden vormt een serieuze concurrent voor epoll: dit getuigt van hoe goed de Linux-kernel een groot aantal draden plant.<\/p>\n<h1>Broncode ZeroHTTPd<\/h1>\n<p>\nBroncode ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">hier<\/a><\/noindex>. Voor elke architectuur is er een aparte map.<\/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>\nNaast de zeven mappen voor alle architecturen, zijn er nog twee in de bovenste map: public en templates. In de eerste bevindt zich het bestand index.html en een afbeelding van de eerste screenshot. Hier kunnen andere bestanden en mappen worden geplaatst, en ZeroHTTPd moet deze statische bestanden zonder problemen kunnen serveren. Als het pad in de browser overeenkomt met het pad in de map public, zoekt ZeroHTTPd in deze map het bestand index.html. De inhoud van het gastenboek wordt dynamisch gegenereerd. Het heeft alleen een homepage, en de inhoud is gebaseerd op het bestand 'templates\/guestbook\/index.html'. In ZeroHTTPd kunnen gemakkelijk dynamische pagina's worden toegevoegd voor uitbreiding. Het idee is dat gebruikers in deze map sjablonen kunnen toevoegen en ZeroHTTPd indien nodig kunnen uitbreiden.<\/p>\n<p>Om alle zeven servers te bouwen, voert u <code>make all<\/code> uit de bovenliggende directory - en alle builds verschijnen in deze directory. De uitvoerbare bestanden zoeken de directories public en templates in de directory van waaruit ze worden uitgevoerd.<\/p>\n<h1>Linux API<\/h1>\n<p>\nOm de informatie in deze artikelenreeks te begrijpen, is het niet nodig om een expert te zijn in de Linux API. Ik raad echter aan om meer te lezen over dit onderwerp, er zijn veel bronnen online. Hoewel we enkele categorie\u00ebn van de Linux API zullen behandelen, zal onze aandacht voornamelijk gericht zijn op processen, threads, gebeurtenissen en de netwerkstack. Naast boeken en artikelen over de Linux API, raad ik ook aan om de man-pagina\u2019s van systeemaanroepen en gebruikte bibliotheekfuncties te lezen.<\/p>\n<h1>Prestaties en schaalbaarheid<\/h1>\n<p>\nEen opmerking over prestaties en schaalbaarheid. Theoretisch is er geen enkele relatie tussen hen. U kunt een webservice hebben die heel goed presteert, met responstijden van enkele milliseconden, maar die helemaal niet schaalbaar is. Evenzo kan er een slecht presterende webapplicatie zijn die enkele seconden nodig heeft voor een reactie, maar die schaalbaar is tot tientallen om tienduizenden gelijktijdige gebruikers te verwerken. Desalniettemin is de combinatie van hoge prestaties en schaalbaarheid een zeer krachtige combinatie. Hoogpresterende applicaties maken over het algemeen zuinig gebruik van middelen en kunnen zo effici\u00ebnt meer gelijktijdige gebruikers op de server bedienen, waardoor de kosten worden verlaagd.<\/p>\n<h1>CPU- en I\/O-taken<\/h1>\n<p>\nUiteindelijk zijn er altijd twee mogelijke typen taken in berekeningen: voor I\/O en CPU. Het ontvangen van verzoeken via het internet (netwerk I\/O), het bedienen van bestanden (netwerk- en schijf-I\/O), communicatie met een database (netwerk- en schijf-I\/O) \u2014 dit zijn allemaal I\/O-acties. Sommige databaseverzoeken kunnen de CPU een beetje belasten (zoals sorteren, het berekenen van het gemiddelde van een miljoen resultaten, enz.). De meeste webapplicaties zijn beperkt in de maximaal mogelijke I\/O, terwijl de processor zelden op volle capaciteit wordt gebruikt. Wanneer je ziet dat er veel CPU wordt gebruikt voor een bepaalde I\/O-taak, is dat waarschijnlijk een teken van een slechte applicatiearchitectuur. Dit kan betekenen dat de CPU-resources worden verspild aan procesbeheer en contextwisseling - en dat is niet echt nuttig. Als je iets doet zoals beeldverwerking, audiobestandconversie of machine learning, dan vereist de applicatie krachtige CPU-resources. Maar voor de meeste applicaties is dat niet het geval.<\/p>\n<h1>Meer over serverarchitecturen<\/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\/\">Deel I. Iteratieve architectuur<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Deel II. Fork-servers<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Deel III. Pre-fork servers<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Deel IV. Servers met uitvoeringsthreads<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Deel V. Servers met voorafgaande threadcreatie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Deel VI. Architectuur gebaseerd op poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Deel VII. Architectuur gebaseerd op epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Prestaties van netwerkapplicaties op Linux. Inleiding | ProHoster","description":"Webapplicaties worden tegenwoordig overal gebruikt en binnen alle transportprotocollen maakt HTTP de grootste deel uit.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}