Motivation


... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ node.js ] ... [ << Inhaltsverzeichnis ] ... [ Konzepte & Funktionalitäten >> ] ...

Aufgrund ständig steigender Nutzerzahlen im Internet und der damit einhergehenden ständig steigenden Belastung der Webserver gibt es zwei kritische Punkte im Design aktuell vorherschender (Web-)Server, die tatsächlich hochperformanten Servern im Wege stehen.

Concurrency

Unter dem Begriff Concurrency, also Nebenläufigkeit, versteht man im Zusammenhang mit Servern die Fähigkeit viele Anfragen an einen Server gleichzeitig beantworten zu können. Wenn man eine Verbindung zu einem Apache Webserver, dem aktuellen Marktführer für Webserver, aufbaut wird ein neuer Thread für diese Anfrage erstellt. Das erstellen eines neuen Threads ist allerdings eine sehr teure Operation, insbesondere wenn es nicht nur darum geht einen sondern z.B. 1000 Threads zu erstellen. Der Apache Webserver löst dieses Problem mit einem sogenannten Prefork-Mechanismus, bei dem initial und anschliessend schrittweise eine definierte Anzahl neuer Threads prophylaktisch erstellt wird. Leider ist auch der Speicherbedarf von Threads nicht unerheblich und steigt kontinuierlich mit der Anzahl der eingehenden Anfragen an den Server. Der Apache Webserver ist also nur bedingt dazu geeignet eine große Anzahl an Nutzern gleichzeitg zu bedienen, weshalb im Apache-Umfeld Lösungen wie Load-Balancing üblich sind.
Ein anderer Webserver ist NGINX, der im Gegensatz zu Apache auf einen sogeannten Event-Loop setzt. Hierbei werden für eingehende Anfragen keine neuen Threads mehr erstellt, die Abwicklung der Anfragen erfolgt ausschliesslich in dem Event Loop. Hierdurch lässt sich der Speicherverbrauch gering halten und ermöglicht somit auch eine hohe Anzahl gleichzeitiger Nutzer zu bedienen.

I/O Latency

Die zweite Schwachstelle aktueller Server ist, dass diese blocking I/O einsetzen. Dies bedeutet, dass solange irgendeine Art von I/O stattfindet, der aktuelle Vorgang angehalten und keine weitere, evtl. unabhängige Berechnung ausgeführt wird, bis die I/O Operation abgeschlossen ist. Dies kann bei Zufgriff auf das Dateisystem oder noch schlimmer, auf ein Gerät im Netzwerk durchaus 10 bis 100+ Millisekunden dauern.
Zugriffszeiten auf verschiedene Geräte, gemessen in CPU-Zyklen

Wie man sieht ist I/O solange unproblematisch, solange nicht auf die Festplatte oder das Netzwerk zugegriffen werden muss. Allerdings werden heute schon und in Zukunft vermehrt Ressourcen im Netzwerk als Datenquellen für eigene Applikationen genutzt werden, so dass das blocking I/O Problem sich verschärfen dürfte.


... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ node.js ] ... [ << Inhaltsverzeichnis ] ... [ << Konzepte & Funktionalitäten ] ...