Acabou a memória de scripts
Alguma coisa ficou sem memória. Não tem a ver com o quanto o servidor está ocupado: alguma coisa se acumula e nunca é limpa.
Faça isto primeiro
Anote há quanto tempo o servidor estava rodando. Se reiniciar resolve por um tempo, é um vazamento.
O que significa
Um runtime de scripts pediu memória que não conseguiu. No cliente isso derruba o jogo; no servidor normalmente leva o resource, às vezes o processo.
Diferente de um engasgo, isso não é sintoma de carga: é sintoma de acúmulo. Alguma coisa está sendo guardada que deveria ter sido liberada.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Uma tabela que só cresce
Estado por jogador que se adiciona na entrada e nunca é removido na saída. Sobrevive aos testes e morre no pico.
- 2
Entidades criadas e nunca apagadas
Cada uma custa memória além de uma vaga no pool.
- 3
Um cache sem despejo
Com chave em algo sem teto: coordenadas, marcas de tempo, ids de rede.
- 4
Strings muito grandes retidas na memória
O JSON de uma tabela inteira guardado numa variável em vez de ser consumido e solto.
- 5
Closures que capturam mais do que precisam
Cada closure mantém vivos os valores que capturou, então um único callback guardado pode impedir para sempre que uma tabela grande seja coletada.
Como saber qual é o seu
Olhe ao longo do tempo e não num instante:
-- servidor, uma vez por minuto
print(('lua kb: %.0f'):format(collectgarbage('count')))Um número que só sobe através dos picos de jogadores é um vazamento. Um que sobe e desce é normal.
Onde olhar
Cada tabela em nível de arquivo no resource que morreu, e se alguma coisa remove dela alguma vez.
Como consertar
Remova na saída, sempre:
AddEventHandler('playerDropped', function()
local src = source
playerState[src] = nil -- a linha que as pessoas esquecem
cache[src] = nil
end)Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer encontra o que está custando quadros e reescreve.