Resolução de erros de ligação de saída intermitente no Serviço de Aplicações do Azure
Este artigo ajuda você a solucionar erros de conexão intermitente e problemas de desempenho relacionados no Serviço de Aplicativo do Azure. Ele fornece mais informações e metodologias de solução de problemas para o esgotamento de portas SNAT (conversão de endereços de rede de origem). Se precisar de mais ajuda em qualquer ponto deste artigo, entre em contato com os especialistas do Azure nos fóruns MSDN Azure e Stack Overflow. Como alternativa, registre um incidente de suporte do Azure. Vá para o site de Suporte do Azure e selecione Obter Suporte.
Sintomas
Os Aplicativos e Funções hospedados no Serviço de Aplicativo do Azure podem apresentar um ou mais dos seguintes sintomas:
- Tempos de resposta lentos em todas ou algumas das instâncias de um plano de serviço.
- Erros intermitentes de 5xx ou Bad Gateway
- Mensagens de erro de tempo limite
- Não foi possível conectar-se a pontos de extremidade externos (como SQLDB, Service Fabric, outros serviços de aplicativo, etc.)
Motivo
A principal causa para problemas de conexão intermitente é atingir um limite ao fazer novas conexões de saída. Os limites que você pode atingir incluem:
- Conexões TCP: Há um limite no número de conexões de saída que podem ser feitas. O limite de ligações de saída está associado ao tamanho da função de trabalho utilizada.
- Portas SNAT: as conexões de saída no Azure descrevem as restrições de porta SNAT e como elas afetam as conexões de saída. O Azure utiliza a tradução de endereços de rede de origem (SNAT) e Balanceadores de Carga (não expostos aos clientes) para comunicar com endereços IP públicos. Cada instância no serviço de Aplicativo do Azure recebe inicialmente um número pré-alocado de 128 portas SNAT. O limite de portas SNAT afeta a abertura de ligações para a mesma combinação de endereço e porta. Se seu aplicativo criar conexões com uma combinação de combinações de endereço e porta, você não usará suas portas SNAT. As portas SNAT são utilizadas na totalidade se tiver chamadas repetidas para a mesma combinação de endereço e porta. Após uma porta ser libertada, fica disponível para reutilização conforme for necessário. O balanceador de carga da Rede do Azure recupera a porta SNAT das ligações fechadas apenas depois de aguardar 4 minutos.
Quando aplicativos ou funções abrem rapidamente uma nova conexão, eles podem esgotar rapidamente sua cota pré-alocada das 128 portas. Eles são bloqueados até que uma nova porta SNAT fique disponível, seja por meio da alocação dinâmica de mais portas SNAT ou da reutilização de uma porta SNAT recuperada. Se seu aplicativo ficar sem portas SNAT, ele terá problemas intermitentes de conectividade de saída.
Evitar o problema
Existem algumas soluções que permitem evitar limitações de porta SNAT. Estas incluem:
- pools de conexões: ao agrupar suas conexões, você evita abrir novas conexões de rede para chamadas para o mesmo endereço e porta.
- pontos de extremidade de serviço: você não tem uma restrição de porta SNAT para os serviços protegidos com pontos de extremidade de serviço.
- pontos de extremidade privados: você não tem uma restrição de porta SNAT para serviços protegidos com pontos de extremidade privados.
- Gateway NAT: Com um gateway NAT, você tem 64k portas SNAT de saída que são utilizáveis pelos recursos que enviam tráfego através dele.
Para evitar o problema da porta SNAT, você impede a criação de novas conexões repetidamente para o mesmo host e porta. Os pools de conexões são uma das maneiras mais óbvias de resolver esse problema.
Se o seu destino for um serviço do Azure que ofereça suporte a pontos de extremidade de serviço, você poderá evitar problemas de exaustão da porta SNAT usando a Integração VNet regional e pontos de extremidade de serviço ou pontos de extremidade privados. Quando você usa a integração de rede virtual regional e coloca pontos de extremidade de serviço na sub-rede de integração, o tráfego de saída do aplicativo para esses serviços não terá restrições de porta SNAT de saída. Da mesma forma, se você usar a integração de rede virtual regional e pontos de extremidade privados, não terá problemas de porta SNAT de saída para esse destino.
Se o seu destino for um ponto de extremidade externo fora do Azure, o uso de um gateway NAT oferece 64 mil portas SNAT de saída. Ele também lhe dá um endereço de saída dedicado que você não compartilha com ninguém.
Se possível, melhore seu código para usar pools de conexões e evitar toda a situação. Nem sempre é possível alterar o código com rapidez suficiente para mitigar essa situação. Para os casos em que você não pode alterar seu código a tempo, aproveite as outras soluções. A melhor solução para o problema é combinar todas as soluções da melhor forma possível. Tente usar pontos de extremidade de serviço e pontos de extremidade privados para serviços do Azure e o gateway NAT para o resto.
As estratégias gerais para reduzir o esgotamento da porta SNAT são discutidas na seção Resolução de problemas da documentação Conexões de saída do Azure . Dessas estratégias, as seguintes são aplicáveis a aplicativos e funções hospedados no serviço de Aplicativo do Azure.
Modificar a aplicação para utilizar os agrupamentos de ligações
- Para agrupar conexões HTTP, revise Conexões HTTP de pool com HttpClientFactory.
- Para obter informações sobre o pool de conexões do SQL Server, consulte Pool de conexões do SQL Server (ADO.NET).
Aqui está uma coleção de links para implementar o pool de conexões por pilha de soluções diferente.
Nó
Por padrão, as conexões para NodeJS não são mantidas ativas. Seguem-se as bases de dados e pacotes populares para agrupamento de ligações com exemplos de como implementá-los.
HTTP Keep-alive
- agentkeepalive
- Node.js v13.9.0 Documentation (Documentação do Node.js v13.9.0)
Java
Abaixo estão as bibliotecas populares usadas para o pool de conexões JDBC que contêm exemplos de como implementá-las: JDBC Connection Pooling.
Agrupamento de Ligações HTTP
PHP
Embora o PHP não ofereça suporte ao pool de conexões, você pode tentar usar conexões de banco de dados persistentes com seu servidor back-end.
Servidor MySQL
- Ligações MySQLi para versões mais recentes
- mysql_pconnect para versões mais antigas do PHP
Outras origens de dados
Python
Abaixo estão os bancos de dados e módulos populares para pool de conexões que contêm exemplos de como implementá-los.
Agrupamento de Ligações HTTP
- O pool de conexões Keep-alive e HTTP é habilitado por padrão no módulo Solicitações .
- Urllib3
Modificar a aplicação para reutilizar ligações
- Para obter mais indicações e exemplos sobre como gerenciar conexões no Azure Functions, consulte Gerenciar conexões no Azure Functions.
Modificar a aplicação para utilizar uma lógica de repetição menos agressiva
- Para obter mais orientações e exemplos, consulte Repetir padrão.
Utilizar as métricas keep alive para repor o tempo limite de inatividade de saída
- Para implementar keepalives para aplicativos Node.js, revise Meu aplicativo de nó está fazendo chamadas de saída excessivas.
Mais orientações específicas para o Serviço de Aplicativo:
- Um teste de carga deve simular dados do mundo real em uma velocidade de alimentação constante. Testar aplicativos e funções sob estresse do mundo real pode identificar e resolver problemas de exaustão da porta SNAT com antecedência.
- Certifique-se de que os serviços de back-end possam retornar respostas rapidamente. Para solucionar problemas de desempenho com o Banco de Dados SQL do Azure, consulte Solucionar problemas de desempenho do Banco de Dados SQL do Azure com o Intelligent Insights.
- Expanda o plano do Serviço de Aplicativo para mais instâncias. Para obter mais informações sobre dimensionamento, consulte Dimensionar um aplicativo no Serviço de Aplicativo do Azure. Cada instância de trabalho em um plano de serviço de aplicativo recebe um número de portas SNAT. Se você distribuir seu uso por mais instâncias, poderá obter o uso da porta SNAT por instância abaixo do limite recomendado de 100 conexões de saída, por ponto de extremidade remoto exclusivo.
- Considere mudar para o Ambiente do Serviço de Aplicativo (ASE), onde você recebe um único endereço IP de saída e os limites para conexões e portas SNAT são maiores. Em um ASE, o número de portas SNAT por instância é baseado na tabela de pré-alocação do balanceador de carga do Azure. Por exemplo, um ASE com 1-50 instâncias de trabalho tem 1024 portas pré-alocadas por instância, enquanto um ASE com 51-100 instâncias de trabalho tem 512 portas pré-alocadas por instância.
Evitar os limites TCP de saída é mais fácil de resolver, pois os limites são definidos pelo tamanho do seu trabalhador. Você pode ver os limites em Sandbox Cross VM Numerical Limits - TCP Connections
Nome do limite | Description | Pequena (A1) | Média (A2) | Grande (A3) | Nível isolado (ASE) |
---|---|---|---|---|---|
Ligações | Número de conexões em toda a VM | 1920 | 3968 | 8064 | 16 000 |
Para evitar limites de TCP de saída, você pode aumentar o tamanho de seus funcionários ou dimensionar horizontalmente.
Resolução de Problemas
Conhecer os dois tipos de limites de conexão de saída e o que seu aplicativo faz deve facilitar a solução de problemas. Se você souber que seu aplicativo faz muitas chamadas para a mesma conta de armazenamento, poderá suspeitar de um limite de SNAT. Se seu aplicativo criar muitas chamadas para pontos de extremidade em toda a Internet, você suspeitará que está atingindo o limite de VM.
Se você não souber o comportamento do aplicativo o suficiente para determinar a causa rapidamente, existem algumas ferramentas e técnicas disponíveis no Serviço de Aplicativo para ajudar nessa determinação.
Localizar informações de alocação de porta SNAT
Você pode usar o Diagnóstico do Serviço de Aplicativo para localizar informações de alocação de porta SNAT e observar a métrica de alocação de portas SNAT de um site do Serviço de Aplicativo. Para localizar informações de alocação de porta SNAT, execute as seguintes etapas:
- Para acessar o diagnóstico do Serviço de Aplicativo, navegue até seu aplicativo Web do Serviço de Aplicativo ou Ambiente do Serviço de Aplicativo no portal do Azure. Na navegação à esquerda, selecione Diagnosticar e resolver problemas.
- Selecione a categoria de disponibilidade e desempenho
- Selecione o bloco Exaustão da porta SNAT na lista de blocos disponíveis na categoria. A prática é mantê-lo abaixo de 128. Se você precisar, ainda pode abrir um tíquete de suporte, e o engenheiro de suporte obterá a métrica do back-end para você.
Como o uso da porta SNAT não está disponível como métrica, não é possível dimensionar automaticamente com base no uso da porta SNAT ou configurar a escala automática com base na métrica de alocação de portas SNAT.
Conexões TCP e portas SNAT
As conexões TCP e as portas SNAT não estão diretamente relacionadas. Um detetor de uso de conexões TCP está incluído na página de gerenciamento Diagnosticar e Resolver Problemas de qualquer aplicativo do Serviço de Aplicativo. Procure a frase "conexões TCP" para encontrá-la.
- As portas SNAT são usadas apenas para fluxos de rede externa, enquanto o total de conexões TCP inclui conexões de loopback local.
- Uma porta SNAT pode ser compartilhada por fluxos diferentes, se os fluxos forem diferentes em qualquer protocolo, endereço IP ou porta. A métrica Conexões TCP conta todas as conexões TCP.
- O limite de conexões TCP acontece no nível da instância de trabalho. O balanceamento de carga de saída da Rede do Azure não usa a métrica Conexões TCP para limitação de porta SNAT.
- Os limites de conexões TCP são descritos em Sandbox Cross VM Numerical Limits - TCP Connections
- As sessões TCP existentes falham quando novas sessões TCP de saída são adicionadas da porta de origem do Serviço de Aplicativo do Azure. Você pode usar um único IP ou reconfigurar os membros do pool de back-end para evitar conflitos.
Nome do limite | Description | Pequena (A1) | Média (A2) | Grande (A3) | Nível isolado (ASE) |
---|---|---|---|---|---|
Ligações | Número de conexões em toda a VM | 1920 | 3968 | 8064 | 16 000 |
WebJobs e conexões de banco de dados
Se as portas SNAT estiverem esgotadas e os WebJobs não puderem se conectar ao Banco de dados SQL, não haverá nenhuma métrica para mostrar quantas conexões são abertas por cada processo de aplicativo Web individual. Para encontrar o WebJob problemático, mova vários WebJobs para outro plano do Serviço de Aplicativo para ver se a situação melhora ou se um problema permanece em um dos planos. Repita o processo até encontrar o WebJob problemático.
Informações adicionais
- SNAT with App Service (SNAT com Serviço de Aplicações)
- Resolver problemas de desempenho lento das aplicações Web no Serviço de Aplicações do Azure