0Pricing
Lua Academy · Pelajaran

Batas Sumber Daya dan Instrumentasi

Gunakan debug.sethook untuk menghitung instruksi dan menegakkan anggaran CPU.

Batas Sumber Daya dan Instrumentasi adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Mengapa Membatasi Sumber Daya?

Kode yang tidak tepercaya dapat menyebabkan DoS dengan berjalan tanpa henti (CPU), mengalokasikan memori dalam jumlah sangat besar, atau menghasilkan keluaran berlebihan. Batas sumber daya melindungi host.

Batas CPU melalui debug.sethook

Hitung instruksi yang dijalankan dan batalkan eksekusi saat batas terlampaui.

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

Granularitas Penghitungan

Argumen ketiga untuk sethook (count) mengatur seberapa sering pengait dijalankan. Nilai yang lebih kecil = lebih akurat, tetapi bebannya lebih besar. Rentang 50–500 umum digunakan.

Batas Memori melalui collectgarbage

Periksa penggunaan memori di dalam pengait dan batalkan eksekusi jika melebihi ambang batas.

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

Batas Waktu Jam Dinding

Gabungkan dengan os.clock() untuk membatasi waktu jam dinding, bukan hanya (atau selain) jumlah instruksi.

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

Batas Keluaran

Bungkus fungsi print milik kotak pasir untuk menghitung byte yang ditulis dan menolak keluaran lebih lanjut setelah batas tercapai.

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

Instrumentasi untuk Pembuatan Profil

Gunakan peristiwa pengait "call" dan "return" untuk membuat grafik panggilan terinstrumentasi dari kode dalam kotak pasir.

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

Pengait Korutin

Batas debug.sethook berlaku per utas. Tetapkan pengait pada setiap korutin secara terpisah jika kode dalam kotak pasir membuat korutin.

Melaporkan Penggunaan Sumber Daya

Setelah eksekusi kotak pasir, buat report: instruksi yang dijalankan, memori yang digunakan, panjang keluaran, dan waktu yang berlalu. Hal ini berguna untuk mendeteksi penyalahgunaan dan menegakkan kuota.

Kotak Pasir Bertingkat

Jika plugin dalam kotak pasir dapat membuat kotak pasir turunan sendiri, pastikan batas sumber daya kotak pasir induk diwariskan atau diperketat untuk kotak pasir anak.

Peralatan Produksi

Alat: luasandbox (LuaJIT), kontainer Lua Docker dengan seccomp, dan alokator khusus yang membatasi memori secara ketat. Gabungkan dengan cgroups tingkat OS untuk jaminan yang kuat.

Pertanyaan tentang Batas Sumber Daya

Bagaimana debug.sethook menerapkan batas CPU?

Ringkasan: Batas Sumber Daya dan Instrumentasi

Gunakan debug.sethook untuk menerapkan batas CPU (jumlah instruksi), batas memori (pemeriksaan collectgarbage), dan batas waktu (os.clock). Bungkus print untuk membatasi keluaran. Laporkan penggunaan setelah eksekusi untuk pemantauan dan penegakan kuota.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batas Sumber Daya dan Instrumentasi” gratis?

Ya — teks lengkap “Batas Sumber Daya dan Instrumentasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Batas Sumber Daya dan Instrumentasi”?

Gunakan debug.sethook untuk menghitung instruksi dan menegakkan anggaran CPU. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Batas Sumber Daya dan Instrumentasi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model _ENV dalam Lua 5.2+
  2. Membangun Sandbox Terbatas
  3. Mencegah Pelarian dari Sandbox
  4. Batas Sumber Daya dan Instrumentasi
← Kembali ke Lua Academy