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.
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.
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