Se o tick espera uma resposta do BD ou uma escrita em arquivo, todo o andamento do jogo no servidor para por esse tempo.
Por quê Dentro do tick, espera consultas e gravações no BD, escrita de log e chamadas a APIs externas → Efeito Se o BD leva 100 ms, o tick também fica parado 100 ms → Na tela Toda vez que o BD ou o disco fica lento, o mapa inteiro dá um engasgo
Ao fazer ações específicas, Aleatoriamente, de vez em quando
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Passar todo trabalho lento (consultas e gravações no BD, escrita de log, chamadas a APIs externas) para execução assíncrona e aplicar o resultado no tick seguinte (só colocar timeout não basta: enquanto espera, o tick continua parado).
Números de referência
Mesmo uma ida e volta de 0,5 ms ao BD no mesmo data center, chamada 100 vezes num tick, soma 50 ms. Sozinha, consome o orçamento inteiro de 20 ticks.
No gráfico
Picos aleatórios · Tempo de tick do servidor, latência das queries do BD
Onde olhar
Gráfico de tempo de tick, latência das queries do BD (slow query log etc.) e latência do disco no mesmo eixo de tempo. Sem métrica de tick, onde a thread do jogo espera, com bcc offcputime -p
Confirma se
Os picos de tick coincidem com os picos de latência do BD ou de arquivos, e o tempo de espera da thread do jogo se concentra nas pilhas de recebimento de resposta do BD ou de escrita em arquivo
Descarta se
Latência do BD e do disco tranquila, mas o tick dá picos: pausa do GC ou contenção de lock
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
ASP.NET Core Best PracticesMicrosoft Chamar de forma assíncrona acesso a dados, I/O e operações demoradas; chamadas síncronas bloqueantes levam ao esgotamento do pool de threads e a respostas lentas