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

Guia do Lag em Jogos › L10 Memória

Pausa do GC na engine de script Scripting VM GC (Lua, etc.)

ID da causa mem-script-gc · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)

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

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

Sintomas
Engasgos, Travamento
Fatores
Paralisação
Quem é afetado
Local ou canal específico
Quando
Quando junta muita gente, Em intervalos regulares
Responsável
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

  1. Lua 5.4 Reference Manual Lua.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)

Veja também

Mesma camada: L10 Memória

Mesmo sintoma (Engasgos) em outras camadas

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