Lua Academy · Oppitunti

Resurssirajat ja instrumentointi

Laskekaa käskyjä debug.sethook-funktiolla ja valvokaa suorittimen käyttöbudjetteja.

Oppitunti 4/413 vaihetta

Resurssirajat ja instrumentointi on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Miksi resurssirajoituksia tarvitaan

Luottamusta vailla oleva koodi voi aiheuttaa DoS-hyökkäyksen suorittamalla koodia loputtomasti (suoritin), varaamalla valtavia määriä muistia tai tuottamalla liikaa tulostetta. Resurssirajoitukset suojaavat isäntäprosessia.

Suoritinrajoitus debug.sethook-funktiolla

Laskekaa suoritetut käskyt ja keskeyttäkää suoritus, kun raja ylittyy.

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

Laskennan tarkkuus

sethook-funktion kolmas argumentti (count) määrittää, kuinka usein hook käynnistyy. Pienemmät arvot ovat tarkempia mutta aiheuttavat enemmän kuormitusta. Yleinen vaihteluväli on 50–500.

Muistirajoitus collectgarbage-funktiolla

Tarkistakaa muistin käyttö hookin sisällä ja keskeyttäkää suoritus, jos käyttö ylittää kynnysarvon.

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

Reaaliaikarajoitus

Yhdistäkää tähän os.clock(), jotta voitte rajoittaa kulunutta reaaliaikaa käskymäärän sijaan tai sen lisäksi.

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

Tulostusrajoitus

Muuttakaa hiekkalaatikon print-funktio kääreellä, joka laskee kirjoitettujen tavujen määrän ja estää tulostuksen rajan saavuttamisen jälkeen.

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

Profiloinnin instrumentointi

Rakentakaa instrumentointia sisältävä kutsukaavio hiekkalaatikossa suoritettavasta koodista käyttämällä "call"- ja "return"-hook-tapahtumia.

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

Kourutiinien hookit

debug.sethook-funktion rajoitukset koskevat kutakin säiettä erikseen. Asettakaa hookit jokaiseen kourutiiniin erikseen, jos hiekkalaatikossa suoritettava koodi luo kourutiineja.

Resurssien käytön raportointi

Raportoikaa hiekkalaatikon suorituksen jälkeen seuraavat tiedot: suoritetut käskyt, käytetty muisti, tulosteen pituus ja kulunut aika. Näistä on hyötyä väärinkäytösten havaitsemisessa ja kiintiöiden valvonnassa.

Sisäkkäiset hiekkalaatikot

Jos hiekkalaajennus voi itse luoda alihiekkalaatikoita, varmistakaa, että emohiekkalaatikon resurssirajoitukset periytyvät lapselle tai että niitä tiukennetaan sen osalta.

Tuotantoympäristön työkalut

Työkaluja: luasandbox (LuaJIT), Lua Docker -säilöt seccompilla sekä mukautetut allokaattorit, jotka rajoittavat muistin määrää ehdottomasti. Yhdistäkää näihin käyttöjärjestelmätason cgroupit vahvojen takeiden saavuttamiseksi.

Resurssirajoituksia koskeva kysymys

Miten debug.sethook toteuttaa suoritinrajoituksen?

Kertaus: resurssirajoitukset ja instrumentointi

Käyttäkää debug.sethook-funktiota suoritinrajoitusten (käskymäärän), muistirajoitusten (collectgarbage-tarkistus) ja aikarajoitusten (os.clock) toteuttamiseen. Rajoittakaa tulostusta muuttamalla print-funktio kääreellä. Raportoikaa käyttö suorituksen jälkeen seurantaa ja kiintiöiden valvontaa varten.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Resurssirajat ja instrumentointi” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Resurssirajat ja instrumentointi”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Resurssirajat ja instrumentointi”?

Laskekaa käskyjä debug.sethook-funktiolla ja valvokaa suorittimen käyttöbudjetteja. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Resurssirajat ja instrumentointi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. _ENV-malli Lua 5.2:ssa ja uudemmissa
  2. Rajoitetun hiekkalaatikon rakentaminen
  3. Hiekkalaatikosta poistumisen estäminen
  4. Resurssirajat ja instrumentointi
← Takaisin: Lua Academy