Udostępnij przez


Rozwiązywanie problemów z sporadycznymi błędami połączeń wychodzących w usłudze Azure App Service

Ten artykuł ułatwia rozwiązywanie sporadycznych błędów połączenia i powiązanych problemów z wydajnością w usłudze aplikacja systemu Azure. Zawiera on więcej informacji na temat portów translacji adresów sieciowych (SNAT) i rozwiązywania problemów z nią związanych. Jeśli potrzebujesz więcej pomocy w dowolnym momencie tego artykułu, skontaktuj się z ekspertami platformy Azure w pomocy technicznej społeczności platformy Azure. Alternatywnie możesz zgłosić incydent do pomocy technicznej Azure. Przejdź do pomocy technicznej platformy Azure i wybierz pozycję Prześlij bilet pomocy technicznej.

Objawy

Aplikacje i funkcje hostowane w usłudze Azure App Service mogą mieć co najmniej jeden z następujących problemów:

  • Wolne czasy odpowiedzi dla wszystkich lub niektórych wystąpień w planie usługi.
  • Sporadyczne błędy 5xx lub Błąd bramy.
  • Komunikaty o błędach przekroczenia limitu czasu.
  • Nie można nawiązać połączenia z zewnętrznymi punktami końcowymi (takimi jak SQLDB, Service Fabric lub inne usługi aplikacyjne).

Przyczyna

Główną przyczyną sporadycznych problemów z połączeniem jest przekroczenie limitu podczas tworzenia nowych połączeń wychodzących. Limity, które można osiągnąć, obejmują:

  • Połączenia TCP: istnieje limit liczby połączeń wychodzących, które można wykonać. Limit połączeń wychodzących jest skojarzony z rozmiarem używanego procesu roboczego.
  • Porty SNAT: połączenia wychodzące na platformie Azure opisują ograniczenia portów SNAT i ich wpływ na połączenia wychodzące. Platforma Azure używa źródłowego translatora adresów sieciowych (SNAT) i modułów równoważenia obciążenia (nie uwidacznianych klientom) do komunikowania się z publicznymi adresami IP. Każde wystąpienie usługi aplikacja systemu Azure jest początkowo przydzielane wstępnie przydzielonej liczbie 128 portów SNAT. Limit portów SNAT wpływa na otwieranie połączeń z tą samą kombinacją adresu i portu. Jeśli aplikacja tworzy połączenia z kombinacją kombinacji adresów i portów, nie będziesz używać portów SNAT. Porty SNAT są zużywane w przypadku powtarzających się wywołań do tej samej kombinacji adresu i portu. Po zwolnieniu portu port jest dostępny do ponownego użycia w razie potrzeby. Moduł równoważenia obciążenia usługi Azure Network odzyskuje porty SNAT z zamkniętych połączeń dopiero po odczekaniu czterech minut.

Gdy aplikacje lub funkcje szybko otwierają nowe połączenie, mogą szybko wyczerpać wstępnie przydzielony limit 128 portów. Są one następnie blokowane do momentu udostępnienia nowego portu SNAT przez dynamiczne przydzielanie większej liczby portów SNAT lub ponowne użycie odzyskanego portu SNAT. Jeśli w aplikacji zabraknie portów SNAT, występują sporadyczne problemy z łącznością wychodzącą.

Unikanie problemu

Istnieje kilka rozwiązań, które pozwalają uniknąć ograniczeń portów SNAT. To na przykład:

  • Pule połączeń: tworząc pulę połączeń, należy unikać otwierania nowych połączeń sieciowych dla wywołań do tego samego adresu i portu.
  • Punkty końcowe usługi: nie masz ograniczenia portu SNAT dla usług zabezpieczonych za pomocą punktów końcowych usługi.
  • Prywatne punkty końcowe: nie masz ograniczenia portu SNAT do usług zabezpieczonych za pomocą prywatnych punktów końcowych.
  • Brama translatora adresów sieciowych: w przypadku bramy translatora adresów sieciowych masz 64k portów wychodzących SNAT, które mogą być używane przez zasoby wysyłające ruch przez nią.

Aby uniknąć problemu z portem SNAT, należy zapobiec powtarzalnym tworzeniu nowych połączeń z tym samym hostem i portem. Pule połączeń to jeden z bardziej oczywistych sposobów rozwiązania tego problemu.

Jeśli miejscem docelowym jest usługa platformy Azure, która obsługuje punkty końcowe usługi, możesz uniknąć problemów z wyczerpaniem portów SNAT przy użyciu regionalnej integracji sieci wirtualnej i punktów końcowych usługi lub prywatnych punktów końcowych. W przypadku korzystania z regionalnej integracji sieci wirtualnej i umieszczania punktów końcowych usługi w podsieci integracji ruch wychodzący aplikacji do tych usług nie będzie miał ograniczeń portów wychodzących SNAT. Podobnie jeśli używasz regionalnej integracji sieci wirtualnej i prywatnych punktów końcowych, nie będziesz mieć żadnych problemów z portem SNAT dla ruchu wychodzącego do tego miejsca docelowego.

Jeśli miejsce docelowe jest zewnętrznym punktem końcowym poza platformą Azure, użycie bramy translatora adresów sieciowych zapewnia 64k portów wychodzących SNAT. Zapewnia on również dedykowany adres wychodzący, który nie jest udostępniany nikomu.

Jeśli to możliwe, ulepsz kod, aby używać pul połączeń i uniknąć całej sytuacji. Nie zawsze można szybko zmienić kod, aby wyeliminować tę sytuację. W przypadku, gdy nie można zmienić kodu na czas, skorzystaj z innych rozwiązań. Najlepszym rozwiązaniem problemu jest połączenie wszystkich rozwiązań najlepiej, jak to możliwe. Spróbuj użyć punktów końcowych usługi i prywatnych punktów końcowych do usług platformy Azure i bramy translatora adresów sieciowych dla pozostałych.

Aby dowiedzieć się więcej na temat strategii ograniczania wyczerpania portów SNAT, zobacz Use SNAT for outbound connections (Używanie protokołu SNAT dla połączeń wychodzących). Poniższe strategie dotyczą aplikacji i funkcji hostowanych w usłudze aplikacja systemu Azure.

Korzystanie z buforowania połączeń

W poniższych artykułach opisano implementowanie buforowania połączeń za pomocą innego stosu rozwiązań.

Węzeł

Domyślnie połączenia dla Node.js nie są zachowywane.

Http keep-alive

Jawa

Buforowanie połączeń z bazą danych Java (JDBC)

Buforowanie zasobów połączeń HTTP

PHP

Mimo że język PHP nie obsługuje buforowania połączeń, możesz spróbować użyć trwałych połączeń bazy danych z serwerem zaplecza.

Pyton

Buforowanie zasobów połączeń HTTP

Ponowne używanie połączeń

Aby uzyskać więcej wskazówek i przykładów dotyczących zarządzania połączeniami w usłudze Azure Functions, zobacz Zarządzanie połączeniami w usłudze Azure Functions.

Używanie mniej agresywnej logiki ponawiania prób

Aby uzyskać więcej wskazówek i przykładów, zobacz Wzorzec ponawiania prób.

Użyj keepalives, aby zresetować czas bezczynności połączeń wychodzących

Aby zaimplementować keepalive dla aplikacji Node.js, zobacz Moja aplikacja Node.js wykonuje nadmierne wywołania wychodzące.

Więcej wskazówek dotyczących usługi App Service

  • Test obciążeniowy powinien symulować dane rzeczywiste w stałej szybkości przekazywania. Testowanie aplikacji i funkcji w warunkach zbliżonych do rzeczywistych z wyprzedzeniem może identyfikować i rozwiązywać problemy z wyczerpaniem portów SNAT.
  • Upewnij się, że usługi zaplecza mogą szybko zwracać odpowiedzi. Aby rozwiązać problemy z wydajnością usługi Azure SQL Database, zobacz Rozwiązywanie problemów z wydajnością usługi Azure SQL Database za pomocą funkcji Intelligent Insights.
  • Skalowanie w poziomie planu usługi App Service do większej liczby wystąpień. Aby uzyskać więcej informacji na temat skalowania, zobacz Skalowanie aplikacji w usłudze aplikacja systemu Azure Service. Każde wystąpienie procesu roboczego w planie usługi App Service jest przydzielane kilka portów SNAT. Jeśli rozłożysz użycie na więcej wystąpień, możesz uzyskać użycie portów SNAT na wystąpienie poniżej zalecanego limitu 100 połączeń wychodzących, na unikatowy zdalny punkt końcowy.
  • Rozważ przejście do środowiska App Service Environment (ASE), w którym przydzielono pojedynczy wychodzący adres IP, a limity połączeń i portów SNAT są wyższe. W środowisku ASE liczba portów SNAT na wystąpienie jest oparta na tabeli wstępnej alokacji modułu równoważenia obciążenia platformy Azure. Na przykład środowiska ASE z 1–50 wystąpieniami procesów roboczych mają 1024 wstępnie przydzielane porty na wystąpienie, podczas gdy środowiska ASE z 51–100 wystąpieniami procesów roboczych mają 512 wstępnie alokowanych portów na wystąpienie.

Unikanie limitów ruchu wychodzącego protokołu TCP jest łatwiejsze do rozwiązania, ponieważ limity są ustawiane przez rozmiar procesu roboczego. Limity można zobaczyć w sekcji Limity liczbowe między maszynami wirtualnymi w piaskownicy — połączenia TCP

Nazwa limitu opis Małe (A1) Średnie (A2) Duże (A3) Warstwa izolowana (ASE)
Połączenia Liczba połączeń na całej maszynie wirtualnej 1920 3968 8064 16 000

Aby uniknąć limitów tcp dla ruchu wychodzącego, możesz zwiększyć rozmiar procesów roboczych lub skalować w poziomie.

Pomoc dotycząca rozwiązywania problemów

Znajomość dwóch typów limitów połączeń wychodzących i tego, co robi twoja aplikacja, powinna ułatwić rozwiązywanie problemów. Jeśli wiesz, że aplikacja wykonuje wiele wywołań do tego samego konta magazynu, możesz podejrzewać limit SNAT. Jeśli aplikacja tworzy bardzo dużą liczbę wywołań do różnych punktów końcowych w całym Internecie, podejrzewasz, że osiągasz limit maszyny wirtualnej.

Jeśli nie znasz zachowania aplikacji na tyle, aby szybko określić przyczynę, istnieją pewne narzędzia i techniki dostępne w usłudze App Service, aby pomóc w tym ustaleniu.

Znajdowanie informacji o alokacji portów SNAT

Diagnostyka usługi App Service umożliwia znajdowanie informacji o alokacji portów SNAT i obserwowanie metryki alokacji portów SNAT witryny usługi App Service. Aby znaleźć informacje o alokacji portów SNAT, wykonaj następujące kroki:

  1. Aby uzyskać dostęp do diagnostyki usługi App Service, przejdź do aplikacji internetowej usługi App Service lub środowiska App Service Environment w witrynie Azure Portal. W menu paska bocznego wybierz pozycję Diagnozuj i rozwiąż problemy.
  2. Wybierz kategorię Dostępność i wydajność .
  3. Wybierz kafelek Wyczerpanie portów SNAT na liście dostępnych kafelków w kategorii. Praktyką jest utrzymanie go poniżej 128. Jeśli jest to potrzebne, nadal możesz otworzyć bilet pomocy technicznej, a inżynier pomocy technicznej otrzyma metrykę z zaplecza.

Ponieważ użycie portów SNAT nie jest dostępne jako metryka, nie jest możliwe skalowanie automatyczne na podstawie użycia portów SNAT lub skonfigurowanie skalowania automatycznego na podstawie metryki alokacji portów SNAT.

Połączenia TCP i porty SNAT

Połączenia TCP i porty SNAT nie są bezpośrednio powiązane. Detektor użycia połączeń TCP znajduje się na stronie diagnozowania i rozwiązywania problemów w dowolnej aplikacji usługi App Service. Wyszukaj frazę Połączenia TCP , aby je znaleźć.

  • Porty SNAT są używane tylko dla ruchu sieci zewnętrznej, podczas gdy łączna liczba połączeń TCP obejmuje połączenia lokalne typu loopback.
  • Port SNAT może być współużytkowany przez różne przepływy, jeśli przepływy różnią się w protokole, adresie IP lub porcie. Metryka Połączenia TCP liczy każde połączenie TCP.
  • Limit połączeń TCP występuje na poziomie wystąpienia procesu roboczego. Równoważenie obciążenia wychodzącego usługi Azure Network nie używa metryki Połączenia TCP dla limitu portów SNAT.
  • Limity połączeń TCP opisano w Limity liczbowe połączeń TCP w środowisku piaskownicy dotyczące maszyn wirtualnych.
  • Istniejące sesje TCP kończą się niepowodzeniem po dodaniu nowych wychodzących sesji TCP z portu źródłowego usługi aplikacja systemu Azure. Aby uniknąć konfliktów, możesz użyć jednego adresu IP lub ponownie skonfigurować elementy członkowskie puli zaplecza.
Nazwa limitu opis Małe (A1) Średnie (A2) Duże (A3) Warstwa izolowana (ASE)
Połączenia Liczba połączeń na całej maszynie wirtualnej 1920 3968 8064 16 000

WebJobs i połączenia bazy danych

Jeśli porty SNAT są wyczerpane, a zadania WebJob nie mogą nawiązać połączenia z usługą SQL Database, nie ma metryki pokazującej, ile połączeń jest otwartych przez poszczególne procesy aplikacji internetowej. Aby znaleźć problematyczne zadanie WebJob, przenieś kilka zadań WebJob do innego planu usługi App Service, aby sprawdzić, czy sytuacja się poprawi lub czy problem pozostaje w jednym z planów. Powtarzaj ten proces do momentu znalezienia problematycznego zadania WebJob.