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

Guia do Lag em Jogos › L6 Placa de rede do servidor

Interrupções da NIC concentradas em um só núcleo Single-queue NIC / no RSS

ID da causa nic-irq · Responsável principal Infraestrutura de servidores (Equipe de infraestrutura)

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

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)

Sintomas
Teleporte, Rubber banding, Input lag
Fatores
Perda de pacotes, Latência
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)
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

  1. Scaling in the Linux Networking Stack Linux 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
  2. How to receive a million packets per second Cloudflare
    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
  3. ethtool(8) — Linux manual page ethtool
    Opção ethtool -N rx-flow-hash udp4 que inclui as portas (f e n) no hash do UDP
  4. mpstat(1) — Linux manual page sysstat
    %soft: proporção do tempo de CPU gasto tratando interrupções de software; por núcleo com -P ALL

Veja também

Mesma camada: L6 Placa de rede do servidor

Mesmo sintoma (Teleporte) em outras camadas

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