Gleichzeitige Verbindungen
Bei geringer Last können Proxys zuverlässig funktionieren, aber Fehler liefern, sobald mehr Worker oder Programme gleichzeitig laufen. Eine mögliche Ursache ist die Überschreitung der erlaubten Anzahl gleichzeitiger Verbindungen.
Diese Grenze gehört zu den Nutzungslimits bei Proxys. Um zu verstehen, was sie steuert und warum sie erreicht wird, müssen wir zunächst erklären, was eine Netzwerkverbindung ist und wie sie über einen Proxy funktioniert.
Was eine Verbindung ist und wie sie funktioniert
Eine Netzwerkverbindung ist ein Kommunikationskanal, den zwei Programme zum Datenaustausch aufbauen. Ein Browser verbindet sich beispielsweise mit einem Webserver, um eine Seite anzufordern und ihren Inhalt zu empfangen. Die Verbindung stellt den Übertragungsweg bereit; Anfrage und Antwort sind Nachrichten, die darüber gesendet werden.
Betrachten wir eine herkömmliche TCP-Verbindung. Die Anwendung kontaktiert die IP-Adresse des Servers und den Port des benötigten Dienstes. Beide Seiten tauschen Steuernachrichten aus, um die Verbindung aufzubauen. Anschließend werden Daten in kleinen Einheiten, den Paketen, übertragen. TCP überwacht die Zustellung, veranlasst die erneute Übertragung verlorener Daten und stellt dem Empfänger die Daten in der richtigen Reihenfolge bereit. Solange die Verbindung besteht, halten beide Seiten Informationen über den Austausch vor.
Bei einem herkömmlichen TCP-Proxy verbindet sich die Anwendung zunächst mit dem Proxyserver. Dieser baut eine separate Verbindung zur Zielwebsite auf und leitet Daten in beide Richtungen zwischen den beiden Verbindungen weiter. Er unterhält somit die Kommunikation mit dem Client und mit dem Ziel.
Die Anwendung kann eine Anfrage senden, eine Antwort empfangen und die bestehende Verbindung für einen weiteren Austausch nutzen. Der Empfang einer Seite schließt die Verbindung beispielsweise nicht zwangsläufig: Der Browser kann sie für weitere Anfragen an den Server offen halten. Wird sie nicht mehr benötigt, schließt eine Seite die Verbindung; auch ein Fehler oder Timeout kann sie beenden. Bis dahin kann eine Verbindung bestehen, ohne ständig Daten zu übertragen.
Ein Programm kann mehrere solcher Verbindungen gleichzeitig unterhalten: über eine Daten empfangen, auf einer anderen auf eine Antwort warten und eine dritte für eine spätere Anfrage bereithalten. Das sind gleichzeitige Verbindungen. Ihre Anzahl beschreibt die gerade offenen Kommunikationskanäle und nicht die Gesamtzahl aller Anfragen seit dem Programmstart.
Was das Limit misst
Eine offene Verbindung belegt einen Platz im betreffenden Kontingent. Sobald sie geschlossen ist und der Dienst sie aus dem Zähler entfernt, wird dieser Platz wieder frei. Das Limit betrifft die aktuelle Aktivität; sein Erreichen verbraucht daher kein monatliches Verbindungsguthaben.
Wie Verbindungen auf das Kundenkontingent angerechnet werden, ist eine separate Dienstregel. Die beiden Verbindungsabschnitte am Proxy verbrauchen nicht automatisch zwei Kontingenteinheiten.
Anbieter setzen solche Limits, weil offene Verbindungen auch bei geringer Datenübertragung Serverressourcen beanspruchen. Eine Verbindung, die auf eine Antwort wartet, muss weiterhin verwaltet werden. Die Begrenzung hilft dem Dienst, ausreichend Kapazität für die zugesagten Arbeitslasten bereitzuhalten.
Für denselben Dienst können verschiedene Limits gelten:
| Limit | Was es steuert |
|---|---|
| Gleichzeitige Verbindungen | Wie viele Verbindungen gleichzeitig offen bleiben dürfen |
| Gleichzeitige Anfragen | Wie viele Anfragen gleichzeitig bearbeitet werden dürfen |
| Anfragen pro Sekunde | Wie häufig Anfragen gesendet oder verarbeitet werden dürfen |
| Übertragungsgeschwindigkeit | Wie viele Daten pro Sekunde übertragen werden können |
| Traffic-Kontingent | Wie viele Daten innerhalb eines Abrechnungszeitraums übertragen werden dürfen |
Unbegrenzter Traffic sagt somit nichts über die Anzahl gleichzeitiger Verbindungen aus. Zusätzlich kann die Geschwindigkeit begrenzt sein, mit der neue Verbindungen geöffnet werden. Schnelles Öffnen und Schließen kann dieses Limit erreichen, obwohl zu jedem Zeitpunkt nur wenige Verbindungen offen sind.
Warum Thread- und Verbindungszahlen nicht übereinstimmen
Die Anzahl der Threads oder Worker beschreibt, wie eine Anwendung Aufgaben organisiert. Sie zeigt nicht zuverlässig, wie viele Verbindungen der Proxy zählt. Eine Aufgabe kann mehrere Server kontaktieren, und ein asynchrones Skript kann viele Netzwerkvorgänge verwalten, ohne für jeden einen eigenen Betriebssystemthread anzulegen.
Auch benötigt nicht jede HTTP-Anfrage eine neue Verbindung. Ein Client kann eine bestehende Verbindung wiederverwenden; HTTP/2 kann mehrere Anfragen gleichzeitig über eine Verbindung übertragen. Anfrage- und Verbindungszahl sind deshalb unterschiedliche Größen.
Auch die Begriffe des Anbieters sind wichtig. Ein als „Threads“ oder „Sessions“ bezeichnetes Limit kann offene Verbindungen oder gerade bearbeitete Anfragen meinen. Eine Sticky Session, die für zusammengehörige Anfragen dieselbe Proxy-IP beibehält, entspricht nicht zwangsläufig einer einzelnen Netzwerkverbindung. Maßgeblich ist, was der Dienst tatsächlich zählt.
Welche Programme teilen sich das Kontingent?
Ein Limit kann für ein Konto, ein gekauftes Paket, eine einzelne Proxy-IP oder ein bestimmtes Gateway gelten. Bei einem Konto- oder Paketlimit müssen Sie die Verbindungen aller Programme und Geräte addieren, die dieses Kontingent nutzen. Die Aufteilung einer IP-Liste auf mehrere Computer schafft kein eigenes Kontingent pro Computer.
Bei einem Limit pro IP ist die Verteilung anders: Eine stark genutzte Adresse kann ihre Grenze erreichen, während eine andere noch freie Kapazität hat. Ein Teil der Vorgänge kann auf die zweite Adresse verlagert werden, sofern der Dienst nicht zusätzlich ein niedrigeres gemeinsames Limit setzt. Ein Paket kann sowohl ein Gesamtkontingent als auch kleinere Zuteilungen für einzelne Nutzer oder Client-IP-Adressen haben.
Die Anzahl der zur Authentifizierung zugelassenen Client-IP-Adressen ist eine andere Einstellung. Sie legt fest, welche Netzwerke auf die Proxys zugreifen dürfen, nicht wie viele Verbindungen diese öffnen können. Mehrere Geräte hinter einer öffentlichen IP können sowohl dieselbe Zugangsregel als auch das daran gebundene Verbindungskontingent teilen.
Ein Wechsel der Proxy-IP, die eine Website sieht, setzt ein kontoweites Verbindungskontingent nicht zurück. Auch ein anderer Sticky-Session-Name oder ein Protokollwechsel schafft nicht automatisch zusätzliche Kapazität. Das Limit bleibt an das Konto, das Paket oder den Endpunkt gebunden, den der Anbieter für die Zählung verwendet.
Warum sich Verbindungen ansammeln
Verbindungen sammeln sich an, wenn neue schneller geöffnet als bestehende geschlossen werden. Das kann beim parallelen Laden von Seiten, Herunterladen von Dateien oder anderen Netzwerkaufgaben passieren: Einige Verbindungen übertragen noch Daten oder warten auf eine Antwort, während die Anwendung weitere öffnet. Diese Verbindungen werden gleichzeitig gezählt und können zusammen das Proxy-Verbindungslimit ausschöpfen.
Langsame Antworten halten Verbindungen länger belegt. Startet ein Programm im gleichen Tempo neue Vorgänge, sammeln sich unerledigte Aufgaben an. Hält es stattdessen die Parallelität konstant, werden bei einer langsameren Website meist weniger Aufgaben pro Minute abgeschlossen. Beides kann ohne Änderung des Proxypakets auftreten.
Lange Downloads und Verbindungen, die auf einen Timeout warten, können denselben Effekt haben. Viele offene Verbindungen können deshalb mit einer niedrigen Übertragungsgeschwindigkeit einhergehen: Ein Großteil der Zeit entfällt auf Warten statt auf Datenübertragung.
Manche Verbindungen bleiben zwischen Anfragen absichtlich offen. Das wird üblicherweise Keep-Alive genannt. Es vermeidet den wiederholten Verbindungsaufbau, aber eine ungenutzte Verbindung kann weiterhin einen Platz belegen, wenn der Dienst offene Verbindungen zählt. Eine an den Verbindungspool der Anwendung zurückgegebene Verbindung steht zur Wiederverwendung bereit; am Proxy wurde sie nicht zwangsläufig geschlossen.
Ein anderes Problem ist eine fehlerhafte Freigabe von Verbindungen. Das kann sowohl fertige Software als auch eigene Skripte betreffen. Beispielsweise beginnt Code, eine Antwort zu lesen, stößt auf einen Fehler und startet eine weitere Anfrage, ohne die vorherige Antwort vollständig zu verarbeiten oder zu schließen. Werden fortlaufend neue Verbindungen geöffnet, während alte belegt bleiben, kann die Anwendung ihr Kontingent erschöpfen, ohne mehr nützliche Arbeit zu leisten. Prüfen Sie die Freigabe deshalb auch nach Fehlern und Abbrüchen, nicht nur nach erfolgreichen Anfragen.
Eine korrekte Freigabe ermöglicht es dem Client, eine geeignete Verbindung wiederzuverwenden oder eine nicht mehr benötigte zu schließen. Timeouts verhindern, dass aufgegebene Vorgänge unbegrenzt warten. Die Wiederverwendung überall abzuschalten ist keine allgemeine Lösung: Das erzeugt zusätzlichen Verbindungsaufwand und kann die Rate neuer Verbindungen erhöhen. Ziel ist eine kontrollierte Anzahl wiederverwendbarer Verbindungen, während unnötige korrekt freigegeben oder geschlossen werden.
Warum die Proxys erst funktionieren, dann ausfallen und wieder funktionieren
Wechselnde Fehler unter Last sind ein Anlass, das Verbindungslimit früh zu prüfen. Einige Proxyadressen scheinen zu funktionieren, andere nicht; kurz darauf ändert sich das Muster. Aus Sicht der Anwendung kann es so aussehen, als würden immer andere Teile der Proxyliste ausfallen.
Eine Erklärung ist ein ausgeschöpftes gemeinsames Kontingent. Bestehende Verbindungen können weiterlaufen, während neue Verbindungsversuche abgelehnt werden oder warten. Sobald ältere Verbindungen schließen, kommen einige neue Versuche durch. Andere scheitern, wenn die freien Plätze wieder belegt sind. Das wechselnde Ergebnis entsteht durch den Wettbewerb um dasselbe Kontingent und nicht durch eine feste Gruppe defekter IP-Adressen.
Dieses Verhalten wird manchmal als Drosselung bezeichnet. Hier betrifft die Einschränkung die Zulassung neuer Verbindungen; sie verringert nicht zwangsläufig die Geschwindigkeit jeder bestehenden Verbindung. Die genaue Reaktion hängt vom Dienst ab: Er kann eine eindeutige Limitmeldung senden, eine Verbindung ablehnen oder den Client in einen Timeout laufen lassen. Eine Warteschlange ist nicht garantiert.
Vergleichen Sie zur Prüfung die Fehler mit der Verbindungszahl und reduzieren Sie vorübergehend die Parallelität aller Programme, die das Kontingent teilen. Verschwinden die Fehler unterhalb des Limits und kehren beim erneuten Ausschöpfen zurück, ist das Verbindungslimit eine wahrscheinliche Ursache. Ähnliche Unterbrechungen können aber auch vom Ziel oder Netzwerk stammen. Ein Timeout oder eine HTTP-Antwort 429, 502 oder 503 allein beweist keine Überschreitung des Proxy-Verbindungslimits; Herkunft und Wortlaut des Fehlers sind entscheidend.
Nützliche Arbeit innerhalb des Limits halten
Beginnen Sie mit den tatsächlichen Websites und Vorgängen Ihrer Software. Steigern Sie die Parallelität schrittweise und beobachten Sie erfolgreiche Ergebnisse, Antwortzeiten und Verbindungsspitzen. Ein kurzer Test mit einer schnellen Seite bildet einen vollständigen Durchlauf mit Anmeldungen, großen Antworten und langsameren Endpunkten möglicherweise nicht ab.
- Geben Sie allen Programmen ein gemeinsames Verbindungsbudget. Lassen Sie Reserve für andere Aktivitäten und kurze Spitzen. Nutzen mehrere Prozesse dasselbe Paket, kann die Einstellung jedes einzelnen Prozesses auf das volle Paketkontingent den Dienst beim gemeinsamen Betrieb überlasten.
- Steuern Sie Aufgaben und Verbindungen. Ein Verbindungspool hält Verbindungen zur Wiederverwendung bereit. Prüfen Sie, ob seine Größenangabe eine feste Obergrenze ist oder nur die Anzahl der anschließend aufbewahrten Verbindungen beschreibt; manche Clients öffnen zusätzliche Verbindungen, solange kein Wartemodus aktiviert ist. Behalten Sie die Freigabe von Antworten und Timeouts auch bei fehlgeschlagenen Aufgaben bei.
- Verteilen Sie Starts und Wiederholungsversuche zeitlich. Alle Browser gleichzeitig zu starten oder jede fehlgeschlagene Anfrage sofort zu wiederholen erzeugt eine weitere Spitze. Begrenzen Sie die Anzahl der Wiederholungen, erhöhen Sie die Wartezeiten schrittweise und berücksichtigen Sie die Versuche im selben Arbeitsbudget. Ein Timeout beweist außerdem nicht, dass eine gesendete Aktion fehlgeschlagen ist; Käufe oder Änderungen müssen daher mit Bedacht wiederholt werden.
- Messen Sie abgeschlossene Arbeit. Mehr Worker sind nur sinnvoll, solange sie den erfolgreichen Durchsatz erhöhen. Wenn sie vor allem Wartezeiten und Fehler erzeugen, kann eine niedrigere Einstellung dieselbe Aufgabe schneller abschließen. Mittelt ein Dashboard die Aktivität über längere Zeit, sind kurze Spitzen dort möglicherweise schlechter erkennbar als anhand der Fehlerzeitstempel der Anwendung.
Bei Browseraufgaben kann auch das Vermeiden unnötiger Downloads die Netzaktivität senken. Das Blockieren von Bildern oder Videos kann helfen, wenn die Aufgabe sie nicht benötigt; das Entfernen von Skripten kann die Funktion selbst beeinträchtigen. Beurteilen Sie die Änderung danach, ob die beabsichtigte Aufgabe weiterhin korrekt abgeschlossen wird.
Wann ein höheres Limit hilft
Mehr Verbindungskapazität ist sinnvoll, wenn die Anwendung ihre Verbindungen korrekt verwaltet und die benötigte Arbeitslast regelmäßig die Grenze des Anbieters erreicht. Dadurch können mehr Aufgaben gleichzeitig laufen, ohne um dasselbe kleine Kontingent zu konkurrieren.
Der Kauf muss genau das Limit erhöhen, das tatsächlich erreicht wird. Zusätzliche IP-Adressen können bei einem Limit pro IP helfen, wenn die Arbeit darauf verteilt wird. Bei einem gemeinsamen Paketlimit muss das neue Paket oder Zusatzkontingent diese gemeinsame Grenze erhöhen. Eine größere IP-Anzahl allein beweist das nicht.
Es gibt weitere Grenzen. Der Client kann einen kleineren Pool haben, dem Computer können Netzwerkressourcen fehlen oder das Ziel kann Anfragen begrenzen. Auch eine einzelne Mobilfunkverbindung hat unabhängig von der Zahl erlaubter Proxyverbindungen ihre eigene verfügbare Bandbreite. Mehr Parallelität beseitigt diese Grenzen nicht und repariert kein Skript, das fortlaufend Verbindungen verliert.
Das praktische Ziel ist ausreichend Platz für die üblichen Lastspitzen bei einer niedrigen Fehlerquote. Danach kann zusätzliches Verbindungskontingent eine sinnvolle Kapazitätserweiterung sein, statt nur die Behebung von Anwendungsfehlern aufzuschieben.
