linux - 在 Linux 上更快地 fork 大型进程?

标签 linux process debian exec fork

在现代 Linux 上实现与 fork-execve 组合从大型进程相同效果的最快、最佳方法是什么?

我的问题是进程 fork 大约 500MByte,一个简单的基准测试只能从进程中获得大约 50 个 fork /秒(c​​.f 从最小大小的进程中获得大约 1600 个 fork /秒),这对于预期来说太慢了应用。

出现了一些谷歌搜索 vfork被发明为解决这个问题......但也有关于 not to use it 的警告.现代 Linux 似乎已经获得了相关的 cloneposix_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/

相关文章:

python - 在 Python3 中从 bash 读取输入

node.js - 为什么 Node server.listen 不返回 shell

linux -/etc/init.d 脚本 'detach' 来自输出

c++ - 是否有用于 Debian/Ubuntu 的 Boost 1.5.3 软件包?

linux - make不删除中间文件

linux - Bash IFS,在函数调用中被打断

linux - 尽管存在必要的权限,但复制时权限被拒绝

C# 分隔参数并将其传递给 Process.Start() 方法

c# - 使用 Streamreader.Read block /RedirectStandardOutput

linux - 如何检查我的共享库中的哪些符号具有非位置无关代码 (PIC)?