Ressursgrenser og instrumentering
Bruk debug.sethook til å telle instruksjoner og håndheve CPU-budsjetter.
Ressursgrenser og instrumentering er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hvorfor ressursbegrensninger
Ikke-klarert kode kan forårsake tjenestenekt ved å kjøre for alltid (CPU), tildele enorme mengder minne eller generere for mye utdata. Ressursbegrensninger beskytter verten.
CPU-grense via debug.sethook
Tell utførte instruksjoner, og avbryt når grensen overskrides.
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
endDetaljnivå for telling
Det tredje argumentet til sethook (count) styrer hvor ofte hooken utløses. Mindre verdier gir høyere nøyaktighet, men mer overhead. 50–500 er et vanlig intervall.
Minnegrense via collectgarbage
Kontroller minnebruken inne i hooken, og avbryt hvis den overskrider en terskelverdi.
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)Grense for virkelig tid
Kombiner med os.clock() for å begrense virkelig tid i stedet for, eller i tillegg til, antallet instruksjoner.
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)Utdata-grense
Pakk inn sandkassens print-funksjon for å telle antallet skrevne byte, og avslå videre utdata når grensen er nådd.
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
endInstrumentering for profilering
Bruk hook-hendelsene «call» og «return» til å bygge en instrumentert kallgraf for sandkassekoden.
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")Korutine-hooker
Begrensninger med debug.sethook gjelder per tråd. Angi hooker for hver korutine individuelt hvis sandkassekode oppretter korutiner.
Rapportering av ressursbruk
Rapporter følgende etter kjøring av sandkassen: utførte instruksjoner, brukt minne, utdatamengde og medgått tid. Dette er nyttig for å oppdage misbruk og håndheve kvoter.
Nestede sandkasser
Hvis en sandkassetillegg kan opprette undersandkasser, må du sørge for at ressursbegrensningene fra den overordnede sandkassen arves eller strammes inn for barnet.
Verktøy for produksjon
Verktøy: luasandbox (LuaJIT), Lua Docker-containere med seccomp og egendefinerte allokatorer som setter en hard minnegrense. Kombiner med cgroups på operativsystemnivå for sterke garantier.
Spørsmål om ressursbegrensninger
Hvordan håndhever debug.sethook en CPU-grense?
Oppsummering: Ressursbegrensninger og instrumentering
Bruk debug.sethook til å håndheve CPU-grenser (instruksjonstelling), minnegrenser (kontroll med collectgarbage) og tidsgrenser (os.clock). Pakk inn print for å begrense utdata. Rapporter ressursbruken etter kjøring for overvåking og kvotehåndheving.
Lær deg Lua med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 40
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Ressursgrenser og instrumentering» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Ressursgrenser og instrumentering», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Ressursgrenser og instrumentering»?
Bruk debug.sethook til å telle instruksjoner og håndheve CPU-budsjetter. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Lua Academy?
Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Ressursgrenser og instrumentering»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?
Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- _ENV-modellen i Lua 5.2+
- Bygge en begrenset sandkasse
- Forhindre utbrudd fra sandkassen
- Ressursgrenser og instrumentering