在现代 Linux 上实现与 fork
-execve
组合从大型进程相同效果的最快、最佳方法是什么?
我的问题是进程 fork 大约 500MByte,一个简单的基准测试只能从进程中获得大约 50 个 fork /秒(c.f 从最小大小的进程中获得大约 1600 个 fork /秒),这对于预期来说太慢了应用。
出现了一些谷歌搜索 vfork
被发明为解决这个问题......但也有关于 not to use it 的警告.现代 Linux 似乎已经获得了相关的 clone
和 posix_spawn
调用;这些可能有帮助吗? vfork
的现代替代品是什么?
我在 i7 上使用 64 位 Debian Lenny(如果 posix_spawn
有帮助,该项目可以转移到 Squeeze)。
最佳答案
在 Linux 上,您可以使用 posix_spawn(2)
与 POSIX_SPAWN_USEVFORK
标记以避免从大型进程 fork 时复制页表的开销。
见 Minimizing Memory Usage for Creating Application Subprocesses 对 posix_spawn(2)
的一个很好的总结,它的优点和一些例子。
利用 vfork(2)
,请确保您 #define _GNU_SOURCE
之前 #include <spawn.h>
然后简单地posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
我可以确认这适用于 Debian Lenny,并且在从大型进程 fork 时提供了巨大的加速。
benchmarking the various spawns over 1000 runs at 100M RSS
user system total real
fspawn (fork/exec): 0.100000 15.460000 40.570000 ( 41.366389)
pspawn (posix_spawn): 0.010000 0.010000 0.540000 ( 0.970577)
关于linux - 在 Linux 上更快地 fork 大型进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2731531/