Se a NIC manda todas as interrupções de chegada de pacote para um único núcleo de CPU, esse núcleo vira gargalo.
Por quê Só uma fila de recepção, ou o RSS (que distribui entre vários núcleos) desligado → Efeito Um núcleo chega a 100% e não consegue tirar os pacotes a tempo → Na tela Perda e atraso no servidor inteiro quando junta muita gente (teleporte, input lag)
Responsável principal Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de infraestrutura)
Configurar RSS (distribuição pela NIC) e RPS (distribuição pelo kernel), distribuir as interrupções entre vários núcleos, fazer o UDP considerar também as portas na escolha da fila (rx-flow-hash udp4 sdfn no ethtool -N), separar os núcleos que tratam interrupções dos núcleos da thread de tick do jogo, monitorar o %soft por núcleo.
Números de referência
Um núcleo consegue processar pelo kernel, grosso modo, centenas de milhares de pacotes por segundo, dependendo do tamanho dos pacotes e da configuração. Se, no uso por núcleo, o processamento de recepção (%soft no mpstat) está todo concentrado em um só núcleo, é este o caso.
No gráfico
Achata ao bater no limite · %soft por núcleo, pacotes recebidos por segundo
Onde olhar
Ver o %soft (proporção de tempo tratando interrupções de software) por núcleo com mpstat -P ALL 1, para qual núcleo vão as interrupções de cada fila da NIC em /proc/interrupts, o número de filas com ethtool -l e os pacotes por fila com ethtool -S (os nomes variam conforme o driver)
Confirma se
Só um núcleo fica com %soft perto de 100% e os outros ociosos, e as interrupções e os pacotes se acumulam em uma fila. A partir daí, os pacotes recebidos por segundo não sobem mais
Descarta se
%soft distribuído por igual entre os núcleos: não é esta causa. CPU ociosa, mas com perda: “Limite de PPS da nuvem excedido” ou “Ring buffer insuficiente”
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
Mesmo com várias filas, se a maior parte do tráfego vem de poucos endereços, como gateways ou proxies, tudo cai em uma fila só. No UDP, algumas NICs escolhem a fila só pelos endereços na configuração padrão, e o tráfego só se espalha por igual depois de mudar para incluir as portas.
Fontes
Scaling in the Linux Networking StackLinux kernel RSS (a NIC distribui entre várias filas de recepção) e RPS (o kernel distribui), com uma interrupção própria por fila espalhada entre vários núcleos; recomenda-se RSS quando o tratamento das interrupções de recepção é o gargalo
How to receive a million packets per secondCloudflare Medições em que uma fila de recepção atendida por um único núcleo chegou ao teto em cerca de 350 mil–430 mil pacotes por segundo; caso em que a NIC fazia o hash do UDP só pelo endereço IP e tudo caía em uma fila