我正在为C和Java构建在线代码编辑器。用户可能会编写无限循环。有什么方法可以限制系统级别设置下这些进程的cpu和内存使用率?
我的后端是一个nodejs进程,该进程从用户那里接收代码,对其进行编译并运行。当它超过一些crt和内存限制时,我想终止该进程。
是的-两种主要方法是setrlimit(2)
和(在Linux上)控制组。
它的主要优点setrlimit
是它简单且可移植(由POSIX指定)。你fork
,然后设置限制RLIMIT_AS
和RLIMIT_CPU
,然后exec
代码。缺点是它是每个进程的,因此代码仍然可以分叉以超过限制(它分叉的每个进程将获得相同的限制,但不会共享)。您还可以设置RLIMIT_NPROC
使fork
失败(但当然,那么代码需要叉无法进行测试)。
对照组(cgroups)的主要优势在于,他们可以将过程及其所有子项一起对待-他们得到的总和是极限。缺点是不可移植性(仅Linux),并且复杂性更高。如果它正在管理系统上的控制组,则可能还需要与systemd进行交谈。对cgroups最好的介绍是Neil Brown在LWN上的Control Group系列。
另一种方法是在VM中运行代码,这对主机来说(至少在KVM情况下)是最普通的过程。重量级得多,但提供了很多隔离。
此外,作为一个侧面说明,你有很多事要担心不是无限循环,如果你正在运行任意不受信任的代码。例如,您绝对不希望有人上传垃圾邮件机器人。我建议您看一下现有的实现,但是AFAIK并不是开源的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句