Unter Linux können Sie posix_spawn(2)
verwenden mit der POSIX_SPAWN_USEVFORK
-Flag, um den Overhead des Kopierens von Seitentabellen zu vermeiden, wenn von einem großen Prozess abgezweigt wird.
Siehe Speichernutzung zum Erstellen von Anwendungsunterprozessen minimieren für eine gute Zusammenfassung von posix_spawn(2)
, seine Vorteile und einige Beispiele.
Um vfork(2)
zu nutzen , vergewissern Sie sich, dass #define _GNU_SOURCE
vor #include <spawn.h>
und dann einfach posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Ich kann bestätigen, dass dies unter Debian Lenny funktioniert und eine massive Beschleunigung beim Forken aus einem großen Prozess bietet.
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)
Ergebnis :Ich wollte den früh gespawnten Hilfs-Unterprozessweg gehen, wie von anderen Antworten hier vorgeschlagen, aber dann stieß ich auf diese Re-Verwendung riesiger Seitenunterstützung, um die Fork-Leistung zu verbessern.
Nachdem ich es selbst mit libhugetlbfs versucht habe, um einfach alle Mallocs meiner App dazu zu bringen, riesige Seiten zuzuweisen, erhalte ich jetzt ungefähr 2400 Forks/s unabhängig von der Prozessgröße (Über den Bereich, der mich sowieso interessiert). Erstaunlich.