我有以下情况:(以下函数取自python)
我有一个正在运行的进程 A 并设置了 cgroup 内存限制。
我使用 os.fork() 从 A 派生一个子进程。我们称它为 B。然后我执行 os.execvp 在 B 中加载一个 shell 脚本。根据http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.html这个进程在与调用者(即B)相同的地址空间中运行。
在 B 中运行的 shell 脚本创建了一个 Java 程序,该程序无限期地以给定的堆大小运行并在 OOM 上自动终止。这是通过将-XX:OnOutOfMemoryError='kill -9 %p'传递给 java 命令来实现的。这将创建另一个进程 C 作为 B 的子进程。
从顶部看,我看到 B 是 A 的孩子,C 是 B 的孩子,正如预期的那样。
下面是疑惑:
cgroup 限制是否仅适用于 A 或 (A+B) 或 (A+B+C)?
如果达到内存限制,将杀死所有进程:A 还是 (A+B) 还是 (A+B+C)?为什么?它是使用进程 pid 或应用限制的进程的地址空间来识别的吗?
如果在上述情况下,并非所有进程都被杀死,是否有办法微调 cgroup 设置以杀死所有子进程,因为在这种情况下我们会留下孤立的进程?
我正在使用 Centos7 作为底层操作系统。
我将解决您的每个问题:
基于此,它不会杀死 cgroup 中的所有进程;它选择消耗最多内存的那个。