{"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\/de\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Webanwendungen sind heutzutage weit verbreitet, und unter allen Transportprotokollen hat HTTP den gr\u00f6\u00dften Anteil. Bei der Entwicklung von Webanwendungen schenken die meisten der zugrunde liegenden Betriebssystemumgebung wenig Beachtung. Die Trennung zwischen Entwicklung (Dev) und Betrieb (Ops) hat die Situation zus\u00e4tzlich erschwert. Mit der Verbreitung der DevOps-Kultur \u00fcbernehmen Entwickler jedoch zunehmend Verantwortung f\u00fcr das Betreiben ihrer Anwendungen in der Cloud, weshalb ein vertieftes Verst\u00e4ndnis der Backend-Umgebung des Betriebssystems \u00e4u\u00dferst vorteilhaft ist. Dies ist besonders wichtig, wenn Sie ein System f\u00fcr tausende oder sogar zehntausende gleichzeitige Verbindungen bereitstellen m\u00f6chten.<\/p>\n<p>Die Einschr\u00e4nkungen in Webdiensten \u00e4hneln stark denen anderer Anwendungen. Ob Lastenausgleich oder Datenbankserver, diese Anwendungen haben in leistungsstarken Umgebungen \u00e4hnliche Herausforderungen. Das Verst\u00e4ndnis dieser grundlegenden Einschr\u00e4nkungen und der M\u00f6glichkeiten zu ihrer \u00dcberwindung erm\u00f6glicht es insgesamt, die Leistung und Skalierbarkeit Ihrer Webanwendungen besser zu bewerten.<\/p>\n<p>Ich schreibe diese Artikelreihe als Antwort auf die Fragen junger Entwickler, die gut informierte Systemarchitekten werden m\u00f6chten. Man kann die Methoden zur Optimierung von Linux-Anwendungen nicht klar verstehen, ohne in die Grundlagen einzutauchen und zu verstehen, wie sie auf Betriebssystemebene funktionieren. Obwohl es viele Arten von Anwendungen gibt, m\u00f6chte ich in diesem Zyklus Netzwerk-Anwendungen untersuchen und nicht Desktop-Anwendungen wie Browser oder Texteditoren. Dieses Material richtet sich an Entwickler und Architekten, die verstehen m\u00f6chten, wie Programme unter Linux oder Unix funktionieren und wie man sie f\u00fcr h\u00f6chste Leistung strukturiert.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux ist <i>ein Server-<\/i> Betriebssystem, und am h\u00e4ufigsten laufen Ihre Anwendungen genau auf diesem OS. Obwohl ich \u201eLinux\u201c sage, k\u00f6nnen Sie die meiste Zeit mit Sicherheit annehmen, dass alle Unix-\u00e4hnlichen Betriebssysteme im Allgemeinen gemeint sind. Ich habe den begleitenden Code allerdings nicht auf anderen Systemen getestet. Wenn Sie also an FreeBSD oder OpenBSD interessiert sind, k\u00f6nnen die Ergebnisse abweichen. Wenn ich etwas spezifisch f\u00fcr Linux ausprobiere, mache ich darauf aufmerksam.<\/p>\n<p>Obwohl Sie das Wissen nutzen k\u00f6nnen, um eine Anwendung von Grund auf neu zu erstellen, und diese hervorragend optimiert sein wird, ist es besser, dies zu vermeiden. Wenn Sie einen neuen Webserver in C oder C++ f\u00fcr die Gesch\u00e4ftsapplication Ihrer Organisation schreiben, k\u00f6nnte dies Ihr letzter Arbeitstag sein. Allerdings wird Ihnen das Verst\u00e4ndnis der Struktur dieser Anwendungen bei der Auswahl bereits existierender Software helfen. Sie k\u00f6nnen Systeme basierend auf Prozessen mit solchen auf Basis von Threads sowie Event-basierten Systemen vergleichen. Sie werden verstehen und nachvollziehen k\u00f6nnen, warum Nginx besser funktioniert als Apache httpd und warum eine Python-Anwendung auf Basis von Tornado mehr Benutzer bedienen kann als eine Python-Anwendung, die auf Django basiert.<\/p>\n<h1>ZeroHTTPd: Lernwerkzeug<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 ein Webserver, den ich von Grund auf in C als Lernwerkzeug geschrieben habe. Er hat keine externen Abh\u00e4ngigkeiten, einschlie\u00dflich des Zugriffs auf Redis. Wir f\u00fchren unsere eigenen Redis-Prozeduren aus. Weitere Informationen s. unten.<\/p>\n<p>Obwohl wir lange \u00fcber die Theorie diskutieren k\u00f6nnten, gibt es nichts Besseres, als Code zu schreiben, ihn auszuf\u00fchren und die verschiedenen Serverarchitekturen miteinander zu vergleichen. Das ist die anschaulichste Methode. Daher werden wir einen einfachen Webserver namens ZeroHTTPd erstellen, indem wir jedes Modell anwenden: auf der Basis von Prozessen, Threads und Ereignissen. Wir \u00fcberpr\u00fcfen jeden dieser Server und sehen, wie sie im Vergleich zueinander funktionieren. ZeroHTTPd ist in einer einzigen C-Datei implementiert. Der ereignisbasierte Server umfasst <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, eine hervorragende Implementierung einer Hash-Tabelle, die in einer einzigen Header-Datei bereitgestellt wird. Ansonsten gibt es keine Abh\u00e4ngigkeiten, um das Projekt nicht zu komplizieren.<\/p>\n<p>Der Code enth\u00e4lt zahlreiche Kommentare, die beim Verst\u00e4ndnis helfen. ZeroHTTPd, als einfacher Webserver und minimaler Rahmen f\u00fcr Webentwicklung, bietet grunds\u00e4tzlich eine eingeschr\u00e4nkte Funktionalit\u00e4t, kann jedoch statische Dateien sowie sehr einfache 'dynamische' Seiten ausgeben. Ich muss sagen, dass ZeroHTTPd sich gut f\u00fcr das Lernen eignet, wie man leistungsstarke Linux-Anwendungen erstellt. Im Grunde genommen warten die meisten Webdienste auf Anfragen, \u00fcberpr\u00fcfen diese und verarbeiten sie. Genau das wird ZeroHTTPd tun. Es ist ein Lernwerkzeug und kein Produktivsystem. Es ist nicht besonders gut im Fehlermanagement und kann kaum mit den besten Sicherheitspraktiken aufwarten (oh ja, ich habe strcpy verwendet) oder mit ausgekl\u00fcgelten Tricks der Programmiersprache C. Aber ich hoffe, dass es seinen Zweck gut erf\u00fcllt. <code>strcpy<\/code>) oder mit ausgekl\u00fcgelten Tricks der Programmiersprache C. Aber ich hoffe, dass es seinen Zweck gut erf\u00fcllt.<\/p>\n<p><img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Startseite von ZeroHTTPd. Es kann verschiedene Dateitypen ausgeben, einschlie\u00dflich Bilder.<\/i><\/p>\n<h1>G\u00e4stebuch-Anwendung<\/h1>\n<p>\nModerne Webanwendungen beschr\u00e4nken sich in der Regel nicht auf statische Dateien. Sie umfassen komplexe Interaktionen mit verschiedenen Datenbanken, Caches usw. Daher erstellen wir eine einfache Webanwendung mit dem Namen \u201eG\u00e4stebuch\u201c, in dem Besucher Eintr\u00e4ge unter ihrem Namen hinterlassen k\u00f6nnen. Im G\u00e4stebuch werden die zuvor hinterlassenen Eintr\u00e4ge gespeichert. Au\u00dferdem gibt es einen Besucherz\u00e4hler am unteren Rand der Seite.<\/p>\n<p><img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Webanwendung \u201eG\u00e4stebuch\u201c ZeroHTTPd<\/i><\/p>\n<p>Der Besucherz\u00e4hler und das G\u00e4stebuch werden in Redis gespeichert. F\u00fcr die Kommunikation mit Redis haben wir eigene Verfahren implementiert, die unabh\u00e4ngig von externen Bibliotheken sind. Ich bin kein gro\u00dfer Fan davon, selbstentwickelten Code einzuf\u00fchren, wenn es \u00f6ffentliche und gut getestete L\u00f6sungen gibt. Aber das Ziel von ZeroHTTPd ist, die Leistung von Linux und den Zugriff auf externe Dienste zu untersuchen, w\u00e4hrend die Bearbeitung von HTTP-Anfragen die Leistung erheblich beeinflusst. Wir m\u00fcssen die Kommunikation mit Redis in jeder unserer Serverarchitekturen vollst\u00e4ndig kontrollieren. In einer Architektur verwenden wir blockierende Aufrufe, in anderen ereignisbasierte Prozeduren. Die Verwendung einer externen Redis-Clientbibliothek w\u00fcrde uns nicht diesen Kontrollgrad bieten. Au\u00dferdem f\u00fchrt unser kleiner Redis-Client nur eine Handvoll Funktionen aus (Abrufen, Setzen und Erh\u00f6hen eines Schl\u00fcssels; Abrufen und Hinzuf\u00fcgen zu einem Array). Zudem ist das Redis-Protokoll au\u00dfergew\u00f6hnlich elegant und einfach. Man muss es nicht einmal speziell lernen. Die Tatsache, dass das gesamte Protokoll in etwa einhundert Zeilen Code implementiert ist, zeigt, wie durchdacht es ist.<\/p>\n<p>Im n\u00e4chsten Bild sind die Vorg\u00e4nge der Anwendung dargestellt, wenn ein Kunde (Browser) eine Anfrage stellt. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Funktionsweise der G\u00e4stebuch-Anwendung<\/i><\/p>\n<p>Wenn die G\u00e4stebuch-Seite ausgegeben werden soll, erfolgt ein Aufruf an das Dateisystem, um die Vorlage in den Speicher zu laden, sowie drei Netzwerkaufrufe an Redis. Die Vorlagendatei enth\u00e4lt den Gro\u00dfteil des HTML-Inhalts f\u00fcr die Seite im obigen Screenshot. Es gibt auch spezielle Platzhalter f\u00fcr den dynamischen Teil des Inhalts: Eintr\u00e4ge und die Besuchsz\u00e4hler. Wir holen diese von Redis, f\u00fcgen sie auf der Seite ein und liefern dem Kunden den vollst\u00e4ndig formatierten Inhalt. Der dritte Aufruf an Redis kann vermieden werden, da Redis beim Inkrementieren einen neuen Wert des Schl\u00fcssels zur\u00fcckgibt. Allerdings stellt eine Vielzahl von Netzwerkaufrufen f\u00fcr unseren auf Ereignissen basierenden asynchronen Server eine gute Herausforderung zu Lernzwecken dar. Daher lassen wir den zur\u00fcckgegebenen Wert von Redis \u00fcber die Anzahl der Besucher weg und fordern ihn in einem separaten Aufruf an.<\/p>\n<h1>Serverarchitekturen von ZeroHTTPd<\/h1>\n<p>\nWir erstellen sieben Versionen von ZeroHTTPd mit identischer Funktionalit\u00e4t, jedoch unterschiedlichen Architekturen:<\/p>\n<ul>\n<li>Iterativ\n<\/li>\n<li>Fork-Server (ein Kindprozess pro Anfrage)\n<\/li>\n<li>Pre-Fork-Server (vorbereitendes Forking der Prozesse)\n<\/li>\n<li>Server mit Ausf\u00fchrungsstr\u00f6men (ein Thread pro Anfrage)\n<\/li>\n<li>Server mit vorab erstellten Str\u00f6men\n<\/li>\n<li>Architektur basierend auf <code>poll()<\/code>\n<\/li>\n<li>Architektur basierend auf <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nWir messen die Leistung jeder Architektur, indem wir den Server mit HTTP-Anfragen belasten. Bei den Vergleichen von Architekturen mit hohem Parallelismus steigt die Anzahl der Anfragen. Wir testen dreimal und berechnen den Durchschnitt.<\/p>\n<h1>Testmethodologie<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Einrichtung f\u00fcr Lasttests von ZeroHTTPd<\/i> <\/p>\n<p>Es ist wichtig, dass bei der Durchf\u00fchrung der Tests nicht alle Komponenten auf einer einzigen Maschine laufen. In diesem Fall ergeben sich zus\u00e4tzliche Betriebssystemkosten durch das Scheduling, da die Komponenten um die CPU konkurrieren. Die Messung der Betriebssystemkosten mit jeder der ausgew\u00e4hlten Serverarchitekturen ist eines der Hauptziele dieser \u00dcbung. Das Hinzuf\u00fcgen weiterer Variablen kann den Prozess beeintr\u00e4chtigen. Folglich funktioniert die oben gezeigte Konfiguration am besten.<\/p>\n<h3>Was jeder dieser Server tut<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: hier starten wir <code>ab<\/code>, das Tool Apache Benchmark. Es erzeugt die notwendige Last, um unsere Serverarchitekturen zu testen.\n<\/li>\n<li>nginx.unixism.net: Manchmal m\u00f6chten wir mehr als eine Instanz des Serverprogramms betreiben. Dazu fungiert der Nginx-Server mit entsprechenden Einstellungen als Lastverteiler f\u00fcr die ankommenden Anfragen <i>ab<\/i> an unsere Serverprozesse.\n<\/li>\n<li>zerohttpd.unixism.net: Hier betreiben wir unsere Serverprogramme auf sieben verschiedenen Architekturen, allerdings jeweils nur eine zur selben Zeit.\n<\/li>\n<li>redis.unixism.net: Auf diesem Server l\u00e4uft der Redis-Daemon, in dem die Eintr\u00e4ge des G\u00e4stebuchs sowie der Besucherz\u00e4hler gespeichert werden.<\/li>\n<\/ul>\n<p>\nAlle Server arbeiten auf einem einzelnen Prozessorkern. Die Idee dahinter ist, die maximale Leistung jeder Architektur zu bewerten. Da alle Serverprogramme auf derselben Hardware getestet werden, ergibt sich hier ein Grundniveau f\u00fcr deren Vergleich. Mein Testaufbau besteht aus virtuellen Servern, die ich bei Digital Ocean angemietet habe.<\/p>\n<h3>Was messen wir?<\/h3>\n<p>\nEs k\u00f6nnen verschiedene Metriken gemessen werden. Wir bewerten die Leistung jeder Architektur in dieser Konfiguration, indem wir die Server mit Anfragen bei unterschiedlichen Parallelit\u00e4tsstufen belasten: die Last steigt von 20 bis zu 15.000 gleichzeitigen Benutzern.<\/p>\n<h1>Testergebnisse<\/h1>\n<p>\nDas folgende Diagramm zeigt die Leistung von Servern auf verschiedenen Architekturen bei unterschiedlichen Parallelit\u00e4tsstufen. Auf der y-Achse \u2013 Anfragen pro Sekunde, auf der x-Achse \u2013 parallele Verbindungen.<\/p>\n<p><img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Leistung von Netzwerkapplikationen unter Linux. Einf\u00fchrung\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNachfolgend eine Tabelle mit den Ergebnissen.<\/p>\n<p> Anfragen pro Sekunde <\/p>\n<p><strong>Parallelit\u00e4t<\/strong><br \/>\n<strong>iterativ<\/strong><br \/>\n<strong>Fork<\/strong><br \/>\n<strong>Pre-Fork<\/strong><br \/>\n<strong>Threading<\/strong><br \/>\n<strong>Pre-Threading<\/strong><br \/>\n<strong>Poll<\/strong><br \/>\n<strong>epoll<\/strong><\/p>\n<p>20<br \/>\n7<br \/>\n112<br \/>\n2100<br \/>\n1800<br \/>\n2250<br \/>\n1900<br \/>\n2050<\/p>\n<p>50<br \/>\n7<br \/>\n190<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2000<br \/>\n2000<\/p>\n<p>100<br \/>\n7<br \/>\n245<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2150<br \/>\n2100<\/p>\n<p>200<br \/>\n7<br \/>\n330<br \/>\n2300<br \/>\n1750<br \/>\n2300<br \/>\n2200<br \/>\n2100<\/p>\n<p>300<br \/>\n\u2013<br \/>\n380<br \/>\n2200<br \/>\n1800<br \/>\n2400<br \/>\n2250<br \/>\n2150<\/p>\n<p>400<br \/>\n\u2013<br \/>\n410<br \/>\n2200<br \/>\n1750<br \/>\n2600<br \/>\n2000<br \/>\n2000<\/p>\n<p>500<br \/>\n\u2013<br \/>\n440<br \/>\n2300<br \/>\n1850<br \/>\n2700<br \/>\n1900<br \/>\n2212<\/p>\n<p>600<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1800<br \/>\n2500<br \/>\n1700<br \/>\n2519<\/p>\n<p>700<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2490<br \/>\n1550<br \/>\n2607<\/p>\n<p>800<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2540<br \/>\n1400<br \/>\n2553<\/p>\n<p>900<br \/>\n\u2013<br \/>\n460<br \/>\n2300<br \/>\n1600<br \/>\n2472<br \/>\n1200<br \/>\n2567<\/p>\n<p>1000<br \/>\n\u2013<br \/>\n475<br \/>\n2300<br \/>\n1700<br \/>\n2485<br \/>\n1150<br \/>\n2439<\/p>\n<p>1500<br \/>\n\u2013<br \/>\n490<br \/>\n2400<br \/>\n1550<br \/>\n2620<br \/>\n900<br \/>\n2479<\/p>\n<p>2000<br \/>\n\u2013<br \/>\n350<br \/>\n2400<br \/>\n1400<br \/>\n2396<br \/>\n550<br \/>\n2200<\/p>\n<p>2500<br \/>\n\u2013<br \/>\n280<br \/>\n2100<br \/>\n1300<br \/>\n2453<br \/>\n490<br \/>\n2262<\/p>\n<p>3000<br \/>\n\u2013<br \/>\n280<br \/>\n1900<br \/>\n1250<br \/>\n2502<br \/>\ngro\u00dfe Streuung<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\ngro\u00dfe Streuung<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\ngro\u00dfe Streuung<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\ngro\u00dfe Streuung<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>\nAus dem Diagramm und der Tabelle geht hervor, dass bei mehr als 8000 gleichzeitigen Anfragen nur zwei Architekturen konkurrenzf\u00e4hig bleiben: Pre-Fork und Epoll. Mit zunehmender Last schneidet der Poll-Server schlechter ab als der Threading-Server. Die Architektur mit vorab erstellten Threads konkurriert auf hohem Niveau mit Epoll: Das belegt, wie gut der Linux-Kernel eine gro\u00dfe Anzahl an Threads verwalten kann.<\/p>\n<h1>Der Quellcode von ZeroHTTPd<\/h1>\n<p>\nDer Quellcode von ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">hier<\/a><\/noindex>. F\u00fcr jede Architektur gibt es ein eigenes Verzeichnis.<\/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>\nNeben den sieben Verzeichnissen f\u00fcr alle Architekturen gibt es im oberen Verzeichnis zwei weitere: public und templates. Im ersten Verzeichnis befindet sich die Datei index.html sowie das Bild vom ersten Screenshot. Hier k\u00f6nnen andere Dateien und Ordner abgelegt werden, und ZeroHTTPd sollte diese statischen Dateien problemlos ausgeben. Wenn der Pfad im Browser mit dem Pfad im public-Ordner \u00fcbereinstimmt, sucht ZeroHTTPd in diesem Verzeichnis nach der Datei index.html. Der Inhalt f\u00fcr das G\u00e4stebuch wird dynamisch generiert. Es gibt nur die Hauptseite, deren Inhalt auf der Datei 'templates\/guestbook\/index.html' basiert. ZeroHTTPd l\u00e4sst sich problemlos um dynamische Seiten erweitern. Die Idee besteht darin, dass Benutzer in diesem Verzeichnis Vorlagen hinzuf\u00fcgen und ZeroHTTPd nach Bedarf erweitern k\u00f6nnen.<\/p>\n<p>Um alle sieben Server zu erstellen, starten Sie <code>make all<\/code> aus dem Hauptverzeichnis \u2013 und alle Builds erscheinen in diesem Verzeichnis. Die ausf\u00fchrbaren Dateien suchen die Verzeichnisse public und templates in dem Verzeichnis, aus dem sie gestartet werden.<\/p>\n<h1>Linux API<\/h1>\n<p>\nUm die Informationen in diesem Artikelzyklus zu verstehen, ist es nicht notwendig, sich gut im Linux API auszukennen. Ich empfehle jedoch, mehr zu diesem Thema zu lesen, da es viele Ressourcen im Internet gibt. Obwohl wir einige Kategorien des Linux API ansprechen werden, liegt unser Fokus haupts\u00e4chlich auf Prozessen, Threads, Ereignissen und dem Netzwerk-Stack. Neben B\u00fcchern und Artikeln \u00fcber das Linux API empfehle ich auch, die Man-Pages f\u00fcr Systemaufrufe und verwendete Bibliotheksfunktionen zu lesen.<\/p>\n<h1>Leistung und Skalierbarkeit<\/h1>\n<p>\nEine Anmerkung zur Performance und Skalierbarkeit. Theoretisch gibt es keinen direkten Zusammenhang zwischen den beiden. Sie k\u00f6nnen einen Webdienst haben, der sehr gut funktioniert, mit Reaktionszeiten von wenigen Millisekunden, aber nicht skalierbar ist. genauso kann es eine schlecht funktionierende Webanwendung geben, die mehrere Sekunden f\u00fcr eine Antwort ben\u00f6tigt, aber in der Lage ist, auf Hunderte zu skalieren, um Zehntausende von gleichzeitigen Benutzern zu bedienen. Dennoch ist die Kombination aus hoher Performance und Skalierbarkeit eine sehr starke Kombination. Hochleistungsanwendungen nutzen im Allgemeinen Ressourcen effizient, was bedeutet, dass sie mehr gleichzeitige Benutzer auf einem Server bedienen k\u00f6nnen und so die Kosten senken.<\/p>\n<h1>CPU- und I\/O-Aufgaben<\/h1>\n<p>\nBei Berechnungen gibt es zwei grundlegende Arten von Aufgaben: I\/O und CPU. Anfragen \u00fcber das Internet (Netzwerk-I\/O), Dateiverwaltung (Netzwerk- und Festplattendatenverarbeitung) sowie Datenbankkommunikation (Netzwerk- und Festplattendatenverarbeitung) z\u00e4hlen zu den I\/O-Aktivit\u00e4ten. Einige Datenbankanfragen k\u00f6nnen die CPU geringf\u00fcgig belasten (zum Beispiel Sortierung, Berechnung des Durchschnitts von Millionen von Ergebnissen usw.). Die meisten Webanwendungen sind in Bezug auf das maximal m\u00f6gliche I\/O eingeschr\u00e4nkt, w\u00e4hrend die CPU selten voll ausgelastet wird. Wenn Sie bei einer I\/O-Aufgabe feststellen, dass viel CPU verwendet wird, deutet das oft auf eine ineffiziente Architektur der Anwendung hin. Dies kann darauf hindeuten, dass CPU-Ressourcen f\u00fcr Prozessmanagement und Kontextwechsel verwendet werden \u2013 was nicht besonders vorteilhaft ist. Wenn Sie jedoch etwas wie Bildbearbeitung, Audioverarbeitung oder maschinelles Lernen durchf\u00fchren, ben\u00f6tigt die Anwendung leistungsstarke CPU-Ressourcen. Aber f\u00fcr die meisten Anwendungen ist das nicht der Fall.<\/p>\n<h1>Weitere Informationen zu Serverarchitekturen<\/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\/\">Teil I. Iterative Architektur<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Teil II. Fork-Server<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Teil III. Pre-Fork-Server<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Teil IV. Server mit Ausf\u00fchrungsstr\u00f6men<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Teil V. Server mit vorab erstellten Str\u00f6men<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Teil VI. Architektur basierend auf Poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Teil VII. Architektur basierend auf Epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Quelle: <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.0.1 - 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. \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\" \/>\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\/de\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47 Leistung von Netzwerk-Anwendungen unter Linux. Einf\u00fchrung | ProHoster","description":"Webanwendungen sind heutzutage weit verbreitet, und unter allen Transportprotokollen ist HTTP am dominantesten. Bei der Untersuchung der Nuancen der Webanwendungsentwicklung wird der zugrunde liegenden Betriebssystemumgebung oft wenig Beachtung geschenkt. Die Trennung zwischen Entwicklung (Dev) und Betrieb (Ops) hat die Situation nur versch\u00e4rft. Doch mit der Verbreitung der DevOps-Kultur \u00fcbernehmen Entwickler zunehmend die Verantwortung f\u00fcr das Hosten ihrer Anwendungen in der Cloud, weshalb f\u00fcr","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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. \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","og:url":"https:\/\/prohoster.info\/de\/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\/de\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}