问题:
给定一个进程,限制它及其子进程可以使用的资源。即设置CPU时间和虚拟内存配额。当进程组超过限制之一时,终止它,否则打印它已使用的 CPU 时间和虚拟内存量。
具体用例:
基本上,我必须执行几个二进制文件,它们需要来自文件的输入,但我必须确保它们的执行过程受到严格限制。例如,二进制文件分配的内存不得超过 256 MB,并且运行时间应少于 0.5 秒。但是我需要有关它所使用的内存和 CPU 量的信息。
我尝试过的:
- 这几天我一直在处理这个 Perl 脚本,这是我迄今为止找到的最好的解决方案。不幸的是它的内存有问题而且不是很精确。还有关于此脚本的官方作者帖子这里。
- 我尝试过使用
/usr/bin/timeout
Linuxtimeout
工具,这当然可以帮助我处理 CPU 时间配额,但不会因为违反虚拟内存限制而终止进程。 - 也尝试过使用
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)也可能有帮助(但可能没有)。