Límites de recursos e instrumentación
Utilice debug.sethook para contar instrucciones y aplicar límites de CPU.
Límites de recursos e instrumentación es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
¿Por qué limitar los recursos?
El código no confiable puede provocar una denegación de servicio al ejecutarse indefinidamente (CPU), asignar cantidades enormes de memoria o generar una salida excesiva. Los límites de recursos protegen al host.
Límite de CPU mediante debug.sethook
Cuente las instrucciones ejecutadas y aborte cuando se supere el límite.
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
endGranularidad del recuento
El tercer argumento de sethook (count) controla la frecuencia con la que se ejecuta el hook. Los valores más pequeños ofrecen mayor precisión, pero generan más sobrecarga. Un intervalo de 50 a 500 es habitual.
Límite de memoria mediante collectgarbage
Compruebe el uso de memoria dentro del hook y aborte si supera un umbral.
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)Límite de tiempo real
Combínelo con os.clock() para limitar el tiempo real, en lugar del recuento de instrucciones o además de este.
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)Límite de salida
Envuelva la función print del sandbox para contar los bytes escritos y rechazar cualquier salida adicional después de alcanzar un límite.
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
endInstrumentación para la creación de perfiles
Utilice los eventos "call" y "return" del hook para crear un grafo de llamadas instrumentado del código en el sandbox.
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")Hooks de corutinas
Los límites de debug.sethook se aplican por hilo. Configure hooks en cada corutina individualmente si el código en el sandbox crea corutinas.
Informes de uso de recursos
Después de ejecutar el sandbox, informe de lo siguiente: instrucciones ejecutadas, memoria utilizada, longitud de la salida y tiempo transcurrido. Esto resulta útil para detectar abusos y aplicar cuotas.
Sandboxes anidados
Si un complemento en el sandbox puede crear sus propios sub-sandboxes, asegúrese de que los límites de recursos del sandbox principal se hereden o se restrinjan aún más para el secundario.
Herramientas para producción
Herramientas: luasandbox (LuaJIT), contenedores Docker de Lua con seccomp y asignadores personalizados que impongan un límite estricto de memoria. Combínelos con cgroups a nivel del sistema operativo para obtener garantías sólidas.
Pregunta sobre los límites de recursos
¿Cómo aplica debug.sethook un límite de CPU?
Resumen: límites de recursos e instrumentación
Utilice debug.sethook para aplicar límites de CPU (recuento de instrucciones), memoria (comprobación con collectgarbage) y tiempo (os.clock). Envuelva print para limitar la salida. Informe del uso después de la ejecución para fines de supervisión y aplicación de cuotas.
Preguntas frecuentes
¿La lección «Límites de recursos e instrumentación» es gratis?
Sí — el texto completo de «Límites de recursos e instrumentación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Límites de recursos e instrumentación»?
Utilice debug.sethook para contar instrucciones y aplicar límites de CPU. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Límites de recursos e instrumentación»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El modelo _ENV en Lua 5.2+
- Construcción de un sandbox restringido
- Prevención de escapes del sandbox
- Límites de recursos e instrumentación