如何限制进程及其子进程的总资源(内存)

如何限制进程及其子进程的总资源(内存)

关于限制单个进程的资源有很多问题和答案,例如,RLIMIT_AS 可用于限制进程分配的最大内存,在top.有关该主题的更多信息,例如此处有没有办法限制 Unix 中特定进程可以使用的内存量?

setrlimit(2)文档说:

通过 fork(2) 创建的子进程继承其父进程的资源限制。跨 execve(2) 保留资源限制。

应该这样理解:

如果进程的 RLIMIT_AS 为 2GB,则它不能分配超过 2GB 的内存。当它生成子进程时,2GB 的地址空间限制将传递给子进程,但从 0 开始计数。这 2 个进程总共最多可以占用 4GB 内存。

但是,限制整个进程树分配的内存总量的有用方法是什么?

答案1

我不确定这是否能回答你的问题,但我发现了这个Perl脚本声称完全符合您的要求。该脚本实现了自己的系统,通过唤醒并检查进程及其子进程的资源使用情况来强制执行限制。它似乎有很好的记录和解释,并且最近已经更新。

正如 slm 在他的评论中所说,cgroups 也可以用于此目的。您可能必须安装用于管理 cgroup 的实用程序,假设您使用的是 Linux,您应该查找libcgroups.

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

确保$USER是您的用户。

然后,您的用户应该可以访问 中的 cgroup 内存设置/sys/fs/cgroup/memory/myGroup

然后,您可以通过执行以下操作将限制设置为 500 MB:

echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes

现在让我们运行 Vim:

cgexec -g memory:myGroup vim

vim 进程及其所有子进程现在应限制为使用 500 MB RAM。然而,我认为这个限制仅适用于 RAM 而不是交换。一旦进程达到限制,它们就会开始交换。我不确定您是否可以解决这个问题,我找不到使用 cgroup 限制交换使用的方法。

答案2

https://unix.stackexchange.com/a/536046/4319:

在任何基于 systemd 的发行版上,您还可以通过 systemd-run 间接使用 cgroup。例如,对于限制pdftoppm为 500M RAM 的情况,请使用:

systemd-run --scope -p MemoryLimit=500M pdftoppm

...

答案3

我创建了一个脚本来执行此操作,使用 cgroup-tools 中的命令在内存有限的 cgroup 中运行目标进程。看这个答案了解详细信息和脚本。

相关内容