Hey, da ich der Autor dieses Zitats bin, werde ich antworten :-)
Auf großen Websites gibt es zwei große Probleme: gleichzeitige Verbindungen und Latenz. Die gleichzeitige Verbindung wird durch langsame Clients verursacht, deren Herunterladen einige Zeit in Anspruch nimmt, und durch inaktive Verbindungsstatus. Diese Leerlaufverbindungszustände werden durch die Wiederverwendung der Verbindung zum Abrufen mehrerer Objekte verursacht, die als Keep-Alive bezeichnet wird, was durch die Latenz weiter erhöht wird. Wenn sich der Client sehr nahe am Server befindet, kann er die Verbindung intensiv nutzen und sicherstellen, dass sie fast nie inaktiv ist. Wenn die Sequenz endet, kümmert sich niemand darum, den Kanal schnell zu schließen, und die Verbindung bleibt lange Zeit offen und unbenutzt. Dies ist der Grund, warum viele Leute vorschlagen, ein sehr geringes Keep-Alive-Timeout zu verwenden. Auf einigen Servern wie Apache beträgt das niedrigste Zeitlimit, das Sie festlegen können, eine Sekunde, und es ist oft viel zu viel, um hohe Lasten aufrechtzuerhalten: Wenn Sie 20000 Clients vor sich haben und diese durchschnittlich ein Objekt pro Sekunde abrufen, werden diese 20000 Verbindungen dauerhaft hergestellt. 20000 gleichzeitige Verbindungen auf einem Allzweckserver wie Apache sind riesig, erfordern je nach geladenen Modulen zwischen 32 und 64 GB RAM, und Sie können wahrscheinlich nicht hoffen, selbst durch Hinzufügen von RAM viel höher zu werden. In der Praxis werden bei 20000 Clients möglicherweise sogar 40000 bis 60000 gleichzeitige Verbindungen auf dem Server angezeigt, da Browser versuchen, 2 bis 3 Verbindungen einzurichten, wenn sie viele abzurufende Objekte haben. und Sie können wahrscheinlich nicht hoffen, viel höher zu gehen, selbst wenn Sie RAM hinzufügen. In der Praxis werden bei 20000 Clients möglicherweise sogar 40000 bis 60000 gleichzeitige Verbindungen auf dem Server angezeigt, da Browser versuchen, 2 bis 3 Verbindungen einzurichten, wenn sie viele abzurufende Objekte haben. und Sie können wahrscheinlich nicht hoffen, viel höher zu gehen, selbst wenn Sie RAM hinzufügen. In der Praxis werden bei 20000 Clients möglicherweise sogar 40000 bis 60000 gleichzeitige Verbindungen auf dem Server angezeigt, da Browser versuchen, 2 bis 3 Verbindungen einzurichten, wenn sie viele abzurufende Objekte haben.
Wenn Sie die Verbindung nach jedem Objekt schließen, sinkt die Anzahl der gleichzeitigen Verbindungen drastisch. In der Tat sinkt es um einen Faktor, der der durchschnittlichen Zeit zum Herunterladen eines Objekts bis zur Zeit zwischen Objekten entspricht. Wenn Sie zum Herunterladen eines Objekts (eines Miniaturfotos, einer Schaltfläche usw.) 50 ms benötigen und wie oben durchschnittlich 1 Objekt pro Sekunde herunterladen, haben Sie nur 0,05 Verbindungen pro Client, was nur 1000 entspricht gleichzeitige Verbindungen für 20000 Clients.
Jetzt zählt die Zeit, um neue Verbindungen herzustellen. Bei weit entfernten Clients tritt eine unangenehme Latenz auf. In der Vergangenheit verwendeten Browser große Mengen gleichzeitiger Verbindungen, wenn Keep-Alive deaktiviert war. Ich erinnere mich an Zahlen von 4 auf MSIE und 8 auf Netscape. Dies hätte die durchschnittliche Latenz pro Objekt wirklich durch so viel geteilt. Jetzt, da Keep-Alive überall vorhanden ist, sehen wir keine so hohen Zahlen mehr, da dies die Belastung der Remote-Server weiter erhöht und Browser den Schutz der Internetinfrastruktur gewährleisten.
Dies bedeutet, dass es mit heutigen Browsern schwieriger ist, die Nicht-Keep-Alive-Dienste so reaktionsschnell zu machen wie die Keep-Alive-Dienste. Einige Browser (z. B. Opera) verwenden Heuristiken, um Pipelinining zu verwenden. Pipelining ist eine effiziente Methode zur Verwendung von Keep-Alive, da es die Latenz nahezu eliminiert, indem mehrere Anforderungen gesendet werden, ohne auf eine Antwort zu warten. Ich habe es auf einer Seite mit 100 kleinen Fotos versucht, und der erste Zugriff ist ungefähr doppelt so schnell wie ohne Keep-Alive, aber der nächste Zugriff ist ungefähr achtmal so schnell, da die Antworten so klein sind, dass nur die Latenz zählt (nur) "304" Antworten).
Ich würde sagen, dass wir im Idealfall einige Tunables in den Browsern haben sollten, damit sie die Verbindungen zwischen abgerufenen Objekten am Leben erhalten und sie sofort löschen, wenn die Seite vollständig ist. Aber das sehen wir leider nicht.
Aus diesem Grund müssen einige Sites, die Allzweckserver wie Apache auf der Vorderseite installieren müssen und die eine große Anzahl von Clients unterstützen müssen, im Allgemeinen die Keep-Alive-Funktion deaktivieren. Um Browser zu zwingen, die Anzahl der Verbindungen zu erhöhen, verwenden sie mehrere Domainnamen, damit Downloads parallelisiert werden können. Dies ist besonders problematisch auf Websites, die SSL intensiv nutzen, da der Verbindungsaufbau noch höher ist, da es einen zusätzlichen Roundtrip gibt.
Was heutzutage häufiger beobachtet wird, ist, dass solche Sites Light-Frontends wie Haproxy oder Nginx bevorzugen, die problemlos Zehntausende von gleichzeitigen Verbindungen verarbeiten können. Sie ermöglichen es, auf der Clientseite am Leben zu bleiben und sie auf der Clientseite zu deaktivieren Apache Seite. Auf dieser Seite sind die Kosten für den Verbindungsaufbau in Bezug auf die CPU nahezu null und in Bezug auf die Zeit überhaupt nicht spürbar. Auf diese Weise bietet dies das Beste aus beiden Welten: geringe Latenz aufgrund von Keep-Alive mit sehr geringen Zeitüberschreitungen auf der Clientseite und geringe Anzahl von Verbindungen auf der Serverseite. Alle sind glücklich :-)
Einige kommerzielle Produkte verbessern dies weiter, indem sie Verbindungen zwischen dem Frontload-Balancer und dem Server wiederverwenden und alle Client-Verbindungen über diese multiplexen. Wenn sich die Server in der Nähe der LB befinden, ist der Gewinn nicht viel höher als bei der vorherigen Lösung, erfordert jedoch häufig Anpassungen an der Anwendung, um sicherzustellen, dass aufgrund der unerwarteten gemeinsamen Nutzung einer Verbindung zwischen mehreren Benutzern kein Risiko für Sitzungskreuzungen zwischen Benutzern besteht . Theoretisch sollte dies niemals passieren. Die Realität sieht anders aus :-)