Problemen met onregelmatige uitgaande verbindingen in Azure App Service oplossen

Dit artikel helpt u bij het oplossen van onregelmatige verbindingsfouten en gerelateerde prestatieproblemen in Azure App Service. Het biedt meer informatie over en probleemoplossingsmethoden voor uitputting van SNAT-poorten (Source Network Address Translation). Als u op een bepaald punt in dit artikel meer hulp nodig hebt, neemt u contact op met de Azure-experts op de MSDN Azure- en Stack Overflow-forums. U kunt ook een ondersteuning voor Azure-incident indienen. Ga naar de azure-ondersteuningssite en selecteer Ondersteuning krijgen.

Symptomen

Toepassingen en functies die worden gehost op Azure-app-service kunnen een of meer van de volgende symptomen vertonen:

  • Trage reactietijden voor alle of sommige exemplaren in een serviceplan.
  • Onregelmatige 5xx- of ongeldige gatewayfouten
  • Time-outfoutberichten
  • Kan geen verbinding maken met externe eindpunten (zoals SQLDB, Service Fabric, andere App-services, enzovoort)

Oorzaak

De belangrijkste oorzaak voor onregelmatige verbindingsproblemen is het bereiken van een limiet tijdens het maken van nieuwe uitgaande verbindingen. De limieten die u kunt bereiken, zijn onder andere:

  • TCP-verbindingen: er is een limiet voor het aantal uitgaande verbindingen dat kan worden gemaakt. De limiet voor uitgaande verbindingen is gekoppeld aan de grootte van de gebruikte werkrol.
  • SNAT-poorten: uitgaande verbindingen in Azure beschrijft SNAT-poortbeperkingen en hoe deze van invloed zijn op uitgaande verbindingen. Azure maakt gebruik van SNAT (Source Network Address Translation) en load balancers (niet beschikbaar voor klanten) om te communiceren met openbare IP-adressen. Elk exemplaar in Azure-app service krijgt in eerste instantie een vooraf toegewezen aantal van 128 SNAT-poorten. De SNAT-poortlimiet is van invloed op het openen van verbindingen met dezelfde adres- en poortcombinatie. Als uw app verbindingen maakt met een combinatie van adres- en poortcombinaties, gebruikt u uw SNAT-poorten niet. De SNAT-poorten worden gebruikt wanneer u herhaalde aanroepen naar dezelfde adres- en poortcombinatie hebt. Zodra een poort is vrijgegeven, kan de poort indien nodig opnieuw worden gebruikt. De Azure Network-load balancer claimt de SNAT-poort van gesloten verbindingen pas opnieuw na 4 minuten wachten.

Wanneer toepassingen of functies snel een nieuwe verbinding openen, kunnen ze hun vooraf toegewezen quotum van de 128 poorten snel opgebruiken. Ze worden vervolgens geblokkeerd totdat er een nieuwe SNAT-poort beschikbaar komt, hetzij door dynamisch meer SNAT-poorten toe te wijzen of door een gereveerde SNAT-poort opnieuw te gebruiken. Als uw app geen SNAT-poorten meer heeft, treedt er af en toe problemen met de uitgaande connectiviteit op.

Het probleem vermijden

Er zijn een aantal oplossingen waarmee u SNAT-poortbeperkingen kunt vermijden. Deze omvatten:

  • verbindingsgroepen: Door uw verbindingen te groeperen, voorkomt u het openen van nieuwe netwerkverbindingen voor oproepen naar hetzelfde adres en dezelfde poort.
  • service-eindpunten: U hebt geen SNAT-poortbeperking voor de services die zijn beveiligd met service-eindpunten.
  • privé-eindpunten: U hebt geen SNAT-poortbeperking voor services die zijn beveiligd met privé-eindpunten.
  • NAT-gateway: Met een NAT-gateway hebt u 64.000 uitgaande SNAT-poorten die kunnen worden gebruikt door de resources die er verkeer via verzenden.

Om het SNAT-poortprobleem te voorkomen, voorkomt u dat er herhaaldelijk nieuwe verbindingen met dezelfde host en poort worden gemaakt. Verbindingsgroepen zijn een van de meest voor de hand liggende manieren om dat probleem op te lossen.

Als uw bestemming een Azure-service is die service-eindpunten ondersteunt, kunt u problemen met SNAT-poortuitputting voorkomen door regionale VNet-integratie en service-eindpunten of privé-eindpunten te gebruiken. Wanneer u regionale VNet-integratie gebruikt en service-eindpunten in het integratiesubnet plaatst, heeft het uitgaande verkeer van uw app naar deze services geen uitgaande SNAT-poortbeperkingen. Als u regionale VNet-integratie en privé-eindpunten gebruikt, ondervindt u ook geen problemen met uitgaande SNAT-poorten naar die bestemming.

Als uw bestemming een extern eindpunt buiten Azure is, biedt het gebruik van een NAT-gateway u 64.000 uitgaande SNAT-poorten. U krijgt ook een speciaal uitgaand adres dat u met niemand deelt.

Verbeter indien mogelijk uw code om verbindingsgroepen te gebruiken en vermijd de hele situatie. Het is niet altijd mogelijk om code snel genoeg te wijzigen om deze situatie te verhelpen. Voor de gevallen waarin u uw code niet op tijd kunt wijzigen, kunt u gebruikmaken van de andere oplossingen. De beste oplossing voor het probleem is om alle oplossingen zo goed mogelijk te combineren. Probeer service-eindpunten en privé-eindpunten te gebruiken voor Azure-services en de NAT-gateway voor de rest.

Algemene strategieën voor het beperken van SNAT-poortuitputting worden besproken in de sectie Probleemoplossing van de documentatie Voor uitgaande verbindingen van Azure . Van deze strategieën zijn de volgende van toepassing op apps en functies die worden gehost op Azure-app service.

Pas de toepassing zo aan dat deze verbindingsgroepen gebruikt

  • Zie HTTP-verbindingen voor groepen met HttpClientFactory voor het groeperen van HTTP-verbindingen.
  • Raadpleeg SQL Server ADO.NET (SQL Server)) voor informatie over het groeperen van SQL Server verbindingen.

Hier volgt een verzameling koppelingen voor het implementeren van groepsgewijze verbindingen door verschillende oplossingsstacks.

Knooppunt

Verbindingen voor NodeJS worden standaard niet actief gehouden. Hieronder vindt u de populaire databases en pakketten voor groepsgewijze verbindingen, inclusief voorbeelden van de implementatie ervan.

HTTP-keepalive

Java

Hieronder vindt u de populaire bibliotheken die worden gebruikt voor het groeperen van JDBC-verbindingen, die voorbeelden bevatten voor het implementeren ervan: JDBC-verbindingsgroepen.

Groepsgewijze HTTP-verbinding

PHP

Hoewel PHP geen ondersteuning biedt voor groepsgewijze verbindingen, kunt u proberen permanente database verbindingen op uw back-endserver te gebruiken.

Python

Hieronder vindt u de populaire databases en modules voor groepsgewijze verbindingen, die voorbeelden bevatten voor het implementeren ervan.

Groepsgewijze HTTP-verbinding

Pas de toepassing aan om verbindingen opnieuw te gebruiken

Pas de toepassing zo aan dat deze minder agressieve logica voor opnieuw proberen gebruikt

Keep-alives gebruiken om de time-out voor uitgaande inactiviteit opnieuw in te stellen

Meer richtlijnen die specifiek zijn voor App Service:

  • Een belastingstest moet gegevens uit de echte wereld simuleren met een constante voersnelheid. Het testen van apps en functies onder stress in de echte wereld kan problemen met SNAT-poortuitputting van tevoren identificeren en oplossen.
  • Zorg ervoor dat de back-endservices snel antwoorden kunnen retourneren. Raadpleeg Prestatieproblemen met Azure SQL database oplossen met Intelligent Insights voor het oplossen van prestatieproblemen met Azure SQL Database.
  • Schaal de App Service uit naar meer exemplaren. Zie Een app schalen in Azure App Service voor meer informatie over schalen. Aan elk werkrolexemplaren in een App Service-plan wordt een aantal SNAT-poorten toegewezen. Als u uw gebruik over meer exemplaren verspreidt, krijgt u mogelijk het SNAT-poortgebruik per exemplaar onder de aanbevolen limiet van 100 uitgaande verbindingen, per uniek extern eindpunt.
  • Overweeg om over te stappen naar App Service Environment (ASE), waar u één uitgaand IP-adres hebt toegewezen en de limieten voor verbindingen en SNAT-poorten hoger zijn. In een ASE is het aantal SNAT-poorten per exemplaar gebaseerd op de tabel preallocatie van Azure Load Balancer. Een ASE met 1-50 werkrolexemplaren heeft bijvoorbeeld 1024 vooraf toegewezen poorten per exemplaar, terwijl een ASE met 51-100 werkrolexemplaren 512 vooraf toegewezen poorten per exemplaar heeft.

Het vermijden van de uitgaande TCP-limieten is eenvoudiger op te lossen, omdat de limieten worden ingesteld op basis van de grootte van uw werkrol. U kunt de limieten zien in Sandbox Cross VM Numerical Limits - TCP Connections

Naam van limiet Beschrijving Klein (A1) Gemiddeld (A2) Groot (A3) Geïsoleerde laag (ASE)
Verbindingen Aantal verbindingen voor de hele VM 1920 3968 8064 16.000

Als u uitgaande TCP-limieten wilt voorkomen, kunt u de grootte van uw werkrollen vergroten of horizontaal uitschalen.

Problemen oplossen

Als u weet wat de twee typen limieten voor uitgaande verbindingen zijn en wat uw app doet, is het eenvoudiger om problemen op te lossen. Als u weet dat uw app veel aanroepen naar hetzelfde opslagaccount uitvoert, vermoedt u mogelijk een SNAT-limiet. Als uw app veel aanroepen naar eindpunten via internet maakt, vermoedt u dat u de VM-limiet bereikt.

Als u het gedrag van de toepassing niet genoeg weet om snel de oorzaak te bepalen, zijn er enkele hulpprogramma's en technieken beschikbaar in App Service om te helpen bij die bepaling.

Informatie over SNAT-poorttoewijzing zoeken

U kunt App Service Diagnostics gebruiken om informatie over de toewijzing van SNAT-poorten te vinden en de metrische gegevens over de toewijzing van SNAT-poorten van een App Service-site te bekijken. Voer de volgende stappen uit om informatie over de toewijzing van SNAT-poorten te vinden:

  1. Als u toegang wilt krijgen tot App Service diagnostische gegevens, gaat u naar uw App Service web-app of App Service Environment in de Azure Portal. Selecteer in het linkernavigatievenster Problemen vaststellen en oplossen.
  2. Beschikbaarheids- en prestatiecategorie selecteren
  3. Selecteer de tegel SNAT Port Exhaustion in de lijst met beschikbare tegels onder de categorie. De praktijk is om het onder 128 te houden. Als u deze wel nodig hebt, kunt u nog steeds een ondersteuningsticket openen, waarna de ondersteuningstechnicus de metrische gegevens van de back-end voor u ontvangt.

Omdat het gebruik van SNAT-poorten niet beschikbaar is als metrische waarde, is het niet mogelijk om automatisch te schalen op basis van het gebruik van de SNAT-poort of om automatisch schalen te configureren op basis van de metrische gegevens voor toewijzing van SNAT-poorten.

TCP-verbindingen en SNAT-poorten

TCP-verbindingen en SNAT-poorten zijn niet rechtstreeks gerelateerd. Een detector voor het gebruik van TCP-verbindingen is opgenomen op de pagina Problemen vaststellen en oplossen van een App Service-app. Zoek naar de woordgroep 'TCP-verbindingen' om deze te vinden.

  • De SNAT-poorten worden alleen gebruikt voor externe netwerkstromen, terwijl het totale aantal TCP-verbindingen lokale loopback-verbindingen bevat.
  • Een SNAT-poort kan worden gedeeld door verschillende stromen, als de stromen verschillen in protocol, IP-adres of poort. Met de metrische waarde TCP-verbindingen wordt elke TCP-verbinding geteld.
  • De limiet voor TCP-verbindingen vindt plaats op het niveau van het werkrolexemplaren. De uitgaande taakverdeling van het Azure-netwerk maakt geen gebruik van de metrische waarde TCP-verbindingen voor SNAT-poortbeperking.
  • De limieten voor TCP-verbindingen worden beschreven in Sandbox Cross VM Numerical Limits - TCP Connections
  • Bestaande TCP-sessies mislukken wanneer nieuwe uitgaande TCP-sessies worden toegevoegd vanaf Azure App Service bronpoort. U kunt één IP-adres gebruiken of back-endpoolleden opnieuw configureren om conflicten te voorkomen.
Naam van limiet Beschrijving Klein (A1) Gemiddeld (A2) Groot (A3) Geïsoleerde laag (ASE)
Verbindingen Aantal verbindingen voor de hele VM 1920 3968 8064 16.000

Webjobs- en databaseverbindingen

Als SNAT-poorten uitgeput zijn en webtaken geen verbinding kunnen maken met SQL Database, is er geen metrische waarde om aan te geven hoeveel verbindingen er worden geopend door elk afzonderlijk webtoepassingsproces. Als u de problematische webtaak wilt vinden, verplaatst u verschillende webtaken naar een andere App Service plan bent om te zien of de situatie verbetert of dat er een probleem in een van de plannen blijft. Herhaal het proces totdat u de problematische webtaak hebt gevonden.

Aanvullende informatie