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

Guia do Lag em Jogos › L7 SO do servidor (kernel)

Throttling de CPU em contêiner (cota do CFS) Container CPU throttling (CFS quota)

ID da causa so-cpu-quota · Responsável principal Infraestrutura de servidores (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)

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

Quando o contêiner tem limite de CPU e gasta toda a cota dentro do período definido (em geral 100 ms), ele fica parado à força pelo resto do período (throttling).

Por quê Limite de CPU (limit) no contêiner do servidor do jogo, no Kubernetes ou similar → Efeito Num pico de cálculo do tick, a cota se esgota e o processo fica parado dezenas de ms até o próximo período → Na tela CPU média baixa, mas o tick dá picos periódicos: engasgos e câmera lenta

Sintomas
Engasgos, Câmera lenta
Fatores
Paralisação, Jitter
Quem é afetado
Servidor inteiro
Quando
Quando junta muita gente, Aleatoriamente, de vez em quando
Responsável
Responsável principal Infraestrutura de servidores (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Ajustar o número de worker threads ao limite de CPU (para que o runtime não crie uma thread para cada núcleo do host).
O que fazer (Equipe de infraestrutura)
Deixar o limite de CPU com folga ou removê-lo e reservar núcleos dedicados, monitorar o número de throttlings (nr_throttled).
Números de referência
Em um servidor com limite de 2 núcleos, se 8 threads trabalham ao mesmo tempo, a cota do período de 100 ms acaba em 25 ms e o processo fica parado por 75 ms.
No gráfico
Sobe com a carga · Número de throttlings (nr_throttled), tempo de tick do servidor
Onde olhar
Aumento de nr_throttled e throttled_usec (no cgroup v1, nr_throttled e throttled_time) no cpu.stat do cgroup do contêiner, junto com o tempo de tick do servidor
Confirma se
O uso médio de CPU fica abaixo do limite, mas nr_throttled e throttled_usec não param de subir, e isso coincide com os picos de tick
Descarta se
nr_throttled não sobe: não é esta causa. A própria máquina virtual fica sem CPU: “CPU steal (máquina virtual)”
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. CFS Bandwidth Control Linux kernel
    Ao esgotar a cota recebida em cada período, as threads param até o próximo período (throttling); período padrão de 100 ms; estatística nr_throttled
  2. Control Group v2 Linux kernel
    cpu.max tem o formato “$MAX $PERIOD” (cota, período), com padrão “max 100000” (período de 100 ms)
  3. Resource Management for Pods and Containers Kubernetes
    O limit de CPU do contêiner é um limite rígido que o kernel impõe com throttling de CPU

Veja também

Mesma camada: L7 SO do servidor (kernel)

Mesmo sintoma (Engasgos) em outras camadas

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