Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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, contacte os especialistas do Azure no Suporte da Comunidade do Azure. Como alternativa, você pode registrar um incidente de suporte do Azure. Vá para Suporte do Azure e selecione Enviar um tíquete de suporte.
Sintomas
Os aplicativos e funções hospedados no Serviço de Aplicativo do Azure podem apresentar um ou mais dos seguintes problemas:
- 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 de espera.
- Não foi possível conectar-se a pontos de extremidade externos (como SQLDB, Service Fabric ou outros serviços de aplicativo).
Causa
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. Quando uma porta é liberada, ela fica disponível para reutilização conforme necessário. O balanceador de carga da Rede do Azure recupera portas SNAT de conexões fechadas somente depois de aguardar por 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 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 serviços protegidos através de pontos de extremidade de serviço.
- Endpoints privados: Você não tem uma restrição de porta SNAT para serviços protegidos com endpoints 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 esgotamento de porta SNAT usando integração de rede virtual regional e pontos de extremidade de serviço ou pontos de extremidade privados. Quando tu usas a integração de rede virtual regional e colocas pontos de extremidade de serviço na sub-rede de integração, o tráfego de saída da tua aplicação para esses serviços não terá restrições de portas SNAT de saída. Da mesma forma, se o utilizador usar a integração de rede virtual regional e pontos de extremidade privados, não enfrentará 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.
Para saber mais sobre estratégias para reduzir o esgotamento da porta SNAT, consulte Usar SNAT para conexões de saída. Dessas estratégias, as seguintes são aplicáveis a aplicativos e funções hospedados no serviço de Aplicativo do Azure.
Utilizar o pool de conexõ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).
Os artigos a seguir descrevem a implementação de pooling de conexões pelas diferentes pilhas de soluções.
Nó
Por padrão, as conexões para Node.js não são mantidas vivas.
HTTP keep-alive
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 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
Píton
Pool de conexões HTTP
- O pool de conexões Keep-alive e HTTP é habilitado por padrão no módulo Solicitações .
- Urllib3
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.
Use uma lógica de repetição menos agressiva
Para obter mais orientações e exemplos, consulte Retry pattern.
Utilize keepalives para redefinir o tempo limite ocioso de saída
Para implementar keepalives em aplicações Node.js, consulte A minha aplicação Node.js está a fazer chamadas externas 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 1.024 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 | Descrição | 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.
Ajuda de 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 a sua aplicação criar um grande número de chamadas para endpoints na internet, poderá suspeitar que está a atingir o limite da máquina virtual.
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. No menu da barra lateral, selecione Diagnosticar e resolver problemas.
- Selecione a categoria 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 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 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. Pesquise pela frase conexões TCP para a encontrar.
- 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 | Descrição | 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.
Conteúdo relacionado
- 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