Beheben zeitweiliger Fehler bei ausgehenden Verbindungen in Azure App Service

In diesem Artikel erfahren Sie, wie Sie zeitweilige Verbindungsfehler und zugehörige Leistungsprobleme in Azure App Service beheben. Dieses Thema enthält weitere Informationen zu sowie Problembehandlungsmethoden für die Auslastung von SNAT-Ports (Source Network Address Translation). Wenn Sie beim Lesen dieses Artikels feststellen, dass Sie weitere Hilfe benötigen, wenden Sie sich an die Azure-Experten im MSDN Azure-Forum oder im Stack Overflow-Forum. Alternativ dazu können Sie eine Azure-Supportanfrage erstellen. Rufen Sie die Azure-Support-Website auf, und wählen Sie die Option Support erhalten.

Symptome

Im Azure-App-Dienst gehostete Anwendungen und Funktionen weisen möglicherweise eines oder mehrere der folgenden Symptome auf:

  • Langsame Reaktionszeiten bei allen oder einigen der Instanzen in einem Dienstplan.
  • Zeitweilig auftretende 5xx- oder Ungültiges Gateway-Fehler.
  • Timeoutfehlermeldungen
  • Es konnte keine Verbindung mit externen Endpunkten hergestellt werden (z. B. SQLDB, Service Fabric, andere App-Dienste usw.).

Ursache

Die Hauptursache für zeitweilig auftretende Verbindungsprobleme ist das Erreichen einer Grenze, während neue ausgehende Verbindungen hergestellt werden. Folgende Grenzwerte können erreicht werden:

  • TCP-Verbindungen: Die Anzahl herstellbarer ausgehender Verbindungen ist begrenzt. Der Grenzwert für ausgehende Verbindungen ist der Größe des verwendeten Workers zugeordnet.
  • SNAT-Ports: Verwenden von SNAT für ausgehende Verbindungen beschreibt SNAT-Port-Einschränkungen und deren Auswirkung auf ausgehende Verbindungen. Azure verwendet die Quell-Netzwerkadressenübersetzung (Source Network Address Translation, SNAT) und Load Balancer (nicht für Kunden verfügbar gemacht), um mit öffentlichen IP-Adressen zu kommunizieren. Jeder Instanz im Azure-App-Dienst wird zunächst eine vorab zugeordnete Anzahl von 128 SNAT-Ports zugewiesen. Dieses SNAT-Port-Limit wirkt sich auf das Öffnen von Verbindungen mit derselben Adress- und Portkombination aus. Wenn Ihre App Verbindungen mit einer Mischung aus Adress- und Portkombinationen herstellt, werden Sie Ihre SNAT-Ports nicht aufbrauchen. Die SNAT-Ports werden aufgebraucht, wenn Sie wiederholten Aufrufe an dieselbe Kombination aus Adresse und Port vornehmen. Nach der Freigabe eines Ports kann er bei Bedarf erneut verwendet werden. Der Azure-Netzwerklastenausgleich gibt SNAT-Ports von geschlossenen Verbindungen erst nach einer Wartezeit von 4 Minuten zurück.

Wenn Anwendungen oder Funktionen schnell eine neue Verbindung öffnen, können Sie ihr vorab zugewiesenes Kontingent von 128 Ports schnell erschöpfen. Sie werden dann blockiert, bis ein neuer SNAT-Port verfügbar wird, entweder durch dynamisches Zuweisen weiterer SNAT-Ports oder durch Wiederverwendung eines freigegebenen SNAT-Ports. Wenn Ihre App nicht mehr über SNAT-Ports verfügt, werden zeitweilig Probleme bei ausgehenden Verbindungen auftreten.

Vermeiden des Problems

Es gibt einige Lösungen, mit denen Sie SNAT-Port-Einschränkungen vermeiden können. Dazu gehören:

  • Verbindungspools: Wenn Sie Ihre Verbindungen bündeln, vermeiden Sie das Öffnen neuer Netzwerkverbindungen für Aufrufe derselben Adresse und desselben Ports.
  • Dienstendpunkte: Sie unterliegen keiner SNAT-Port-Einschränkung für die Dienste, die durch Dienstendpunkte gesichert sind.
  • Private Endpunkte: Sie unterliegen keiner SNAT-Port-Einschränkung für die Dienste, die durch private Endpunkte gesichert sind.
  • NAT Gateway: Mit einem NAT Gateway verfügen Sie über 64 KB ausgehende SNAT-Ports, die von den Ressourcen genutzt werden können, die Datenverkehr darüber senden.

Um das SNAT-Port-Problem zu vermeiden, verhindern Sie, dass immer wieder neue Verbindungen zum selben Host und Port aufgebaut werden. Verbindungspools zählen zu den offensichtlicheren Möglichkeiten, dieses Problem zu lösen.

Wenn Ihr Ziel ein Azure-Dienst ist, der Dienstendpunkte unterstützt, können Sie Probleme durch eine Überlastung von SNAT-Ports vermeiden, indem Sie die regionale VNET-Integration und Dienstendpunkte oder private Endpunkte verwenden. Wenn Sie die regionale VNET-Integration verwenden und Endpunkte im Integrationssubnetz platzieren, gelten für den ausgehenden Datenverkehr Ihrer App an diese Dienste keine Einschränkungen für ausgehende SNAT-Ports. Ebenso treten keine Probleme bei ausgehenden SNAT-Ports an dieses Ziel auf, wenn Sie die regionale VNet-Integration und private Endpunkte verwenden.

Wenn Ihr Ziel ein externer Endpunkt außerhalb von Azure ist, erhalten Sie mithilfe eines NAT Gateways 64 KB ausgehende SNAT-Ports. Außerdem erhalten Sie eine dedizierte ausgehende Adresse, die Sie mit niemandem teilen.

Wenn möglich, verbessern Sie Ihren Code für die Verwendung von Verbindungspools, und vermeiden Sie die gesamte Situation. Es ist nicht immer möglich, Code schnell genug zu ändern, um diese Situation zu entschärfen. Wenn Sie den Code nicht rechtzeitig ändern können, nutzen Sie die anderen Lösungen. Die beste Lösung des Problems ist die bestmögliche Kombination aller Lösungen. Versuchen Sie, Dienstendpunkte und private Endpunkte für Azure-Dienste zu verwenden und das NAT Gateway für den Rest.

Allgemeine Strategien zum Verringern der SNAT-Portauslastung finden Sie im Abschnitt zur Problembehebung der Dokumentation Ausgehende Verbindungen von Azure. Von diesen Strategien sind die folgenden anwendbar auf Apps und Funktionen, die im Azure-App-Dienst gehostet werden.

Ändern der Anwendung für die Verwendung von Verbindungspooling

Im Folgenden finden Sie eine Auflistung von Links zum Implementieren von Verbindungspooling nach unterschiedlichem Lösungsstapel.

Node

Standardmäßig werden Verbindungen für NodeJS nicht aufrechterhalten. Unten sind die gängigen Datenbanken und Pakete für das Verbindungspooling angegeben, die auch Beispiele zur Implementierung enthalten.

HTTP-Keep-Alive

Java

Unten sind die gängigen Bibliotheken aufgeführt, die für das JDBC-Verbindungspooling verwendet werden und Beispiele für die Implementierung enthalten: JDBC-Verbindungspooling.

HTTP-Verbindungspooling

PHP

Von PHP wird Verbindungspooling zwar nicht unterstützt, aber Sie können versuchen, dauerhafte Datenbankverbindungen auf Ihrem Back-End-Server zu verwenden.

Python

Unten sind die beliebten Datenbanken und Module für das Verbindungspooling mit Beispielen zu deren Implementierung aufgeführt.

HTTP-Verbindungspooling

  • Keep-Alive- und HTTP-Verbindungspooling sind standardmäßig im Modul Anforderungen aktiviert.
  • Urllib3

Ändern der Anwendung für die Wiederverwendung von Verbindungen

Ändern der Anwendung für die Verwendung weniger aggressiver Wiederholungslogik

Verwenden von Keep-Alives zum Zurücksetzen des Leerlauftimeouts für ausgehende Verbindungen

Weitere Anleitungen speziell für App Service:

  • Ein Auslastungstest sollte reale Daten mit einer konstanten Zuführungsgeschwindigkeit simulieren. Mit dem Testen von Apps und Funktionen unter realen Belastungsbedingungen können Probleme mit der SNAT-Portauslastung vorzeitig erkannt und behoben werden.
  • Stellen Sie sicher, dass die Back-End-Dienste Antworten schnell zurückgeben können. Informationen zum Behandeln von Problemen mit der Azure SQL-Datenbank finden Sie unter Behandeln von Problemen mit der Leistung von Azure SQL-Datenbank mithilfe von Intelligent Insights.
  • Erweitern Sie den App Service-Plan auf weitere Instanzen. Weitere Informationen zur Skalierung finden Sie unter Skalieren einer App in Azure App Service. Jeder Workerinstanz in einem App Service-Plan wird eine Anzahl von SNAT-Ports zugeordnet. Wenn Sie Ihre Nutzung auf mehrere Instanzen verteilen, können Sie eventuell eine SNAT-Portnutzung pro Instanz unterhalb des empfohlenen Limits von 100 ausgehenden Verbindungen pro eindeutigem Remoteendpunkt erreichen.
  • Erwägen Sie die Umstellung auf App Service-Umgebung (ASE), wobei Ihnen eine einzelne ausgehende IP-Adresse zugewiesen wird und die Grenzwerte für Verbindungen und SNAT-Ports höher sind. In einer ASE basiert die Anzahl der SNAT-Ports pro Instanz auf der Azure Load Balancer-Vorabzuordnungstabelle. Eine ASE mit 1 bis 50 Workerinstanzen verfügt beispielsweise über 1024 vorab zugewiesene Ports pro Instanz, während eine ASE mit 51 bis 100 Workerinstanzen über 512 vorab zugewiesene Ports pro Instanz verfügt.

Die Vermeidung der ausgehenden TCP-Limits lässt sich leichter erreichen, weil die Limits durch die Größe Ihres Workers festgelegt werden. Sie finden die Limits in Numerische Limits für sandboxübergreifende VM: TCP-Verbindungen.

Limitname BESCHREIBUNG Klein (A1) Mittel (A2) Groß (A3) Dienstebene „Isoliert“ (ASE)
Verbindungen Anzahl von Verbindungen in der gesamten VM 1920 3968 8064 16.000

Um ausgehende TCP-Limits zu vermeiden, können Sie entweder die Größe Ihres Workers erhöhen oder horizontal erweitern.

Problembehandlung

Die Kenntnis der beiden Arten von Limits für ausgehende Verbindungen sowie des Verhaltens Ihrer App sollte die Problembehandlung erleichtern. Wenn Sie wissen, dass Ihre App viele Aufrufe an dasselbe Speicherkonto durchführt, könnten Sie ein SNAT-Limit vermuten. Wenn Ihre App viele Aufrufe an Endpunkte über das Internet erstellt, könnten Sie vermuten, dass Sie das VM-Limit erreichen werden.

Wenn Sie das Anwendungsverhalten nicht gut genug kennen, um die Ursache schnell zu ermitteln, gibt es einige Tools und Methoden, die in App Service zur Unterstützung dieser Ermittlungsaufgabe verfügbar sind.

Auffinden von SNAT-Portzuordnungsinformationen

Sie können die App Service-Diagnose verwenden, um SNAT-Portzuordnungsinformationen zu suchen, und die Zuordnungsmetrik von SNAT-Ports für eine App Service-Site beobachten. Gehen Sie wie folgt vor, um SNAT-Portzuordnungsinformationen zu finden:

  1. Navigieren Sie für den Zugriff auf die App Service-Diagnose zu Ihrer App Service-Web-App oder App Service-Umgebung im Azure-Portal. Wählen Sie im linken Navigationsbereich Diagnose und Problembehandlung aus.
  2. Wählen Sie die Kategorie „Verfügbarkeit und Leistung“ aus.
  3. Wählen Sie in der Liste der verfügbaren Kacheln unter der Kategorie die Kachel „SNAT-Portauslastung“ aus. Die Vorgehensweise besteht darin, den Wert unter 128 zu halten. Wenn Sie dies benötigen, können Sie immer noch ein Supportticket öffnen, und der Supporttechniker ruft die Metrik vom Back-End für Sie ab.

Da die SNAT-Portauslastung nicht als Metrik verfügbar ist, ist es nicht möglich, entweder automatisch auf Grundlage der SNAT-Portauslastung zu skalieren oder die automatische Skalierung auf Grundlage der SNAT-Portzuordnungsmetrik zu konfigurieren.

TCP-Verbindungen und SNAT-Ports

TCP-Verbindungen und SNAT-Ports stehen in keinem direkten Zusammenhang. Eine Auslastungserkennung für TCP-Verbindungen befindet sich auf der Verwaltungsseite „Diagnose und Problembehandlung“ jeder App Service-App enthalten. Suchen Sie nach dem Ausdruck „TCP-Verbindungen“, um sie zu finden.

  • Die SNAT-Ports werden nur für externe Netzwerkflows verwendet, während die gesamten TCP-Verbindungen lokale Loopbackverbindungen enthalten.
  • Ein SNAT-Port kann von verschiedenen Flows gemeinsam genutzt werden, wenn sich die Flows im Protokoll, bei der IP-Adresse oder dem Port unterscheiden. Die TCP-Verbindungenmetrik zählt jede TCP-Verbindung.
  • Das Limit für TCP-Verbindungen gilt auf Workerinstanzebene. Der ausgehende Lastenausgleich im Azure-Netzwerk verwendet die TCP-Verbindungenmetrik nicht für die SNAT-Portbegrenzung.
  • Sie finden die TCP-Verbindungslimits in Numerische Limits für sandboxübergreifende VM: TCP-Verbindungen.
  • Vorhandene TCP-Sitzungen schlagen fehl, wenn neue ausgehende TCP-Sitzungen vom Quellport in Azure App Service hinzugefügt werden. Sie können entweder eine einzelne IP-Adresse verwenden oder Back-End-Poolmitglieder neu konfigurieren, um Konflikte zu vermeiden.
Limitname BESCHREIBUNG Klein (A1) Mittel (A2) Groß (A3) Dienstebene „Isoliert“ (ASE)
Verbindungen Anzahl von Verbindungen in der gesamten VM 1920 3968 8064 16.000

WebJobs und Datenbankverbindungen

Wenn die SNAT-Ports erschöpft sind und WebJobs keine Verbindung mit der SQL-Datenbank herstellen kann, gibt es keine Metrik, die zeigt, wie viele Verbindungen von jedem einzelnen Webanwendungsprozess geöffnet werden. Um den problematischen WebJob zu finden, verschieben Sie mehrere WebJobs in einen anderen App Service-Plan, um festzustellen, ob sich die Situation verbessert, oder ob ein Problem in einem der Pläne bestehen bleibt. Wiederholen Sie den Vorgang, bis Sie den problematischen WebJob gefunden haben.

Zusätzliche Informationen