Ограничения ресурсов и инструментирование
Используйте debug.sethook для подсчёта инструкций и соблюдения ограничений CPU.
«Ограничения ресурсов и инструментирование» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 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 (счётчик) определяет, как часто вызывается обработчик. Меньшие значения дают большую точность, но создают больше накладных расходов. Распространённый диапазон — 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» и «возврат», чтобы построить инструментированный граф вызовов кода в песочнице.
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 применяются отдельно к каждому потоку. Устанавливайте обработчики для каждой корутины отдельно, если код в песочнице создаёт корутины.
Отчёт об использовании ресурсов
После выполнения песочницы вызовите report: количество выполненных инструкций, использованную память, длину вывода и прошедшее время. Это полезно для обнаружения злоупотреблений и контроля квот.
Вложенные песочницы
Если плагин в песочнице может сам создавать дочерние песочницы, убедитесь, что ограничения ресурсов родительской песочницы передаются дочерней или ужесточаются для неё.
Инструменты для рабочего окружения
Инструменты: luasandbox (LuaJIT), контейнеры Lua в Docker с seccomp, пользовательские распределители памяти с жёстким ограничением объёма памяти. Для надёжных гарантий сочетайте их с группами cgroups на уровне ОС.
Вопрос об ограничениях ресурсов
Как debug.sethook обеспечивает ограничение CPU?
Итоги: ограничения ресурсов и инструментирование
Используйте debug.sethook для задания ограничений CPU (количество инструкций), памяти (проверка collectgarbage) и времени (os.clock). Оберните print, чтобы ограничить вывод. После выполнения формируйте отчёт об использовании ресурсов для мониторинга и контроля квот.
Часто задаваемые вопросы
Урок «Ограничения ресурсов и инструментирование» бесплатный?
Да — полный текст урока «Ограничения ресурсов и инструментирование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ограничения ресурсов и инструментирование»?
Используйте debug.sethook для подсчёта инструкций и соблюдения ограничений CPU. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Ограничения ресурсов и инструментирование»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель _ENV в Lua 5.2+
- Создание ограниченной песочницы
- Предотвращение выхода из песочницы
- Ограничения ресурсов и инструментирование