ID da causa dk-sync-log · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de servidores (Equipe de infraestrutura)
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
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
fsync(2) — Linux manual pageLinux man-pages O fsync grava os dados alterados no disco (incluindo o cache do disco) e bloqueia até o dispositivo confirmar a conclusão
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
ionice(1) — Linux manual pageutil-linux Tarefas com prioridade de I/O idle só recebem tempo de disco quando nenhum outro programa está usando o disco
iostat(1) — Linux manual pagesysstat -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)
perf-trace(1) — Linux manual pageperf -p rastreia as chamadas de sistema de um processo em execução; --duration mostra só as chamadas que levaram mais que os ms indicados