答案1
您应该使用 cgroups 来执行此操作。
参见“man cgrules.conf”和“man cgconfig.conf”。
Fedora 上 systemctl 的后续版本应该支持将用户直接放入 cgroup,这样您就可以通过这种方式做得更好。
这不会限制 CPU,因为如果有可用的 CPU 资源(无人使用),它将使用所有 CPU,但是,如果其他东西也需要 CPU,它将根据配置的“cpu.shares”值分配 CPU 份额。
此外,正如建议的那样,对 CPU 时间设置 ulimit 将确保正在运行的进程在因使用过多 CPU 而被终止之前获得累计的 jiffies 数量。这可能会对用户正在使用的长时间运行的进程产生负面影响,因为这些进程在很长一段时间内自然会积累一定数量的 jiffies。
您还可以使用 cgroups 强制所有用户进程只在您的一个核心上运行,这样您就可以至少保证如果一个 CPU 不堪重负,它不会对其余操作系统进程产生负面影响。
CGroups 也是限制内存使用量的好方法。您可以将其与 pam_limits 结合使用,以防止 fork bombing。
编辑:我还应该指出,我认为您的要求不一定相关。 1 个进程占用 100% 的 CPU 并不一定是坏事,只要为其他进程提供运行时间。 无论如何,Linux 上完全公平的调度程序保证了这种行为。
如果 CPU 只是闲置,那么一个进程占用所有 CPU 并没有什么问题。只有当多个进程都要求 CPU 时间,并且其中一个进程占用了 CPU 时,才会出现问题。这时 cgroups 应该会发挥作用,因为它允许您控制在发生 CPU 争用时为不同进程分配多少 CPU 时间。
答案2
你可以限制用户资源与 PAM 一起使用。
我从来没有尝试过所以我不知道它是否正常工作......