Mesmo em um servidor em C++, se quests, IA e skills rodam em uma linguagem de script como Lua, a zona fica parada enquanto o GC da engine de script roda.
Por quê Em cada zona, a engine de script executa quests, IA e eventos e cria objetos temporários em grande quantidade → Efeito Quando o GC da engine de script coleta muita coisa de uma vez, o tick daquela zona para → Na tela Engasgos periódicos só em certas zonas ou durante certos eventos
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Configurar GC incremental ou geracional, avançar o GC um pouco a cada tick, reduzir os objetos temporários dos scripts.
Números de referência
Quando o heap do script cresce para centenas de MB, uma coleta feita toda de uma vez (com a coleta incremental desligada, ou a coleta completa do modo geracional) pode levar de dezenas a centenas de ms.
No gráfico
Picos em intervalos regulares · Tempo de tick por zona, memória da engine de script
Onde olhar
Registrar a cada tick o tempo de tick por zona e o uso de memória da engine de script daquela zona (no Lua, collectgarbage("count")) e sobrepor os dois no mesmo gráfico
Confirma se
O instante em que a memória do script cai de repente (coleta toda de uma vez) coincide com o pico de tick daquela zona, e as outras zonas estão normais
Descarta se
Pico sem mudança na memória do script: carga ou lock daquela zona. Todas as zonas do servidor dão pico juntas: GC do servidor (mem-gc) ou swap (mem-swap)
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Fontes
Lua 5.4 Reference ManualLua.org O modo incremental divide a coleta em pequenos passos intercalados com a execução (passos grandes viram uma pausa stop-the-world); a coleta major do modo geracional é uma pausa stop-the-world que percorre todos os objetos; collectgarbage("count") é o total de memória usado pelo Lua (KB)