关于限制单个进程的资源有很多问题和答案,例如,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 中运行目标进程。看这个答案了解详细信息和脚本。