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)
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
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
socket(7) — Linux manual pageLinux man-pages Com SO_REUSEPORT, vários sockets fazem bind no mesmo endereço e dividem as conexões TCP e os pacotes UDP
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
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
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