Lua Academy · Lektion

Ressourcegrænser og instrumentering

Brug debug.sethook til at tælle instruktioner og håndhæve CPU-budgetter.

Lektion 4 af 413 trin

Ressourcegrænser og instrumentering er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvorfor ressourcebegrænsninger?

Ikke-betroet kode kan forårsage DoS ved at køre for evigt (CPU), allokere enorme mængder hukommelse eller generere for meget output. Ressourcebegrænsninger beskytter værten.

CPU-grænse via debug.sethook

Optæl udførte instruktioner, og afbryd, når grænsen 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
end

Optællingens granularitet

Det tredje argument til sethook (count) bestemmer, hvor ofte hooket udløses. Mindre værdier giver større nøjagtighed, men også mere ekstra belastning. 50-500 er et almindeligt interval.

Hukommelsesgrænse via collectgarbage

Kontrollér hukommelsesforbruget inde i hooket, og afbryd, hvis det overskrider en tærskel.

local MEM_LIMIT_KB = 1024  -- 1 MB
debug.sethook(function()
  if collectgarbage("count") > MEM_LIMIT_KB then
    error("Memory limit exceeded")
  end
end, "", 200)

Grænse for forløbet tid

Kombinér med os.clock() for at begrænse den forløbne tid i stedet for eller ud over instruktionsantallet.

local deadline = os.clock() + 0.5  -- 500ms
debug.sethook(function()
  if os.clock() > deadline then
    error("Time limit exceeded")
  end
end, "", 100)

Outputgrænse

Pak sandkassens print-funktion ind, så du kan tælle skrevne bytes og afvise yderligere output efter en grænse.

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
end

Instrumentering til profilering

Brug hook-hændelserne "call" og "return" til at opbygge en instrumenteret kaldgraf over kode i sandkassen.

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")

Koroutine-hooks

Begrænsninger med debug.sethook gælder pr. tråd. Sæt hooks på hver koroutine individuelt, hvis kode i sandkassen opretter koroutiner.

Rapportering af ressourceforbrug

Efter kørsel i sandkassen skal du rapportere: udførte instruktioner, brugt hukommelse, outputlængde og forløben tid. Det er nyttigt til at opdage misbrug og håndhæve kvoter.

Indlejrede sandkasser

Hvis et plugin i en sandkasse selv kan oprette undersandkasser, skal du sikre, at den overordnede sandkasses ressourcebegrænsninger nedarves eller strammes for den underordnede.

Værktøjer til produktionsmiljøer

Værktøjer: luasandbox (LuaJIT), Lua Docker-containere med seccomp og brugerdefinerede allokatorer, der håndhæver en hård hukommelsesgrænse. Kombinér med cgroups på OS-niveau for stærke garantier.

Spørgsmål om ressourcebegrænsninger

Hvordan håndhæver debug.sethook en CPU-grænse?

Opsummering: Ressourcebegrænsninger og instrumentering

Brug debug.sethook til at håndhæve CPU-grænser (instruktionsantal), hukommelsesgrænser (kontrol med collectgarbage) og tidsgrænser (os.clock). Pak print ind for at begrænse output. Rapportér forbruget efter kørsel til overvågning og håndhævelse af kvoter.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Ressourcegrænser og instrumentering” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Ressourcegrænser og instrumentering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Ressourcegrænser og instrumentering”?

Brug debug.sethook til at tælle instruktioner og håndhæve CPU-budgetter. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Ressourcegrænser og instrumentering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. _ENV-modellen i Lua 5.2+
  2. Opbygning af en begrænset sandbox
  3. Forebyggelse af sandbox-omgåelser
  4. Ressourcegrænser og instrumentering
← Tilbage til Lua Academy