jpe*_*jpe 21 linux memory limit resources
关于限制单个进程的资源有很多问题和答案,例如RLIMIT_AS可以用来限制进程分配的最大内存,可以看成是VIRT之类的top。有关该主题的更多信息,例如这里有没有办法限制特定进程在 Unix 中可以使用的内存量?
setrlimit(2) 文档说:
通过 fork(2) 创建的子进程继承其父进程的资源限制。跨 execve(2) 保留资源限制。
应该这样理解:
如果一个进程的 RLIMIT_AS 为 2GB,那么它不能分配超过 2GB 的内存。当它产生一个子进程时,2GB 的地址空间限制将传递给子进程,但从 0 开始计数。这两个进程一起最多可以占用 4GB 的内存。
但是,限制整个进程树分配的内存总量的有用方法是什么?
arn*_*efm 13
我不确定这是否能回答您的问题,但我发现这个perl 脚本声称完全符合您的要求。该脚本通过唤醒和检查进程及其子进程的资源使用情况来实现自己的系统来强制执行限制。它似乎有很好的记录和解释,并且最近已更新。
正如 slm 在他的评论中所说,cgroups 也可以用于此。您可能需要安装用于管理 cgroup 的实用程序,假设您使用的是 Linux,您应该查找libcgroups.
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
Run Code Online (Sandbox Code Playgroud)
确保$USER是您的用户。
然后,您的用户应该可以访问 .cgroup 中的 cgroup 内存设置/sys/fs/cgroup/memory/myGroup。
然后,您可以通过执行以下操作将限制设置为 500 MB:
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
Run Code Online (Sandbox Code Playgroud)
现在让我们运行 Vim:
cgexec -g memory:myGroup vim
Run Code Online (Sandbox Code Playgroud)
vim 进程及其所有子进程现在应该被限制为使用 500 MB 的 RAM。但是,我认为此限制仅适用于 RAM 而不适用于交换。一旦进程达到限制,它们将开始交换。我不确定你是否能解决这个问题,我找不到使用 cgroups 限制交换使用的方法。
https://unix.stackexchange.com/a/536046/4319:
在任何基于 systemd 的发行版上,您还可以通过 systemd-run 间接使用 cgroup。例如,对于限制pdftoppm为 500M RAM 的情况,请使用:
systemd-run --scope -p MemoryLimit=500M pdftoppm
Run Code Online (Sandbox Code Playgroud)
...
| 归档时间: |
|
| 查看次数: |
9123 次 |
| 最近记录: |