cgroups 通过 ulimit 提供什么?

cgroups 通过 ulimit 提供什么?

setrlimit为什么在和系统调用已经存在的情况下还要创建 cgroup getrlimit

我认为这可能rlimit只适用于单个进程,但手册页指出:

当前进程及其创建的每个进程对系统资源消耗的限制可以通过 getrlimit() 调用获得,并通过 setrlimit() 调用设置。

在我看来,如果我们想控制一组进程的资源使用,我们可以在父进程(可能是 shell)中设置限制,并且这些限制将在所有子进程中强制执行。

显然我错过了两种机制之间的一些关键区别,但我找不到我正在寻找的答案。

答案1

这种特定的措辞似乎主要用于 *BSD 版本的setrlimit.

其他版本的setrlimit (2)状态

笔记

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

资源限制是每个进程的属性由进程中的所有线程共享。

我认为这更清楚地表明,2 GiB 主内存的限制适用于单个进程(及其线程)。并且该进程的子进程也继承了 2 GiB 主内存的限制,但这是供其自己使用的 2 GiB。

换句话说,每个进程的内存限制为 2 GiB,它们总共可以消耗多达 4 GiB 的主内存。


另一方面,手册页cgroups - Linux 控制组

已经实现了各种子系统,使得可以执行诸如限制 CPU 时间和cgroup可用的内存,计算 cgroup 使用的 CPU 时间,以及冻结和恢复 cgroup 中进程的执行。

因此,控制组允许限制一组进程的资源。

对于包含 3 个进程的组,将主内存限制为 2 GiB,意味着所有 3 个进程一起使用的主内存不得超过 2 GiB。

相关内容