한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Guia do Lag em Jogos › L8 Sockets e protocolos

Distribuição desbalanceada do SO_REUSEPORT SO_REUSEPORT imbalance, stuck worker

ID da causa sk-reuseport · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)

Abrir o card interativo, com figuras e simulações →

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.

Por quê O gateway ou o servidor de login sobe vários processos com SO_REUSEPORT → Efeito Mesmo que um processo pare por GC ou sobrecarga, as conexões novas e os pacotes UDP atribuídos a ele não passam para outro processo → Na tela Só alguns jogadores não conectam ou têm travamento. Em reinícios que mudam o número de processos, algumas sessões UDP caem

Sintomas
Não conecta / loading infinito, Travamento, Desconexão
Fatores
Paralisação, Perda de pacotes
Quem é afetado
Só eu, Servidor inteiro
Quando
Logo após login ou manutenção, Aleatoriamente, de vez em quando
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Nunca deixar a thread de recepção parar, implementar um procedimento de transferência de sessão no reinício.
O que fazer (Equipe de infraestrutura)
Monitorar a fila de conexões por processo (Recv-Q no ss), seguir o procedimento de transferência de sessão quando um deploy mudar o número de processos.
No gráfico
Alto só em alguns · Fila de conexões por socket em escuta (Recv-Q)
Onde olhar
Ver com ss -ltnp o Recv-Q (conexões esperando o accept) e o processo responsável de cada socket em escuta na mesma porta, e comparar a vazão por processo
Confirma se
Entre os vários sockets da mesma porta, só um acumula Recv-Q sem parar, e o processo dele está parado ou com vazão perto de 0
Descarta se
Recv-Q acumulando por igual em todos os sockets: sobrecarga geral (“Estouro da fila de conexões (backlog)”)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. socket(7) — Linux manual page Linux man-pages
    Com SO_REUSEPORT, vários sockets fazem bind no mesmo endereço e dividem as conexões TCP e os pacotes UDP
  2. net/core/sock_reuseport.c (Linux v6.12) Linux kernel
    Sem programa BPF, escolhe o socket responsável dividindo o hash do pacote pelo número de sockets do grupo
  3. Why does one NGINX worker take all the load? Cloudflare
    O SO_REUSEPORT divide as filas por worker com um hash simples, então, se um worker fica bloqueado, todas as conexões acumuladas na fila dele ficam paradas
  4. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    Valores Recv-Q e Send-Q do ss: no socket em escuta, as conexões esperando o accept e o limite do backlog; no socket conectado, os bytes que o app ainda não leu e os bytes enviados ainda sem ACK

Veja também

Mesma camada: L8 Sockets e protocolos

Mesmo sintoma (Não conecta / loading infinito) em outras camadas

Ver o card interativo, com figuras e simulações