Rozwiązywanie problemów powodowanych przez sporadyczne błędy 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 na forach MSDN Azure i Stack Overflow. Alternatywnie utwórz zdarzenie pomoc techniczna platformy Azure. Przejdź do witryny pomocy technicznej platformy Azure i wybierz pozycję Uzyskaj pomoc techniczną.
Objawy
Aplikacje i funkcje hostowane w usłudze aplikacja systemu Azure mogą wykazywać co najmniej jeden z następujących objawów:
- Wolne czasy odpowiedzi dla wszystkich lub niektórych wystąpień w planie usługi.
- Sporadyczne błędy 5xx lub nieprawidłowej 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, inne usługi App Services itp.)
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łączenie 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 jest on dostępny do ponownego użycia w razie potrzeby. Moduł równoważenia obciążenia sieci platformy Azure odzyskuje port SNAT z zamkniętych połączeń dopiero po odczekaniu 4 minut.
Gdy aplikacje lub funkcje szybko otwierają nowe połączenie, mogą szybko wyczerpać przydział wstępnie przydzielony limit przydziału 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 do 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łączenie ion są jednym 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 regionalnych punktów końcowych integracji i usługi sieci wirtualnej lub prywatnych punktów końcowych. W przypadku korzystania z regionalnej integracji z siecią wirtualną i umieszczania punktów końcowych usługi w podsieci integracji ruch wychodzący aplikacji do tych usług nie będzie miał ograniczeń dotyczących wychodzących portów SNAT. Podobnie, jeśli używasz regionalnej integracji z siecią wirtualną 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.
Ogólne strategie ograniczania wyczerpania portów SNAT zostały omówione w sekcji Rozwiązywanie problemów w dokumentacji połączeń wychodzących platformy Azure. Poniższe strategie dotyczą aplikacji i funkcji hostowanych w usłudze aplikacja systemu Azure.
Modyfikowanie aplikacji w celu używania puli połączeń
- W przypadku buforowania połączeń HTTP zapoznaj się z artykułem Pool HTTP connections with HttpClientFactory (Buforowanie połączeń HTTP za pomocą elementu HttpClientFactory).
- Aby uzyskać informacje na temat buforowania połączeń z programem SQL Server, zapoznaj się z tematem SQL Server Połączenie ion Pooling (ADO.NET).
Oto zbiór linków do implementowania buforowania Połączenie ion za pomocą innego stosu rozwiązań.
Węzeł
Domyślnie połączenia dla środowiska NodeJS nie są zachowywane. Poniżej znajdują się popularne bazy danych i pakiety dla buforowania połączeń, które zawierają przykłady implementacji.
Utrzymywanie aktywności połączenia HTTP
Java
Poniżej przedstawiono popularne biblioteki używane do buforowania połączeń JDBC, które zawierają przykłady implementacji: JDBC Połączenie ion Pooling.
Buforowanie 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.
Serwer MySQL
- Połączenia MySQLi dla nowszych wersji
- mysql_pconnect dla starszych wersji języka PHP
Inne źródła danych
Python
Poniżej przedstawiono popularne bazy danych i moduły do buforowania połączeń, które zawierają przykłady implementacji.
Buforowanie połączeń HTTP
- Obsługa aktywności i buforowanie połączeń HTTP są domyślnie włączone w module Żądania .
- Urllib3
Modyfikowanie aplikacji w celu ponownego używania 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.
Modyfikowanie aplikacji w celu używania łagodniejszej logiki ponawiania prób
- Aby uzyskać więcej wskazówek i przykładów, zapoznaj się ze wzorcem ponawiania prób.
Używanie elementów utrzymywania aktywności w celu resetowania limitu czasu bezczynności połączeń wychodzących
- Aby zaimplementować elementy keepalives dla aplikacji Node.js, zapoznaj się z artykułem Moja aplikacja węzła wykonuje nadmierne wywołania wychodzące.
Więcej wskazówek dotyczących usługi App Service:
- Test obciążeniowy powinien symulować dane w świecie rzeczywistym w stałej szybkości karmienia. Testowanie aplikacji i funkcji pod obciążeniem rzeczywistym może identyfikować i rozwiązywać problemy z wyczerpaniem portów SNAT przed upływem czasu.
- Upewnij się, że usługi zaplecza mogą szybko zwracać odpowiedzi. Aby rozwiązać problemy z wydajnością usługi Azure SQL Database, zapoznaj się z tematem Rozwiązywanie problemów z wydajnością usługi Azure SQL Database przy użyciu usługi Intelligent Szczegółowe informacje.
- 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łączenie 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.
Rozwiązywanie 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 wiele wywołań do punktów końcowych przez Internet, podejrzewasz, że osiągniesz 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:
- 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 obszarze nawigacji po lewej stronie wybierz pozycję Diagnozuj i rozwiąż problemy.
- Wybierz kategorię dostępności i wydajności
- 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łączenie 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 ją znaleźć.
- Porty SNAT są używane tylko dla przepływów sieci zewnętrznej, podczas gdy łączna liczba Połączenie TCP obejmuje lokalne połączenia sprzężenia zwrotnego.
- 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łączenie ions protokołu 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łączenie ions protokołu TCP na potrzeby ograniczania portów SNAT.
- Limity połączeń TCP opisano w artykule Limity liczbowe między maszynami wirtualnymi piaskownicy — Połączenie tcp
- 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 |
Połączenia zadań WebJob i 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.