如何仅对分叉子进程设置内存/CPU 限制,而不对父进程设置内存/CPU 限制?

如何仅对分叉子进程设置内存/CPU 限制,而不对父进程设置内存/CPU 限制?

有没有办法对(比方说)apache2 进行限制,限制每个分叉子工作进程使用最大 X 内存,而不是整个进程树(apache2 及其所有分叉子进程)使用最大 X 内存?

我尝试过使用 cgroups/systemd 的解决方案,但一切都限制了主进程及其所有子进程的组合,而不是每个子进程的单独。

我正在寻找一个解决方案,不仅适用于 apache2,而且适用于所有生成子进程的进程。

答案1

只需改进应用程序的源代码(在您的情况下可能是 Apache2,它是开源的)来调用设置限制(2)成功调用后叉子(2),但在调用之前执行(2)

因为你确实想要setrlimit完成系统调用(您所设置的内容fork将保留,直到进一步调用setrlimit,可能是通过ulimitshell 的内置函数)。

花一些时间更好地了解 Linux 是如何工作的系统调用(2)工作(特别是fork& execve& setrlimit)以及如何以及何时使用它们。我推荐阅读一本好的Linux系统编程书籍,例如碱性磷酸酶

因此,您想要实现的目标通常是不现实的,除非您接受稍微改变您正在使用的每个程序。这Unix哲学这启发了,的设计fork, 禁止这样做。execvesetrlimit

当然,原则上你可以做疯狂的事情LD_PRELOAD技巧重载forksetrlimit在返回 0 之后调用)或execvesetrlimit在它之前调用 syscall)的行为动态链接 可执行文件(或者等效地,修补您自己的变体libc.so),但这是不合理的。也可以看看文件(1)或者LDD(1)检测此类动态链接的可执行文件。

但是,您可以使用ulimitshell 内置命令对 Apache2 及其所有子项进行限制。您可能会深入研究 Apache2 文档,它有大量有关其子进程的设置。

相关内容