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

Guia do Lag em Jogos › Causas-raiz da retransmissão TCP

Descarte de pacotes no servidor receptor Receiver host drops (ring, softirq, CPU)

ID da causa rt-host-drop · Responsável principal Infraestrutura de servidores (Equipe de infraestrutura)

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

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

Sintomas
Input lag, Travamento, Avanço rápido, Teleporte
Fatores
Perda de pacotes, Paralisação
Quem é afetado
Servidor inteiro
Quando
Quando junta muita gente
Responsável
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

  1. Interface statistics Linux 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
  2. drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
    Os nomes dos contadores do ethtool -S são definidos pelo driver (ex.: rx_missed_errors e rx_no_buffer_count no igb)
  3. Ethtool counters Linux 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
  4. net/core/net-procfs.c Linux kernel
    /proc/net/softnet_stat tem uma linha por CPU, em hexadecimal; a 2ª coluna é dropped e a 3ª é time_squeeze
  5. 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
  6. Scaling in the Linux Networking Stack Linux kernel
    RSS: a NIC divide os pacotes entre várias filas de recepção, processadas por várias CPUs
  7. ethtool(8) — Linux manual page ethtool
    -G (--set-ring) muda o tamanho do ring buffer
  8. proc_stat(5) — Linux manual page Linux man-pages
    steal no /proc/stat: tempo em que outro SO usou a CPU em ambiente virtualizado
  9. mpstat(1) — Linux manual page sysstat
    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
  10. net/ipv4/proc.c Linux kernel
    TcpRetransSegs no nstat (RetransSegs da seção Tcp)

Veja também

Mesma camada: Causas-raiz da retransmissão TCP

Mesmo sintoma (Input lag) em outras camadas

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