O pacote chega ao servidor, mas é descartado porque o ring buffer da NIC (o buffer que guarda por um momento os pacotes que chegam) estourou ou porque o núcleo que faz o processamento de recepção no kernel está saturado.
Por quê Pico de jogadores, interrupções concentradas em um só núcleo, CPU steal na máquina virtual, switch virtual sobrecarregado → Efeito Descarte no ring buffer (rx_missed_errors e outros; o nome varia conforme o driver) ou na fila de recepção do kernel (softnet dropped) → Na tela Quando junta muita gente, os comandos demoram a responder e há engasgos no servidor inteiro ao mesmo tempo
Responsável principal Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de infraestrutura)
Incluir no monitoramento os contadores de descarte como rx_missed_errors do ethtool -S e o dropped do /proc/net/softnet_stat, aumentar o ring buffer (ethtool -G), distribuir RSS e interrupções entre vários núcleos, separar a thread do jogo dos núcleos de processamento de recepção, manter folga de CPU, em máquina virtual verificar o CPU steal e a carga do switch virtual.
Números de referência
Os pacotes que o servidor descartou ao receber são reenviados pelo cliente. Por isso, quase não aparecem nas métricas de retransmissão do servidor e se mostram primeiro em contadores de descarte como rx_missed_errors no ethtool -S (o nome varia conforme o driver) e no dropped do /proc/net/softnet_stat.
No gráfico
Achata ao bater no limite · Uso de softirq por núcleo, contadores de descarte da NIC
Onde olhar
Ver os contadores de descarte do ethtool -S (rx_missed_errors e outros; no mlx5, rx_out_of_buffer e rx_discards_phy), o missed do ip -s -s link e a 2ª coluna (dropped) e a 3ª coluna (time_squeeze) do /proc/net/softnet_stat, além do %soft (processamento de interrupções de software) por núcleo com mpstat -P ALL. Em máquina virtual, ver também o %steal
Confirma se
Nos horários de pico de jogadores, os contadores de descarte ou o softnet dropped aumentam, e o %soft do núcleo responsável pela recepção fica perto de 100% sem conseguir subir mais. Os comandos atrasam ao mesmo tempo em todas as conexões desse servidor
Descarta se
Contadores de descarte do servidor parados e retransmissões concentradas em conexões de uma região ou operadora: perda no caminho. Quando o caminho perde pacotes enviados pelo servidor, o TcpRetransSegs do nstat do servidor aumenta e esses contadores ficam parados
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Fontes
Interface statisticsLinux kernel rx_missed_errors é o número de pacotes que o host não conseguiu receber por falta de buffer (no /proc/net/dev, entra na soma de drop); visível com ip -s -s link
Ethtool countersLinux kernel rx_out_of_buffer (fila de recepção sem buffer) e rx_discards_phy (descarte por falta de buffer na porta) no driver mlx5
net/core/net-procfs.cLinux kernel /proc/net/softnet_stat tem uma linha por CPU, em hexadecimal; a 2ª coluna é dropped e a 3ª é time_squeeze
Documentation for /proc/sys/net/Linux kernel netdev_max_backlog: limite da fila de recepção que acumula pacotes quando eles chegam mais rápido do que o kernel processa
mpstat(1) — Linux manual pagesysstat mpstat -P ALL mostra a utilização por núcleo; %soft é o tempo de processamento de interrupções de software, e %steal é o tempo de espera enquanto o hipervisor atendia outra CPU virtual
net/ipv4/proc.cLinux kernel TcpRetransSegs no nstat (RetransSegs da seção Tcp)