Linux:来自内存密集型进程的system(),无需分叉

Linux: system() from a memory-intensive process without forking

本文关键字:分叉 system 内存 进程 密集型 Linux      更新时间:2023-10-16

我在 60 GB Linux 机器上有一个大的C++进程(35+ GB RAM 使用),需要 system() 来执行一些功能。但是,由于 system() 在内部分叉并执行新进程,因此它需要的虚拟内存空间是原始进程 RAM 的两倍。

我知道我可以使用 sysctl 始终启用过载内存,从而允许我的进程分叉。但是,是否有 system() 的替代方案可以在不需要太多虚拟内存的情况下执行新进程?

如果您的实现包含 posix_spawn(),这是一个更可行的替代方案。

#include <spawn.h>

http://fixunix.com/unix/84486-difference-between-spawn-fork.html

创建第二个较小的进程,该进程仅接收命令并执行命令。

选择您喜欢的IPC

(套接字,管道,信号,消息队列,选择您喜欢的IPC),并在需要执行一些小的系统操作时从庞大的进程中挠痒痒。

我们最终选择了 FB 愚蠢库中的 Subprocess,因为我们最近无论如何都添加了 folly 作为依赖项。他们在引擎盖下使用vfork(),在不复制进程页面的情况下分叉进程,并冻结父进程,直到子 exec() 的。

vfork()有许多潜在的陷阱,似乎被广泛认为已弃用/使用起来很危险。例如,它要求分叉进程只执行 exec 以外的任何操作;由于进程的页面是共享的,因此如果修改了任何内存,它们可能会修改和损坏父进程的状态。在精心编程的库中抽象它应该可以更容易地避免错误,当我们只是想在没有内存开销的情况下启动一个进程时。

愚蠢子进程库的标头:https://github.com/facebook/folly/blob/master/folly/Subprocess.h