Linux 中的资源(CPU 时间和内存)限制以及违规时终止进程

Linux 中的资源(CPU 时间和内存)限制以及违规时终止进程

问题:

给定一个进程,限制它及其子进程可以使用的资源。即设置CPU时间和虚拟内存配额。当进程组超过限制之一时,终止它,否则打​​印它已使用的 CPU 时间和虚拟内存量。

具体用例:

基本上,我必须执行几个二进制文件,它们需要来自文件的输入,但我必须确保它们的执行过程受到严格限制。例如,二进制文件分配的内存不得超过 256 MB,并且运行时间应少于 0.5 秒。但是我需要有关它所使用的内存和 CPU 量的信息。

我尝试过的:

  1. 这几天我一直在处理这个 Perl 脚本,这是我迄今为止找到的最好的解决方案。不幸的是它的内存有问题而且不是很精确。还有关于此脚本的官方作者帖子这里
  2. 我尝试过使用/usr/bin/timeout Linuxtimeout工具,这当然可以帮助我处理 CPU 时间配额,但不会因为违反虚拟内存限制而终止进程。
  3. 也尝试过使用ulimit,但正如我之前所说,我不仅需要限制,还需要资源消耗的反馈。

问题:

什么可以解决这个问题? 。

答案1

设置限制(2)syscall 与限制资源相关(CPU 时间 - 整数秒数,因此至少 1 秒 - RLIMIT_CPU、文件大小RLIMIT_FSIZE、地址空间RLIMIT_AS等)。您还可以设置磁盘配额。这等待4(2)系统调用会告诉您并提供反馈有关某些资源的使用情况。和过程(5)告诉你更多,而且得到鲁萨奇(2)SIGSTOP(您可以编写一些监视器,使用、调用getrusage或查询定期停止整个进程组/proc/$PID/,然后向该进程组发送SIGCONT“继续”或“终止”)。SIGTERM

瓦尔格林德该工具在 Linux 上非常有用,可以帮助查找内存泄漏。和跟踪(1)应该也有帮助。

如果您可以重新编译有问题的软件,您可以考虑-fsanitize=address-fsanitize=undefined其他-fsanitize=...选项到最新版本的海湾合作委员会编译器。

也许你有一些批量处理。寻找批处理监视器,或者简单地用 C、Python、Ocaml、Perl 等编写您自己的东西(它分叉命令,并循环监视它...)。也许您需要一些流程会计(请参阅账户(5)&萨(8)...)

请注意“使用的内存量”(程序通常在运行时向内核分配mmap和释放内存)和“CPU 时间”(请参阅munmap时间(7),想想多线程程序...)是非常模糊的概念。

也可以看看聚丙烯酰胺并配置以下内容/etc/security/;也许inotify(7)也可能有帮助(但可能没有)。

另请阅读高级Linux编程系统调用(2)

相关内容