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). Caso precise de mais ajuda em qualquer ponto neste artigo, entre em contato com os especialistas do Azure nos fóruns do Azure e do Stack Overflow do MSDN. Como alternativa, você pode registrar um incidente no 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 Azure App podem apresentar um ou mais dos seguintes sintomas:

  • 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 conectar-se a pontos de extremidade externos (como SQLDB, Service Fabric, outros serviços do App, etc.)

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 for liberada, a porta estará disponível para reutilização conforme necessário. O balanceador de carga de Rede do Azure recupera a porta SNAT de conexões fechadas somente depois de aguardar por 4 minutos.

Quando aplicativos ou funções abrem rapidamente uma nova conexão, eles podem esgotar rapidamente a cota pré-alocada das 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 de conectividade de saída intermitente.

Evitar o problema

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

  • 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 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, você poderá evitar problemas de esgotamento de 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 VNet 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 VNet 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.

As estratégias gerais para mitigar o esgotamento de porta SNAT são discutidas na Seção de solução de problemas da documentação de Conexões de saída do Azure. Dentre essas estratégias, as seguintes são aplicáveis a aplicativos e funções hospedados no serviço Azure App.

Modificar o aplicativo para usar o pooling de conexão

Aqui está uma coleção de links para implementar o pool de conexões por pilha de solução diferente.

Por padrão, as conexões para NodeJS não são mantidas ativas. Abaixo estão os bancos de dados e pacotes para o pool de conexões populares com exemplos de como implementá-los.

Keep-Alive de HTTP

Java

Abaixo estão bibliotecas populares usadas para pool de conexões JDBC com exemplos de como implementá-las: Pool de Conexões JDBC.

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.

Python

Abaixo estão os bancos de dados e módulos para pacotes para o pool de conexões com exemplos de como implementá-los.

Pool de conexões HTTP

Modificar o aplicativo para reutilizar conexões

Modificar o aplicativo para usar uma lógica de repetição menos agressiva

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

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 os problemas de esgotamento de 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.

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 VM.

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 painel de navegação esquerdo, selecione Diagnosticar e resolver problemas.
  2. Selecionar 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 fazer o dimensionamento automático 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 Resolver Problemas de qualquer aplicativo do Serviço de Aplicativo. Pesquise a frase "conexões TCP" para encontrá-lo.

  • As portas SNAT são usadas somente para fluxos de rede externos, enquanto que 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

Conexões de WebJobs e 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.

Informações adicionais