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

Guia do Lag em Jogos › L11 Disco

Escrita síncrona de logs Synchronous logging

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

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

Se a thread do jogo espera o disco confirmar cada linha de log, o jogo também para quando o disco está ocupado.

Por quê A thread do jogo grava os logs de combate e de trocas direto em arquivo → Efeito Quando se exige gravação garantida (fsync) ou o buffer de escrita do SO (page cache) chega ao limite, uma única escrita leva dezenas de ms se o disco estiver ocupado → Na tela Engasgos em combates que geram muito log

Sintomas
Engasgos, Travamento
Fatores
Paralisação
Quem é afetado
Local ou canal específico, Servidor inteiro
Quando
Quando junta muita gente
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Usar logging assíncrono (buffer em memória + thread separada), reduzir o volume de logs, não chamar fsync na thread do jogo.
O que fazer (Equipe de infraestrutura)
Rodar a rotação e a compressão de logs com prioridade de I/O baixa, colocar os logs em um disco separado dos dados, monitorar a latência de escrita do disco.
No gráfico
Picos aleatórios · Tempo de tick do servidor, latência de escrita do disco
Onde olhar
Sobrepor w_await e aqu-sz do iostat -x 1 ao tempo de tick e, com perf trace -p PID --duration 10, encontrar no servidor do jogo as chamadas write e fsync que levaram mais de 10 ms e as threads que as fizeram
Confirma se
No horário do pico de tick, chamadas write ou fsync da thread do jogo levam dezenas de ms, e a latência de escrita do disco dispara no mesmo instante. Muitas vezes coincide com o horário de rotação ou compressão de logs
Descarta se
Picos de tick sem chamadas de sistema demoradas na thread do jogo: outra causa, como GC, lock ou estouro do tick. Só a thread dedicada a logs demora: o jogo não é afetado
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
Normalmente o SO recebe a escrita primeiro na memória (page cache) e só depois a grava no disco, então uma linha de log costuma terminar na hora. A pausa acontece quando o fsync exige gravação garantida, quando as escritas pendentes passam do limite e o SO bloqueia a chamada de escrita, ou quando o arquivo de log é rotacionado ou comprimido. Por isso tudo fica normal no dia a dia, e os picos só aparecem nos momentos em que o disco está ocupado.

Fontes

  1. fsync(2) — Linux manual page Linux man-pages
    O fsync grava os dados alterados no disco (incluindo o cache do disco) e bloqueia até o dispositivo confirmar a conclusão
  2. Documentation for /proc/sys/vm/ Linux kernel
    Quando as escritas pendentes (dirty) chegam ao dirty_ratio, o próprio processo que escreve passa a fazer a gravação no disco
  3. ionice(1) — Linux manual page util-linux
    Tarefas com prioridade de I/O idle só recebem tempo de disco quando nenhum outro programa está usando o disco
  4. iostat(1) — Linux manual page sysstat
    -x: w_await (tempo médio de atendimento das requisições de escrita, incluindo a espera na fila), aqu-sz (tamanho médio da fila, antigo avgqu-sz)
  5. perf-trace(1) — Linux manual page perf
    -p rastreia as chamadas de sistema de um processo em execução; --duration mostra só as chamadas que levaram mais que os ms indicados

Veja também

Mesma camada: L11 Disco

Mesmo sintoma (Engasgos) em outras camadas

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