0Pricing
Lua Academy · บทเรียน

ขีดจำกัดทรัพยากรและการตรวจวัด

ใช้ debug.sethook เพื่อนับคำสั่งและบังคับใช้โควตา CPU

ขีดจำกัดทรัพยากรและการตรวจวัด เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องจำกัดทรัพยากร

โค้ดที่ไม่น่าเชื่อถืออาจทำให้เกิด DoS ได้โดยทำงานไม่สิ้นสุดและใช้ CPU ต่อเนื่อง จัดสรรหน่วยความจำปริมาณมหาศาล หรือสร้างเอาต์พุตมากเกินไป ขีดจำกัดทรัพยากรช่วยปกป้องโฮสต์

การจำกัด CPU ด้วย debug.sethook

นับคำสั่งที่ทำงานแล้ว และยกเลิกการทำงานเมื่อเกินขีดจำกัด

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

ความละเอียดของการนับ

อาร์กิวเมนต์ลำดับที่สามของ sethook ซึ่งก็คือ count จะควบคุมความถี่ที่ฮุกทำงาน ค่าที่น้อยกว่าจะให้ความแม่นยำมากขึ้น แต่มีค่าใช้จ่ายเพิ่มขึ้น ช่วง 50-500 เป็นช่วงที่ใช้กันทั่วไป

การจำกัดหน่วยความจำด้วย collectgarbage

ตรวจสอบการใช้หน่วยความจำภายในฮุก และยกเลิกการทำงานหากเกินค่าขีดจำกัด

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

ขีดจำกัดเวลาตามนาฬิกาจริง

ใช้ร่วมกับ os.clock() เพื่อจำกัดเวลาจริง แทนการนับคำสั่งหรือใช้เพิ่มเติมจากการนับคำสั่ง

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

ขีดจำกัดเอาต์พุต

ห่อหุ้มฟังก์ชัน print ของแซนด์บ็อกซ์เพื่อนับจำนวนไบต์ที่เขียน และปฏิเสธเอาต์พุตเพิ่มเติมเมื่อถึงขีดจำกัด

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

การวัดข้อมูลเพื่อวิเคราะห์ประสิทธิภาพ

ใช้เหตุการณ์ฮุกสำหรับการเรียกใช้และการส่งคืน เพื่อสร้างกราฟการเรียกใช้ที่เก็บข้อมูลของโค้ดในแซนด์บ็อกซ์

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

ฮุกของโครูทีน

ขีดจำกัดของ debug.sethook มีผลแยกกันในแต่ละเธรด ให้ตั้งฮุกกับโครูทีนแต่ละตัวเป็นรายตัว หากโค้ดในแซนด์บ็อกซ์สร้างโครูทีน

การรายงานการใช้ทรัพยากร

หลังจากการทำงานของแซนด์บ็อกซ์ ให้รายงานข้อมูลต่อไปนี้: จำนวนคำสั่งที่ทำงาน หน่วยความจำที่ใช้ ความยาวเอาต์พุต และเวลาที่ผ่านไป ข้อมูลเหล่านี้มีประโยชน์สำหรับตรวจจับการใช้งานในทางที่ผิดและบังคับใช้โควตา

แซนด์บ็อกซ์ซ้อนกัน

หากปลั๊กอินในแซนด์บ็อกซ์สามารถสร้างแซนด์บ็อกซ์ย่อยได้เอง ต้องตรวจสอบให้แน่ใจว่าขีดจำกัดทรัพยากรของแซนด์บ็อกซ์แม่ถูกสืบทอดไปยังแซนด์บ็อกซ์ลูก หรือถูกกำหนดให้เข้มงวดยิ่งขึ้นสำหรับแซนด์บ็อกซ์ลูก

เครื่องมือสำหรับระบบจริง

เครื่องมือ ได้แก่ luasandbox สำหรับ LuaJIT, คอนเทนเนอร์ Lua ของ Docker ที่ใช้ seccomp และตัวจัดสรรหน่วยความจำแบบกำหนดเองซึ่งจำกัดหน่วยความจำอย่างเข้มงวด ควรใช้ร่วมกับ cgroups ระดับระบบปฏิบัติการเพื่อการรับประกันที่รัดกุม

คำถามเกี่ยวกับขีดจำกัดทรัพยากร

debug.sethook บังคับใช้ขีดจำกัด CPU ได้อย่างไร

สรุป: ขีดจำกัดทรัพยากรและการวัดข้อมูล

ใช้ debug.sethook เพื่อบังคับใช้ขีดจำกัด CPU ด้วยการนับคำสั่ง ขีดจำกัดหน่วยความจำด้วยการตรวจสอบ collectgarbage และขีดจำกัดเวลาด้วย os.clock ห่อหุ้ม print เพื่อจำกัดเอาต์พุต และรายงานการใช้งานหลังการทำงานเพื่อการตรวจสอบและการบังคับใช้โควตา

คำถามที่พบบ่อย

บทเรียน “ขีดจำกัดทรัพยากรและการตรวจวัด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ขีดจำกัดทรัพยากรและการตรวจวัด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ขีดจำกัดทรัพยากรและการตรวจวัด”

ใช้ debug.sethook เพื่อนับคำสั่งและบังคับใช้โควตา CPU คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ขีดจำกัดทรัพยากรและการตรวจวัด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลอง _ENV ใน Lua 5.2+
  2. การสร้างแซนด์บ็อกซ์แบบจำกัด
  3. การป้องกันการหลบหนีจากแซนด์บ็อกซ์
  4. ขีดจำกัดทรัพยากรและการตรวจวัด
← กลับไปที่ Lua Academy