如何阻止用户在服务器上运行 CPU 繁重的程序?

San*_*dra 6 linux copy

我有一个 24 核服务器,用户通过 SSH 连接到该服务器。

他们不应该运行像MATLABR或他们自己的脚本来执行模拟或类似的事情的CPU 繁重的程序。

有没有办法kill -9自动检测和CPU 繁重的进程?

Ale*_*lex 6

您可以使用 PAM限制用户资源的使用。

我从未尝试过,所以我不知道它是否正常工作...

  • 考虑到它引用了 ulimit,这似乎是作为 `RLIMIT_CPU` 实现的:“以秒为单位的 CPU 时间限制。当进程达到软限制时,它会发送一个 `SIGXCPU` 信号。这个信号的默认操作是终止进程。但是,信号可以被捕获,handler可以将控制权交还给主程序,如果进程继续消耗CPU时间,则每秒发送一次`SIGXCPU`直到达到硬限制,此时为发送`SIGKILL`” (4认同)

Mat*_*Ife 3

您应该使用 cgroup 来执行此操作。

请参阅“man cgrules.conf”和“man cgconfig.conf”。

Fedora 上的 systemctl 的更高版本应该支持将用户直接粘贴到 cgroup 中,这样您就可以做得更好。

这不会限制 CPU,因为如果有可用的 CPU 资源(没有人使用),它将使用所有 CPU,但是如果其他东西也需要 CPU,它将根据配置的“cpu.cpu”分配 CPU 份额。股”的价值。

另外,正如建议的那样,对 CPU 时间设置 ulimit 将确保正在运行的进程在因使用过多 CPU 而被杀死之前获得累积的 jiffies 数。这可能会对用户正在使用的长时间运行的进程产生负面影响,这些进程在很长一段时间内自然积累了一定数量的 jiffies。

您还可以使用 cgroup 强制所有用户进程仅运行在您的一个核心上,这样您至少可以保证如果一个 CPU 不堪重负,它不会对操作系统的其余进程产生负面影响。

CGroups 也是限制内存使用的好方法。您可以将其与 pam_limits 结合使用以防止 fork 轰炸。

编辑:我还应该指出我认为你的要求不一定相关。只要有时间让其他进程运行,1 个进程使用 100% 的 CPU 并不一定是坏事。无论如何,Linux 上完全公平的调度程序保证了这种行为。

如果 CPU 只是空闲,那么一个进程耗尽所有 CPU 并没有什么问题。仅当多个进程需要 CPU 时间并且其中一个进程占用 CPU 时,您的问题才会出现。这就是 cgroups 的优势所在,因为它允许您控制在发生 CPU 争用时分配给不同进程的 cpu 时间。