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

Guia do Lag em Jogos › L10 Memória

Swap Swapping

ID da causa mem-swap · 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 falta memória e o SO manda parte dela para o disco, cada uso dessa memória passa a esperar pelo disco, que é mais de 1.000 vezes mais lento.

Por quê A memória em uso passa da RAM física → Efeito O SO manda uma parte para o disco e lê de volta quando precisa → Na tela O tick dispara para centenas de ms, e todos os jogadores do servidor ficam em câmera lenta ou com travamento

Sintomas
Câmera lenta, Travamento
Fatores
Paralisação
Quem é afetado
Servidor inteiro
Quando
Quanto mais tempo ligado, Horário de pico à noite
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)
Limitar o uso de memória do processo (tamanho do heap etc.) e procurar vazamentos.
O que fazer (Equipe de infraestrutura)
Configurar os servidores do jogo para não usar swap, agir com base em alertas de memória e, como sem swap o processo é encerrado à força (OOM) no instante em que falta memória, garantir RAM com folga acima do uso de pico.
Números de referência
Leitura da RAM: cerca de 100 ns. Releitura do SSD: cerca de 100 µs (1.000 vezes). Disco na nuvem, do outro lado da rede: cerca de 1 ms (10 mil vezes). HDD: 10 ms (100 mil vezes).
No gráfico
Subida lenta · Uso de swap, swap in/out
Onde olhar
Sobrepor ao tempo de tick as colunas si e so do vmstat 1 (quanto foi lido do swap e mandado para o swap por segundo), os valores some e full de /proc/pressure/memory (proporção de tempo parado esperando memória) e o majflt/s do pidstat -r no processo do servidor do jogo (page faults que exigiram leitura do disco)
Confirma se
No horário do lag, si fica acima de 0, e o majflt/s do servidor do jogo e o full de memory sobem juntos
Descarta se
si e so em 0 e pressão de memória (PSI) perto de 0: não é swap. Sem swap, mas com majflt/s e PSI subindo: a memória acabou e o SO está relendo páginas de código; liberar memória vem primeiro
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
Servidores com GC leem o heap todo durante a coleta, então, mesmo que só uma parte do heap vá para o swap, um único GC pode passar a levar de alguns a dezenas de segundos. Sem swap, não existe a fase de lentidão causada pelo swap: o processo vai direto para o encerramento forçado (OOM), por isso é preciso garantir memória livre antes. Mesmo sem swap, quando a memória está quase no fim, o SO tira da memória até as páginas de código do executável e precisa lê-las de novo, e o servidor inteiro pode ficar muito lento por um tempo antes do encerramento forçado.

Fontes

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    “Numbers Everyone Should Know”: referência à memória principal 100 ns, seek de disco 10 ms (dados de 2009)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: custo relativo entre swap e recuperação de páginas de arquivo; o swap é caro porque é I/O aleatório
  3. Concepts overview Linux kernel
    O kernel recupera páginas do page cache que têm cópia no disco e páginas que podem ir para o swap; se ainda faltar memória, o OOM killer mata um processo
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    Latência no percentil 99,99 (four-nines latency) de 130 µs em SSDs NVMe para servidores: base para dizer que uma leitura de SSD leva cerca de 100 µs
  5. Amazon EBS General Purpose SSD volumes AWS
    Latência de milissegundos de um dígito no disco padrão da nuvem (gp3)
  6. vmstat(8) — Linux manual page procps-ng
    si: memória lida do swap por segundo; so: memória mandada para o swap por segundo
  7. PSI - Pressure Stall Information Linux kernel
    some (proporção de tempo em que algumas tarefas ficaram paradas) e full (proporção de tempo em que todas as tarefas ficaram paradas ao mesmo tempo) de /proc/pressure/memory
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s (número de page faults que exigiram ler a página do disco)

Veja também

Mesma camada: L10 Memória

Mesmo sintoma (Câmera lenta) em outras camadas

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