Di Linux, Anda dapat menggunakan posix_spawn(2)
dengan POSIX_SPAWN_USEVFORK
flag untuk menghindari overhead menyalin tabel halaman saat bercabang dari proses besar.
Lihat Meminimalkan Penggunaan Memori untuk Membuat Subproses Aplikasi untuk ringkasan yang baik dari posix_spawn(2)
, kelebihannya dan beberapa contohnya.
Untuk memanfaatkan vfork(2)
, pastikan Anda #define _GNU_SOURCE
sebelum #include <spawn.h>
lalu cukup posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Saya dapat mengonfirmasi bahwa ini berfungsi pada Debian Lenny, dan memberikan percepatan besar-besaran saat melakukan fork dari proses besar.
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)
Hasil :Saya akan pergi ke rute subproses pembantu yang muncul lebih awal seperti yang disarankan oleh jawaban lain di sini, tetapi kemudian saya menemukan ini menggunakan dukungan halaman yang sangat besar untuk meningkatkan kinerja garpu.
Setelah mencobanya sendiri menggunakan libhugetlbfs untuk membuat semua mallocs aplikasi saya mengalokasikan halaman yang sangat besar, saya sekarang mendapatkan sekitar 2400 forks/s terlepas dari ukuran prosesnya (di atas rentang yang saya minati). Luar biasa.