我正在为 C 和 Java 构建一个在线代码编辑器。用户很可能会编写无限循环。有什么方法可以在系统级别设置中限制这些进程的 cpu 和内存利用率吗?
我的后端是一个nodejs进程,它从用户接收代码,编译并运行它。当进程超过 cpu 和内存的某些限制时,我想终止该进程。
答案1
是的,两种主要方法是setrlimit(2)
和 (在 Linux 上)控制组。
其主要优点setrlimit
是简单且可移植(由 POSIX 指定)。您fork
,然后设置限制RLIMIT_AS
和RLIMIT_CPU
,然后是exec
代码。缺点是它是每个进程的,因此代码仍然可以分叉超过限制(它分叉的每个进程将获得相同的限制,但不共享)。你也可以设置RLIMIT_NPROC
为 make fork
failed (但是当然,这样需要 fork 的代码就无法被测试)。
控制组 (cgroup) 的主要优点是它们可以一起处理进程及其所有子进程 — 它们获得组合限制。缺点是不可移植性(仅限 Linux),并且复杂性更高。如果 systemd 正在管理您系统上的控制组,您可能还需要与 systemd 交谈。 cgroups 的最佳介绍是Neil Brown 在 LWN 上的对照组系列。
另一种方法是在 VM 中运行代码,这样(至少在 KVM 的情况下)对于主机来说是一个最普通的进程。更重量级,但提供了很多隔离。
另外,作为旁注,你有一个很多如果您运行任意不受信任的代码,则比无限循环更需要担心的事情。例如,您绝对不希望有人上传垃圾邮件机器人。我建议查看现有的实现,但据我所知它们不是开源的。