cosmopolitan/third_party
Justine Tunney cdfcee51ca
Properly serialize fork() operations
This change solves an issue where many threads attempting to spawn forks
at once would cause fork() performance to degrade with the thread count.
Things got real nasty on NetBSD, which slowed down the whole test fleet,
because there's no vfork() and we're forced to use fork() in our server.

   threads      count task
         1       1062 fork+exit+wait
         2        668 fork+exit+wait
         4         66 fork+exit+wait
         8         19 fork+exit+wait
        16         22 fork+exit+wait
        32         16 fork+exit+wait

Things are now much less bad on NetBSD, but not great, since it does not
have futexes; we rely on its semaphore file descriptors to do conditions

   threads      count task
         1       1085 fork+exit+wait
         2        842 fork+exit+wait
         4        532 fork+exit+wait
         8        400 fork+exit+wait
        16        276 fork+exit+wait
        32         66 fork+exit+wait

With OpenBSD which also lacks vfork(), things were just as bad as NetBSD

   threads      count task
         1        584 fork+exit+wait
         2        687 fork+exit+wait
         4        206 fork+exit+wait
         8         24 fork+exit+wait
        16         33 fork+exit+wait
        32         26 fork+exit+wait

But since OpenBSD has futexes fork() works terrifically thanks to *NSYNC

   threads      count task
         1        525 fork+exit+wait
         2        580 fork+exit+wait
         4        451 fork+exit+wait
         8        479 fork+exit+wait
        16        408 fork+exit+wait
        32        373 fork+exit+wait

This issue would most likely only manifest itself, when pthread_atfork()
callers manage to slip a spin lock into the outermost position of fork's
list of locks. Since fork() is very slow, a spin lock can be devastating

Needless to say vfork() rules and anyone who says differently is kidding
themselves. Look at what a FreeBSD 14.1 virtual machine with equal specs
can do over the course of three hundred milliseconds.

   threads      count task
         1       2559 vfork+exit+wait
         2       5389 vfork+exit+wait
         4      34933 vfork+exit+wait
         8      43273 vfork+exit+wait
        16      49648 vfork+exit+wait
        32      40247 vfork+exit+wait

So it's a shame that so few OSes support vfork(). It creates an unsavory
situation, where someone wanting to build a server that spawns processes
would be better served to not use threads and favor a multiprocess model
2024-07-27 08:23:44 -07:00
..
aarch64 Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
argon2 Release Cosmopolitan v3.3 2024-02-20 13:27:59 -08:00
awk Add sysctlbyname() for MacOS 2024-05-02 23:21:43 -07:00
bzip2 Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
chibicc Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
compiler_rt Delete ASAN 2024-06-22 05:45:49 -07:00
ctags Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
dlmalloc Properly serialize fork() operations 2024-07-27 08:23:44 -07:00
double-conversion Make malloc() go 200x faster 2024-06-05 02:02:14 -07:00
finger Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
gdtoa Release Cosmopolitan v3.3 2024-02-20 13:27:59 -08:00
getopt Delete ASAN 2024-06-22 05:45:49 -07:00
hiredis Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
intel Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
less Stop using .com extension in monorepo 2024-03-03 03:12:19 -08:00
libcxx Add special errno handling to libcxx 2024-07-25 01:23:02 -07:00
libcxxabi Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
libunwind Make malloc() go 200x faster 2024-06-05 02:02:14 -07:00
linenoise Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
lua Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
lz4cli Implement proper time zone support 2024-05-04 23:06:37 -07:00
make Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
maxmind Release Cosmopolitan v3.3 2024-02-20 13:27:59 -08:00
mbedtls Fix MODE=optlinux for GitHub Actions 2024-07-23 04:17:22 -07:00
musl Expose gethostbyname() 2024-07-25 19:21:35 -07:00
ncurses Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
nsync Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
openmp Remove bad defines from early days of project 2024-07-24 12:11:21 -07:00
pcre Fix MODE=optlinux and MODE=tiny builds 2024-07-23 04:04:19 -07:00
puff Delete ASAN 2024-06-22 05:45:49 -07:00
python Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
qemu more modeline errata (#1019) 2023-12-16 23:07:10 -05:00
readline Fix --ftrace on Windows 2024-01-01 00:00:42 -08:00
regex Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
sed Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
smallz4 Implement proper time zone support 2024-05-04 23:06:37 -07:00
sqlite3 Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
stb Fix MODE=optlinux and MODE=tiny builds 2024-07-23 04:04:19 -07:00
tidy Fix MODE=optlinux and MODE=tiny builds 2024-07-23 04:04:19 -07:00
tr Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
tree Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
tz Update MODE=tiny time zone list (#1167) 2024-05-06 16:48:49 -07:00
unzip Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
vqsort more modeline errata (#1019) 2023-12-16 23:07:10 -05:00
xed Delete ASAN 2024-06-22 05:45:49 -07:00
xxhash Implement proper time zone support 2024-05-04 23:06:37 -07:00
zip Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
zlib Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
zstd Implement proper time zone support 2024-05-04 23:06:37 -07:00
.clang-format Reduce header complexity 2023-11-28 14:39:42 -08:00
BUILD.mk Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00