حدود الموارد وأدوات القياس
استخدم debug.sethook لعدّ التعليمات وفرض ميزانيات وحدة المعالجة المركزية
حدود الموارد وأدوات القياس درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
لماذا نحتاج إلى حدود للموارد؟
يمكن للتعليمات البرمجية غير الموثوقة التسبب في DoS من خلال العمل بلا نهاية، ما يستهلك وحدة المعالجة المركزية، أو تخصيص كميات هائلة من الذاكرة، أو توليد مخرجات مفرطة. تحمي حدود الموارد المضيف.
حد وحدة المعالجة المركزية عبر 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أجهزة القياس لإنشاء ملفات التعريف
استخدم حدثَي الخطاف "call" و"return" لإنشاء مخطط استدعاءات مُجهّز بأجهزة قياس للتعليمات البرمجية المعزولة.
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 حدًا لوحدة المعالجة المركزية؟
مراجعة: حدود الموارد وأجهزة القياس
استخدم debug.sethook لفرض حدود وحدة المعالجة المركزية، أي عدد التعليمات، وحدود الذاكرة عبر فحص collectgarbage، وحدود الوقت عبر os.clock. غلّف print للحد من المخرجات. أبلغ عن الاستخدام بعد التنفيذ لأغراض المراقبة وفرض الحصص.
الأسئلة الشائعة
هل درس «حدود الموارد وأدوات القياس» مجاني؟
نعم — نص درس «حدود الموارد وأدوات القياس» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «حدود الموارد وأدوات القياس»؟
استخدم debug.sethook لعدّ التعليمات وفرض ميزانيات وحدة المعالجة المركزية تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حدود الموارد وأدوات القياس»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نموذج _ENV في Lua 5.2 وما بعده
- إنشاء بيئة معزولة مقيّدة
- منع الهروب من البيئة المعزولة
- حدود الموارد وأدوات القياس