01
O recurso que acaba primeiro não aparece em nenhum painel padrão
Todo painel de serviço mede as mesmas quatro coisas: uso de processador, uso de memória, latência e taxa de erro. Quando a porta efêmera acaba, três dessas quatro permanecem exatamente onde estavam. O processador fica baixo porque o processo não está trabalhando, está falhando cedo. A memória não se move porque nenhuma alocação nova aconteceu. A latência do que ainda passa continua normal porque o serviço que responde está saudável. Apenas a taxa de erro sobe, e ela sobe com uma mensagem que raramente é associada à sua causa real, porque a mensagem fala em endereço e a causa fala em porta.
A mensagem que o sistema operacional devolve é a de que não foi possível atribuir o endereço solicitado. Ela é gerada no momento em que o processo pede uma conexão de saída e o núcleo não encontra nenhuma porta de origem livre para associar àquela conexão. Nada nessa frase menciona porta, esgotamento ou limite, e é por isso que o erro é tão frequentemente diagnosticado como problema de rede, de DNS ou de firewall. O time olha para fora quando o recurso que acabou está dentro da própria máquina.
A segunda propriedade desagradável desse incidente é o formato de recuperação. Reiniciar o processo funciona, porque o reinício fecha todos os soquetes abertos pelo processo e libera as portas associadas. Isso cria uma narrativa enganosa dentro do time: o problema é resolvido por reinício, logo deve ser vazamento de memória, ou algum estado corrompido, ou uma biblioteca com defeito. Na verdade o reinício está apenas devolvendo o recurso ao sistema, e o intervalo entre reinícios é exatamente o tempo que o serviço leva para consumir a faixa inteira de portas de novo. Um intervalo estável de quarenta minutos entre falhas é uma assinatura forte desse esgotamento, porque ele indica consumo linear de um recurso finito e não um defeito aleatório.
| Sintoma observado | Diagnóstico usual do time | Causa real quando é porta efêmera | Verificação que separa os dois |
|---|---|---|---|
| Erro de atribuição de endereço nas chamadas de saída | Problema de rede ou de resolução de nome | Nenhuma porta de origem livre na faixa configurada | Contar soquetes por estado na máquina de origem, não testar conectividade |
| Reinício resolve por dezenas de minutos e o erro volta | Vazamento de memória ou estado corrompido | Consumo linear da faixa até o limite, zerado pelo reinício | Medir o intervalo entre falhas: estável indica recurso finito |
| Tráfego de entrada plano durante todo o incidente | Falha do serviço de destino | Cada requisição de entrada abre várias conexões de saída novas | Comparar requisições por segundo com conexões de saída por segundo |
| Milhares de soquetes em espera final | Conexões travadas que precisam ser mortas | Comportamento normal do protocolo após fechamento ativo | Verificar se o total se aproxima do tamanho da faixa de portas |
| Só uma instância falha enquanto as outras seguem bem | Instância defeituosa, basta substituir | Distribuição desigual de destinos entre instâncias | Agrupar conexões por endereço de destino em cada instância |
A última linha da tabela é a que mais atrasa diagnóstico em ambiente com várias réplicas. Como o esgotamento depende da combinação entre origem e destino, e não apenas do volume total, é perfeitamente possível que uma instância que conversa predominantemente com um único destino quebre enquanto as vizinhas, com a mesma carga mas destinos mais espalhados, continuem saudáveis. Substituir a instância faz o sintoma sumir por alguns minutos e reforça a conclusão errada de que o problema era da máquina.