Sous Linux, vous pouvez utiliser posix_spawn(2)
avec le POSIX_SPAWN_USEVFORK
flag pour éviter la surcharge de copie des tables de pages lors de la dérivation d'un processus volumineux.
Voir Minimiser l'utilisation de la mémoire pour créer des sous-processus d'application pour un bon résumé de posix_spawn(2)
, ses avantages et quelques exemples.
Pour profiter de vfork(2)
, assurez-vous d'avoir #define _GNU_SOURCE
avant #include <spawn.h>
puis simplement posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Je peux confirmer que cela fonctionne sur Debian Lenny et fournit une accélération massive lors de la dérivation d'un processus volumineux.
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)
Résultat :J'allais emprunter la voie du sous-processus d'assistance créée au début, comme suggéré par d'autres réponses ici, mais je suis ensuite tombé sur cette réutilisation d'un énorme support de page pour améliorer les performances de la fourche.
Après avoir essayé moi-même en utilisant libhugetlbfs pour que tous les mallocs de mon application allouent simplement des pages énormes, j'obtiens maintenant environ 2400 forks/s quelle que soit la taille du processus (sur la gamme qui m'intéresse de toute façon). Incroyable.