Guia do Lag em Jogos › Buscar por sintoma
Não conecta / loading infinito: 45 causas e quem resolve
Também chamado de: não consigo logar, loading não termina
Abrir no catálogo de sintomas ilustrado →
Você não consegue entrar no jogo ou fica preso na tela de carregamento ou de entrada.
“Não foi possível conectar ao servidor” repetidas vezes, barra de carregamento que nunca termina depois de escolher o personagem.
O que recebe as conexões novas (fila de conexões do servidor, firewall, servidor de login, banco de dados) está lotado. É especialmente comum logo depois de uma manutenção.
Causas deste sintoma
L2 SO e dispositivo do cliente
- Inspeção de pacotes por software de segurança: Quando o antivírus ou o firewall inspeciona cada pacote, a latência aumenta e, se a inspeção for agressiva demais, ele toma o jogo por um ataque e o bloqueia. (Externo (Externo))
L3 Rede doméstica
L4 Conexão de internet
- Restrição de UDP e inspeção de pacotes por país ou operadora: Algumas redes bloqueiam endereços e portas UDP específicos ou limitam a velocidade do UDP, e equipamentos de inspeção de pacotes filtram protocolos que não reconhecem. Jogos que se comunicam por UDP não conectam nessas redes ou caem com frequência. (Externo (Externo))
- Falha ou lentidão no DNS: Se o DNS, que traduz nomes de servidor em endereços, está lento ou falha, o jogo não encontra os servidores de login e de patch. (Externo (Externo))
- Links compartilhados saturados por DDoS: Ataques volumosos contra a empresa do jogo, ou contra outro alvo na mesma rede, lotam os links compartilhados. (Infraestrutura de rede (Equipe de infraestrutura))
- IP compartilhado pela operadora (CGNAT): Redes móveis e algumas operadoras fazem vários assinantes dividirem um mesmo IP e apagam em pouco tempo o mapeamento das conexões ociosas. (Desenvolvimento do cliente (Equipe de desenvolvimento))
- Tráfego via VPN ou redutor de ping: Com uma VPN ou um redutor de ping ligado, os pacotes passam pelos servidores intermediários (relays) dessa empresa. Se o relay estiver longe ou congestionado, a conexão pode até ficar mais lenta. (Externo (Externo))
L5 Equipamentos de rede do data center
- Tabela de sessões do firewall cheia: O firewall registra na tabela de sessões cada conexão que deixa passar, para rastreá-la. Quando a tabela enche, ele não aceita novas conexões. (Infraestrutura de rede (Equipe de infraestrutura))
- Desvio pela proteção contra DDoS e falsos positivos: Quando o tráfego é desviado para um centro de scrubbing para barrar ataques, a rota fica mais longa, e às vezes jogadores legítimos são tomados por atacantes e bloqueados. (Infraestrutura de rede (Equipe de infraestrutura))
- Limite de conexões e portas do gateway NAT na nuvem: As conexões que servidores em uma sub-rede privada abrem para fora (autenticação da plataforma, pagamentos, APIs externas) passam pelo gateway NAT, que troca o endereço e a porta. Se as conexões simultâneas para o mesmo destino passam do limite de portas do gateway, as novas conexões falham. (Infraestrutura de rede (Equipe de infraestrutura))
- Desbalanceamento do load balancer e health check enganoso: As conexões se concentram em um único servidor, ou jogadores continuam sendo mandados para um servidor que já caiu. (Infraestrutura de rede (Equipe de infraestrutura))
- MTU incompatível (só os pacotes grandes somem): Se o MTU (o tamanho máximo que dá para enviar de uma vez) diminui em algum trecho do caminho e os avisos de pacote grande demais são bloqueados, só os pacotes grandes continuam sumindo. (Infraestrutura de rede (Equipe de infraestrutura))
L7 SO do servidor (kernel)
- Estouro da fila de conexões (backlog): Quando dezenas de milhares de jogadores se conectam ao mesmo tempo logo após a manutenção, a fila de conexões (backlog) do kernel transborda e as tentativas de conexão são descartadas. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Limite de descritores de arquivo: Cada conexão precisa de um descritor de arquivo (fd, o número que o SO atribui a cada arquivo ou socket aberto), e o número de fds que um processo pode abrir é limitado. (Infraestrutura de servidores (Equipe de infraestrutura))
- Tabela do conntrack cheia no servidor: Quando a tabela de rastreamento de conexões (conntrack), em que o firewall do Linux registra todas as conexões, chega ao limite, os pacotes novos são descartados. (Infraestrutura de servidores (Equipe de infraestrutura))
- Esgotamento de portas efêmeras em conexões entre servidores: Quando o servidor do jogo abre e fecha conexões curtas com frequência para o BD ou outros servidores, as conexões encerradas seguram a porta por um tempo e não dá para abrir conexões novas. (Desenvolvimento do servidor (Equipe de desenvolvimento))
L8 Sockets e protocolos
- Keepalive com valor padrão de 2 horas: Quando o outro lado some sem sinal de encerramento, o TCP só percebe muito depois. O keepalive (recurso do TCP que verifica se uma conexão ociosa continua viva) vem desligado por padrão e, mesmo ligado, só começa a verificar depois de 2 horas de inatividade. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Distribuição desbalanceada do SO_REUSEPORT: Quando vários processos dividem a mesma porta, o kernel escolhe o processo responsável por cada conexão pelo hash do endereço e não muda mais. Se um desses processos para, só os jogadores atribuídos a ele ficam esperando. (Desenvolvimento do servidor (Equipe de desenvolvimento))
L9 Processo do jogo no servidor
- Esgotamento do pool de threads: Quando todas as worker threads que processam tarefas ficam presas em trabalhos lentos, os pedidos novos ficam esperando indefinidamente. (Desenvolvimento do servidor (Equipe de desenvolvimento))
L11 Disco
- Gravação de core dump: Quando o servidor cai, gravar no disco vários GB de memória pode atrasar o reinício em vários minutos. (Infraestrutura de servidores (Equipe de infraestrutura))
L12 Banco de dados
- Query sem índice: Sem índice, para achar as linhas que atendem à condição é preciso ler a tabela inteira (full scan). (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Esgotamento do pool de conexões: O número de conexões abertas com o BD é fixo; quando queries lentas ocupam as conexões, as demais requisições esperam. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Cache frio (logo após reiniciar): Quando o BD reinicia, o cache em memória está vazio, e por um tempo todas as leituras vêm do disco. (Infraestrutura de banco de dados (Equipe de infraestrutura))
- Avalanche de logins e queries N+1: Se carregar um personagem exige dezenas de consultas separadas, dezenas de milhares de logins simultâneos viram milhões de queries. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Failover do banco de dados: Quando o BD primário cai, não dá para gravar durante a troca para o BD reserva, e os últimos dados que não foram replicados podem se perder. (Infraestrutura de banco de dados (Equipe de infraestrutura))
- Cache stampede: Quando o cache de dados populares expira todo ao mesmo tempo, milhares de requisições caem de uma vez no BD. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Comandos lentos no Redis: O Redis processa um comando de cada vez, então um único comando lento bloqueia todas as requisições que vêm atrás. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Query lenta por mudança no plano de execução: O código continua igual, mas, se o BD muda a forma de executar a mesma query (plano de execução), uma query que levava 2 ms ontem passa a levar centenas de ms hoje. (Infraestrutura de banco de dados (Equipe de infraestrutura))
- Lock de alteração de schema (DDL) em produção: Adicionar uma coluna ou um índice a uma tabela com o jogo no ar exige um lock por um instante, e só esse lock pode deixar esperando todas as requisições que usam a tabela. (Infraestrutura de banco de dados (Equipe de infraestrutura))
L13 Arquitetura e operação de servidores
- Troca de mapa (transferência entre servidores): Ao entrar em outro mapa ou dungeon, os dados do personagem passam para outro servidor, e esse processo gera atrasos e falhas. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Falha em cascata: Quando um serviço fica lento, os servidores que o chamam ficam presos esperando a resposta, e até funções sem relação com ele param. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Falha em servidor auxiliar: Quando falha um servidor que roda separado do servidor do jogo, como chat, party ou casa de leilões, só aquela função para de funcionar. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Deploy e reinício: Quando os servidores são reiniciados para uma atualização sem transferir as conexões, os jogadores daquele servidor são desconectados, e os salvamentos logo antes do desligamento e as reconexões chegam todos de uma vez. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Demora do autoscaling: Quando o número de jogadores dispara, novos servidores sobem automaticamente, mas a preparação leva alguns minutos, e nesse meio-tempo os servidores existentes ficam sobrecarregados. (Infraestrutura de servidores (Equipe de infraestrutura))
- Dependência de serviços externos: Quando um serviço externo, como login da plataforma, pagamento ou verificação de identidade, fica lento ou para, o jogador fica preso nessa etapa. (Externo (Externo))
- Certificado TLS expirado ou mal configurado: Quando o certificado do servidor de login, de API ou de patch expira, ou falta o certificado intermediário, a conexão TLS dos clientes que se conectam a partir desse momento falha. (Infraestrutura de rede (Equipe de infraestrutura))
- Limite da fila de login e pouca tolerância para reconexão: Quando as conexões se acumulam logo após um lançamento ou manutenção, a fila de login bate no limite e passa a recusar novas entradas, e quem estava esperando e cai por um instante perde a posição e volta para o fim da fila. (Desenvolvimento do servidor (Equipe de desenvolvimento))
Design de sincronização
Problemas que só afetam alguns
- Personagem com dados grandes demais: Um personagem com milhares de itens ou mensagens no correio acumulados, ou com listas de amigos e bloqueados ou buffs fora do comum, tem várias vezes mais dados para carregar no login, salvar e enviar aos jogadores próximos. Fica lento só com esse personagem, seja qual for a conexão. (Desenvolvimento do servidor (Equipe de desenvolvimento))
- Conflito de porta UDP fixa: Se o cliente foi feito para usar uma porta local fixa, o segundo cliente no mesmo PC não consegue usar a porta ou divide os pacotes com o primeiro. (Desenvolvimento do cliente (Equipe de desenvolvimento))
- Restrição a múltiplos clientes: Se o módulo de segurança ou uma política do servidor limita vários clientes em um PC, o segundo cliente é impedido de abrir ou de conectar, ou o primeiro que foi aberto é desconectado. Alguns jogos bloqueiam só as funções dos clientes adicionais. (Desenvolvimento do cliente (Equipe de desenvolvimento))
Causas-raiz da retransmissão TCP
- Descarte pelo firewall ou pelo rastreamento de conexões: O firewall ou o rastreamento de conexões do Linux (conntrack, recurso que registra numa tabela as conexões que passam) descarta pacotes quando a tabela enche ou quando conclui que o estado da conexão não confere. (Infraestrutura de rede (Equipe de infraestrutura))
- Black hole de MTU (perda repetida só dos pacotes grandes): Se algum trecho do caminho passa a aceitar só pacotes menores e o aviso de “grande demais” (ICMP) é bloqueado, os pacotes grandes continuam sumindo, por mais vezes que sejam reenviados. (Infraestrutura de rede (Equipe de infraestrutura))
- Retransmissão do pedido de conexão (SYN): Se o pedido de conexão se perde por estouro da fila de conexões (backlog) ou bloqueio no firewall, o SO do cliente volta a enviá-lo a partir de 1 segundo depois, com intervalos crescentes. (Desenvolvimento do servidor (Equipe de desenvolvimento))
Ver o catálogo de sintomas ilustrado