From: Stelian I. <sio...@cd...> - 2016-05-08 22:46:16
|
Hi, The attached patch ensures that on multi-threaded Linux, upon fork() the kernel won't try to Copy-On-Write the mapping created by the SBCL runtime. This trick speeds up a fork() considerably, especially since the GC often creates many small mappings, so a fork() becomes O(heap size). Of course, this means that Lisp code cannot be executed any more after a fork(), but that's unsafe anyway in a multithreaded environment. Test methodology: $ more /proc/cpuinfo [...] model name : Intel(R) Xeon(R) CPU E3-1535M v5 @ 2.90GHz $ uname -a Linux vilya 4.1.20-11-default #1 SMP PREEMPT Fri Mar 18 14:42:07 UTC 2016 (0a392b2) x86_64 x86_64 x86_64 GNU/Linux > (defparameter *a* (loop repeat (* 8 1024) collect (make-array (* 1024 1024) :element-type '(unsigned-byte 8) :initial-element 7)) *A* > (time (dotimes (i 1000) (sb-ext:run-program "/usr/bin/ls" '("/dev/null") :wait t))) Without MADV_DONTFORK: Evaluation took: 171.103 seconds of real time 78.112000 seconds of total run time (0.108000 user, 78.004000 system) 45.65% CPU 496,886,717,858 processor cycles 1,992,912 bytes consed With MADV_DONTFORK: Evaluation took: 2.689 seconds of real time 0.728000 seconds of total run time (0.096000 user, 0.632000 system) 27.07% CPU 7,809,738,979 processor cycles 1,992,992 bytes consed -- Stelian Ionescu a.k.a. fe[nl]ix Quidquid latine dictum sit, altum videtur. |