Limites de recursos e instrumentação
Use debug.sethook para contar instruções e impor limites de CPU.
Limites de recursos e instrumentação é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Por que limitar os recursos?
Um código não confiável pode causar uma negação de serviço ao executar indefinidamente (CPU), alocar quantidades enormes de memória ou gerar uma saída excessiva. Os limites de recursos protegem o anfitrião.
Limite de CPU com debug.sethook
Conte as instruções executadas e aborte quando o limite for excedido.
local function withCPULimit(fn, maxOps)
local ops = 0
debug.sethook(function()
ops = ops + 1
if ops > maxOps then error("CPU limit exceeded", 2) end
end, "", 50) -- check every 50 instructions
local ok, result = pcall(fn)
debug.sethook()
return ok, result
endGranularidade da contagem
O terceiro argumento de sethook (contagem) controla com que frequência o gancho é acionado. Valores menores = mais precisão, mas maior sobrecarga. 50-500 é um intervalo comum.
Limite de memória com collectgarbage
Verifique o uso de memória dentro do gancho e aborte se ele exceder um limite.
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)Limite pelo relógio de parede
Combine com os.clock() para limitar o tempo transcorrido, em vez da contagem de instruções ou além dela.
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)Limite de saída
Envolva a função print do ambiente isolado para contar os bytes escritos e recusar novas saídas depois que um limite for atingido.
local totalOutput = 0
local OUTPUT_LIMIT = 10240 -- 10 KB
env.print = function(...)
local s = table.concat({...}, "\t") .. "\n"
totalOutput = totalOutput + #s
if totalOutput > OUTPUT_LIMIT then
error("Output limit exceeded")
end
output[#output+1] = s
endInstrumentação para perfilamento
Use os eventos de gancho "call" e "return" para criar um grafo instrumentado de chamadas do código em ambiente isolado.
local callGraph = {}
debug.sethook(function(event)
local info = debug.getinfo(2, "Sn")
local name = info.name or info.short_src
if event == "call" then callGraph[name] = (callGraph[name] or 0) + 1 end
end, "c")Ganchos de corrotinas
Os limites de debug.sethook são aplicados por thread. Defina ganchos individualmente em cada corrotina se o código em ambiente isolado criar corrotinas.
Relato do uso de recursos
Após a execução no ambiente isolado, relate: instruções executadas, memória usada, tamanho da saída e tempo transcorrido. Isso é útil para detectar abusos e aplicar cotas.
Ambientes isolados aninhados
Se um plug-in em ambiente isolado puder criar seus próprios ambientes isolados secundários, certifique-se de que os limites de recursos do ambiente isolado pai sejam herdados ou restringidos ainda mais para o filho.
Ferramentas para produção
Ferramentas: luasandbox (LuaJIT), contêineres Docker de Lua com seccomp e alocadores personalizados que limitam rigorosamente a memória. Combine-os com cgroups no nível do OS para obter garantias robustas.
Pergunta sobre limites de recursos
Como debug.sethook aplica um limite de CPU?
Recapitulação: limites de recursos e instrumentação
Use debug.sethook para aplicar limites de CPU (contagem de instruções), memória (verificação com collectgarbage) e tempo (os.clock). Envolva print para limitar a saída. Relate o uso após a execução para monitoramento e aplicação de cotas.
Perguntas Frequentes
A aula “Limites de recursos e instrumentação” é grátis?
Sim — o texto completo de “Limites de recursos e instrumentação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Limites de recursos e instrumentação”?
Use debug.sethook para contar instruções e impor limites de CPU. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Limites de recursos e instrumentação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- O modelo _ENV no Lua 5.2+
- Criando um sandbox restrito
- Evitando fugas do sandbox
- Limites de recursos e instrumentação