Compartilhar via


Solucionar problemas de erros de conexão de saída intermitente no Serviço de Aplicativo do Azure

Este artigo ajuda você a solucionar problemas de erros de conexão intermitente e problemas de desempenho relacionados no Serviço de Aplicativo do Azure. Ela fornece mais informações e metodologias de solução de problemas para o esgotamento de portas de conversão de endereços de rede de origem (SNAT). Se você precisar de mais ajuda a qualquer momento neste artigo, entre em contato com os especialistas do Azure no Suporte à Comunidade do Azure. Como alternativa, você pode registrar um incidente de suporte do Azure. Acesse o suporte do Azure e selecione Enviar um tíquete de suporte.

Sintomas

Aplicativos e funções hospedados no serviço de Aplicativo do Azure podem exibir um ou mais dos seguintes problemas:

  • Tempos de resposta lentos em todas as instâncias ou algumas delas em um plano de serviço.
  • Erros intermitentes 5xx ou Gateway inválido.
  • Mensagens de erro de tempo limite.
  • Não foi possível se conectar a pontos de extremidade externos (como SQLDB, Service Fabric ou outros serviços de aplicativo).

Causa

A principal causa de 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 conexões de saída é associado ao tamanho da função de trabalho usada.
  • Portas SNAT: Conexões de saída no Azure descreve as restrições de porta SNAT e como elas afetam as conexões de saída. O Azure usa conversão de endereços de rede de origem (SNAT) e balanceadores de carga (não expostos aos clientes) para se comunicar com endereços IP públicos. Inicialmente, cada instância no serviço de Aplicativo Azure recebe um número pré-alocado de portas SNAT 128. O limite de porta SNAT afeta a abertura de conexões com a mesma combinação de endereço e porta. Se o aplicativo cria conexões com um mix de combinações de endereços e portas, você não usará todas as portas SNAT. As portas SNAT são esgotadas quando você tem chamadas repetidas para a mesma combinação de endereço e porta. Depois que uma porta é liberada, a porta está disponível para reutilização conforme necessário. O balanceador de carga de Rede do Azure recupera portas SNAT de conexões fechadas somente depois de esperar quatro minutos.

Quando aplicativos ou funções abrem rapidamente uma nova conexão, eles podem esgotar rapidamente sua cota pré-alocada de 128 portas. Eles serão bloqueados até que uma nova porta SNAT fique disponível, seja por meio da alocação dinâmica de mais portas SNAT ou pela reutilização de uma porta SNAT recuperada. Se o aplicativo ficar sem portas SNAT, ele terá problemas intermitentes de conectividade de saída.

Evitar o problema

Há algumas soluções que possibilitam evitar limitações da porta SNAT. Entre elas estão:

  • Pools de conexão: 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 serviços protegidos com pontos de extremidade de serviço.
  • Endpoints privados: não existe uma restrição de porta SNAT para serviços protegidos com endpoints privados.
  • Gateway NAT: com um gateway NAT, você tem portas SNAT de saída de 64 k que podem ser utilizadas pelos recursos que enviam tráfego por ele.

Para evitar o problema de porta SNAT, previna a criação de novas conexões repetidamente para o mesmo host e porta. Os pools de conexão são um dos meios mais óbvios de resolver esse problema.

Se o destino for um serviço do Azure que dá suporte a pontos de extremidade de serviço, é possível evitar problemas de esgotamento de porta SNAT usando integração de rede virtual 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á nenhum problema de porta SNAT de saída para esse destino.

Se o destino for um ponto de extremidade externo ao Azure, o uso de um gateway NAT fornecerá portas SNAT de saída de 64 k. Isso também fornece um endereço de saída dedicado que você não compartilha com ninguém.

Se possível, aprimore seu código para usar pools de conexão e evitar a situação inteira. Nem sempre é possível alterar o código rápido o suficiente para atenuar 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 os serviços do Azure e o gateway NAT para o restante.

Para saber mais sobre estratégias para atenuar o esgotamento da porta SNAT, consulte Usar SNAT para conexões de saída. Dentre essas estratégias, as seguintes são aplicáveis a aplicativos e funções hospedados no serviço Azure App.

Uso de agrupamento de conexões

Os artigos a seguir descrevem a implementação do pool de conexões por diferentes stacks de soluções.

Por padrão, as conexões para Node.js não são mantidas ativas.

Keep-alive de HTTP

Java

Pool de conexões JDBC (Java Database Connectivity)

Pool de conexõ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 para o servidor de back-end.

Pitão

Pool de conexões HTTP

Reutilizar conexões

Para obter mais ponteiros e exemplos sobre como gerenciar conexões em funções do Azure, consulte Gerenciar conexões no Azure Functions.

Usar lógica de repetição menos agressiva

Para obter mais diretrizes e exemplos, consulte padrão de repetição.

Usar keepalives para redefinir o tempo limite ocioso de saída

Para implementar keepalives para aplicativos Node.js, consulte Meu aplicativo de nó está fazendo chamadas de saída excessivas.

Mais diretrizes 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 esgotamento da porta SNAT com antecedência.
  • Verifique se os serviços de back-end podem retornar respostas rapidamente. Para solucionar problemas de desempenho com o Banco de Dados SQL do Azure, reveja Solucionar problemas de desempenho do Banco de Dados SQL do Azure com o Intelligent Insights.
  • Escale horizontalmente o plano do Serviço de Aplicativo para mais instâncias. Para saber mais sobre como dimensionar, consulte Escalar um aplicativo no Serviço de Aplicativo do Azure. Cada instância de trabalho em um plano do serviço de aplicativo é alocada a um número de portas SNAT. Se você distribuir seu uso em mais instâncias, poderá obter o uso de porta SNAT por instância abaixo do limite recomendado de 100 conexões de saída, por ponto de extremidade remoto exclusivo.
  • Considere a mudança para Ambiente do Serviço de Aplicativo (ASE), em que um único endereço IP de saída é alocado para você 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 a 50 instâncias de trabalho tem 1.024 portas pré-alocadas por instância, enquanto um ASE com 51 a 100 instâncias de trabalho tem 512 portas pré-alocadas por instância.

Evitar os limites de TCP de saída é mais fácil de resolver, pois os limites são definidos pelo tamanho do trabalho. Você pode ver os limites em Limites numéricos de VM entre Área restrita - Conexões TCP

Nome do limite Descrição Pequeno (A1) Médio (A2) Grande (A3) Camada isolada (ASE)
conexões Número de conexões entre a VM inteira 1920 3968 8064 16.000

Para evitar limites de TCP de saída, você pode aumentar o tamanho dos seus trabalhos ou escalar horizontalmente.

Ajuda para a solução de problemas

Conhecer os dois tipos de limites de conexão de saída e o que o 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, pode suspeitar de um limite de SNAT. Se o aplicativo cria muitas chamadas para pontos de extremidade pela Internet, você pode suspeitar que está atingindo o limite da máquina virtual.

Se você não conhecer o comportamento do aplicativo o suficiente para determinar a causa rapidamente, há algumas ferramentas e técnicas disponíveis no Serviço de Aplicativo para ajudar com essa 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, siga as etapas a seguir:

  1. 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. No menu da barra lateral, selecione Diagnosticar e resolver problemas.
  2. Selecione a categoria Disponibilidade e Desempenho .
  3. Selecione bloco Esgotamento de Porta SNAT na lista de blocos disponíveis na categoria. A prática é mantê-lo abaixo de 128. Se você precisar dele, ainda poderá 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 uma métrica, não é possível dimensionar automaticamente com base no uso da porta SNAT ou configurar o dimensionamento automático 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 detector de uso de conexões TCP está incluído na página de gerenciamento Diagnosticar e Solucionar Problemas de qualquer app do Serviço de Aplicativo. Pesquise a frase conexões TCP para encontrá-la.

  • As portas SNAT são usadas apenas para fluxos de rede externos, enquanto o total de conexões TCP inclui conexões de loopback locais.
  • Uma porta SNAT pode ser compartilhada por fluxos diferentes, caso os fluxos sejam diferentes em qualquer protocolo, endereço IP ou porta. A métrica de conexões TCP conta cada conexão TCP.
  • O limite de conexões TCP ocorre no nível de instância de trabalho. O balanceamento de carga de saída de rede do Azure não usa a métrica de conexões TCP para limitação de porta SNAT.
  • Os limites de conexões TCP são descritos em Limites numéricos de VM entre Área restrita - Conexões TCP.
  • 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 membros do pool de membros de back-end para evitar conflitos.
Nome do limite Descrição Pequeno (A1) Médio (A2) Grande (A3) Camada isolada (ASE)
conexões Número de conexões entre a VM inteira 1920 3968 8064 16.000

WebJobs e conexões de banco de dados

Se as portas SNAT se esgotam e os WebJobs não conseguem se conectar ao Banco de Dados SQL, não há nenhuma métrica para mostrar quantas conexões são abertas por cada processo de aplicativo Web individual. Para encontrar o WebJob com problema, 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 com problema.