ขีดจำกัดทรัพยากรและการตรวจวัด
ใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แบบจำลอง _ENV ใน Lua 5.2+
- การสร้างแซนด์บ็อกซ์แบบจำกัด
- การป้องกันการหลบหนีจากแซนด์บ็อกซ์
- ขีดจำกัดทรัพยากรและการตรวจวัด