Dela via


Felsöka tillfälliga utgående anslutningsfel i Azure App Service

Den här artikeln hjälper dig att felsöka tillfälliga anslutningsfel och relaterade prestandaproblem i Azure App Service. Den innehåller mer information om och felsökningsmetoder för överbelastning av SNAT-portar (source network address translation). Om du behöver mer hjälp när som helst i den här artikeln kontaktar du Azure-experterna på MSDN Azure och Stack Overflow-forumen. Alternativt kan du skapa en Azure-supportincident. Gå till Azure Support-webbplatsen och välj Hämta support.

Symtom

Program och funktioner som finns i Azure App Service kan uppvisa ett eller flera av följande symptom:

  • Långsamma svarstider för alla eller några av instanserna i en tjänstplan.
  • Tillfälliga 5xx- eller Bad Gateway-fel
  • Felmeddelanden om tidsgräns
  • Det gick inte att ansluta till externa slutpunkter (t.ex. SQLDB, Service Fabric, andra apptjänster osv.)

Orsak

Den främsta orsaken till tillfälliga anslutningsproblem är att överskrida en gräns när nya utgående anslutningar skapas. De gränser som du kan nå är:

  • TCP Anslut ions: Det finns en gräns för hur många utgående anslutningar som kan göras. Gränsen för utgående anslutningar är associerad med storleken på den arbetsroll som används.
  • SNAT-portar: Utgående anslutningar i Azure beskriver SNAT-portbegränsningar och hur de påverkar utgående anslutningar. Azure använder SNAT (Source Network Address Translation) och Load Balancers (inte exponerade för kunder) för att kommunicera med offentliga IP-adresser. Varje instans i Azure App Service får ursprungligen ett förallokerat antal 128 SNAT-portar. SNAT-portgränsen påverkar öppnandet av anslutningar till samma adress och portkombination. Om din app skapar anslutningar till en blandning av adress- och portkombinationer använder du inte dina SNAT-portar. SNAT-portar förbrukas när du har upprepade anrop till samma adress och portkombination. När en port har släppts är porten tillgänglig för återanvändning efter behov. Azure Network-lastbalanseraren återtar SNAT-porten från stängda anslutningar först efter att ha väntat i fyra minuter.

När program eller funktioner snabbt öppnar en ny anslutning kan de snabbt uttömma sin förallokerade kvot för de 128 portarna. De blockeras sedan tills en ny SNAT-port blir tillgänglig, antingen genom dynamisk allokering av fler SNAT-portar eller genom återanvändning av en återvunnen SNAT-port. Om din app får slut på SNAT-portar får den tillfälliga problem med utgående anslutningar.

Undvika problemet

Det finns några lösningar som gör att du kan undvika SNAT-portbegränsningar. De omfattar:

  • anslutningspooler: Genom att poola dina anslutningar undviker du att öppna nya nätverksanslutningar för anrop till samma adress och port.
  • tjänstslutpunkter: Du har ingen SNAT-portbegränsning för de tjänster som skyddas med tjänstslutpunkter.
  • privata slutpunkter: Du har ingen SNAT-portbegränsning för tjänster som skyddas med privata slutpunkter.
  • NAT-gateway: Med en NAT-gateway har du 64 000 utgående SNAT-portar som kan användas av de resurser som skickar trafik via den.

För att undvika SNAT-portproblemet förhindrar du att nya anslutningar skapas repetitivt till samma värd och port. Anslut ionspooler är ett av de mer uppenbara sätten att lösa problemet.

Om målet är en Azure-tjänst som stöder tjänstslutpunkter kan du undvika problem med SNAT-portöverbelastning med hjälp av regional VNet-integrering och tjänstslutpunkter eller privata slutpunkter. När du använder regional VNet-integrering och placerar tjänstslutpunkter i integrationsundernätet har appens utgående trafik till dessa tjänster inte utgående SNAT-portbegränsningar. På samma sätt har du inga problem med utgående SNAT-portar till det målet om du använder regional VNet-integrering och privata slutpunkter.

Om målet är en extern slutpunkt utanför Azure ger användning av en NAT-gateway dig 64 000 utgående SNAT-portar. Det ger dig också en dedikerad utgående adress som du inte delar med någon.

Om möjligt kan du förbättra koden för att använda anslutningspooler och undvika hela situationen. Det är inte alltid möjligt att ändra kod tillräckligt snabbt för att minimera den här situationen. Om du inte kan ändra koden i tid kan du dra nytta av de andra lösningarna. Den bästa lösningen på problemet är att kombinera alla lösningar så gott du kan. Försök att använda tjänstslutpunkter och privata slutpunkter till Azure-tjänster och NAT-gatewayen för resten.

Allmänna strategier för att minska SNAT-portöverbelastningen beskrivs i avsnittet Problemlösning i dokumentationen om utgående anslutningar i Azure. Av dessa strategier gäller följande för appar och funktioner som finns i Azure App Service.

Ändra programmet så att det använder anslutningspooler

Här är en samling länkar för implementering av Anslut ionspooler efter olika lösningsstackar.

Nod

Som standard hålls inte anslutningar för NodeJS vid liv. Nedan visas några populära databaser och paket för anslutningspooler samt exempel på hur du implementerar dem.

HTTP Keep-alive

Java

Nedan visas de populära bibliotek som används för JDBC-anslutningspooler som innehåller exempel på hur du implementerar dem: JDBC Anslut ion Pooling.

HTTP-anslutningspooler

PHP

Även om PHP inte stöder anslutningspooler kan du prova att använda beständiga databasanslutningar till serverdelsservern.

Python

Nedan visas de populära databaserna och modulerna för anslutningspooler som innehåller exempel på hur du implementerar dem.

HTTP-anslutningspooler

Ändra programmet så att det återanvänder anslutningar

Ändra programmet så att det använder mindre aggressiv omförsökslogik

Använd keepalives för att återställa tidsgränsen för utgående inaktivitet

Mer vägledning som är specifik för App Service:

  • Ett belastningstest ska simulera verkliga data i en stadig matningshastighet. Testning av appar och funktioner under verklig stress kan identifiera och lösa problem med SNAT-portöverbelastning i förväg.
  • Se till att serverdelstjänsterna snabbt kan returnera svar. Information om hur du felsöker prestandaproblem med Azure SQL Database finns i Felsöka prestandaproblem i Azure SQL Database med Intelligent Insights.
  • Skala ut App Service-planen till fler instanser. Mer information om skalning finns i Skala en app i Azure App Service. Varje arbetsinstans i en App Service-plan allokeras ett antal SNAT-portar. Om du sprider din användning över fler instanser kan du få SNAT-portanvändningen per instans under den rekommenderade gränsen på 100 utgående anslutningar per unik fjärrslutpunkt.
  • Överväg att flytta till App Service-miljön (ASE) där du har tilldelats en enda utgående IP-adress, och gränserna för anslutningar och SNAT-portar är högre. I en ASE baseras antalet SNAT-portar per instans på förallokeringstabellen för Azure-lastbalanseraren. Till exempel har en ASE med 1–50 arbetsinstanser 1 024 förallokerade portar per instans, medan en ASE med 51–100 arbetsinstanser har 512 förallokerade portar per instans.

Det är enklare att undvika de utgående TCP-gränserna, eftersom gränserna anges av arbetsstorleken. Du kan se gränserna i Sandbox Cross VM Numerical Limits – TCP Anslut ions

Gränsnamn beskrivning Liten (A1) Medium (A2) Stor (A3) Isolerad nivå (ASE)
anslutningar Antal anslutningar över hela den virtuella datorn 1920 3968 8064 16 000

För att undvika utgående TCP-gränser kan du antingen öka storleken på dina arbetare eller skala ut horisontellt.

Felsökning

Att känna till de två typerna av utgående anslutningsgränser och vad din app gör bör göra det enklare att felsöka. Om du vet att din app gör många anrop till samma lagringskonto kan du misstänka en SNAT-gräns. Om din app skapar många anrop till slutpunkter över hela Internet misstänker du att du når gränsen för den virtuella datorn.

Om du inte känner till programmets beteende tillräckligt för att snabbt fastställa orsaken finns det några verktyg och tekniker som är tillgängliga i App Service för att hjälpa till med den bedömningen.

Hitta information om SNAT-portallokering

Du kan använda App Service Diagnostics för att hitta information om SNAT-portallokering och observera allokeringsmåttet för SNAT-portar på en App Service-webbplats. Följ följande steg för att hitta information om SNAT-portallokering:

  1. Om du vill komma åt App Service-diagnostik går du till din App Service-webbapp eller App Service-miljön i Azure-portalen. I det vänstra navigeringsfältet väljer du Diagnostisera och lösa problem.
  2. Välj tillgänglighets- och prestandakategori
  3. Välj SNAT Port Exhaustion-panelen i listan över tillgängliga paneler under kategorin. Metoden är att hålla den under 128. Om du behöver det kan du fortfarande öppna ett supportärende och supportteknikern får måttet från serverdelen åt dig.

Eftersom SNAT-portanvändning inte är tillgängligt som mått går det inte att antingen skala automatiskt baserat på SNAT-portanvändning eller konfigurera automatisk skalning baserat på allokeringsmått för SNAT-portar.

TCP-Anslut ions och SNAT-portar

TCP-anslutningar och SNAT-portar är inte direkt relaterade. En TCP-anslutningsanvändningsdetektor ingår på sidan Diagnostisering och hantering av problem i alla App Service-appar. Sök efter frasen "TCP-anslutningar" för att hitta den.

  • SNAT-portarna används endast för externa nätverksflöden, medan den totala TCP-Anslut ions omfattar anslutningar för lokal loopback.
  • En SNAT-port kan delas av olika flöden, om flödena skiljer sig åt i antingen protokoll, IP-adress eller port. Måttet TCP Anslut ions räknar varje TCP-anslutning.
  • Gränsen för TCP-anslutningar sker på arbetsinstansnivå. Utgående belastningsutjämning i Azure Network använder inte måttet TCP-Anslut ions för SNAT-portbegränsning.
  • Gränserna för TCP-anslutningar beskrivs i Numeriska gränser för flera virtuella datorer i sandbox-miljö – TCP-Anslut ions
  • Befintliga TCP-sessioner misslyckas när nya utgående TCP-sessioner läggs till från Azure App Service-källporten. Du kan antingen använda en enskild IP-adress eller konfigurera om medlemmar i serverdelspoolen för att undvika konflikter.
Gränsnamn beskrivning Liten (A1) Medium (A2) Stor (A3) Isolerad nivå (ASE)
anslutningar Antal anslutningar över hela den virtuella datorn 1920 3968 8064 16 000

Webbjobb och databasanslutningar

Om SNAT-portar är uttömda och WebJobs inte kan ansluta till SQL Database finns det inget mått som visar hur många anslutningar som öppnas av varje enskild webbprogramprocess. Om du vill hitta det problematiska webbjobbet flyttar du flera webbjobb till en annan App Service-plan för att se om situationen förbättras eller om ett problem kvarstår i någon av planerna. Upprepa processen tills du hittar det problematiska webbjobbet.

Ytterligare information