Date: Wed, 2 Apr 2003 17:55:23 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Ruslan Ermilov <ru@FreeBSD.org> Cc: "M. Warner Losh" <imp@bsdimp.com> Subject: Re: depend + all vs dependall Message-ID: <20030402174522.X25929@gamplex.bde.org> In-Reply-To: <20030402065855.GA161@sunbay.com> References: <20030329.163343.53040416.imp@bsdimp.com> <20030330150957.M13638@gamplex.bde.org> <20030402065855.GA161@sunbay.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2 Apr 2003, Ruslan Ermilov wrote: > On Sun, Mar 30, 2003 at 04:12:09PM +1000, Bruce Evans wrote: > [...] > > > time make buildworld -j 8 -s > > > > Note that all benchmarks using -j are invalid because of nondeterministic > > wait times of up to 100 msec for each job. This pessimizes makeworld -j 4 > > times by about 20% on a non-dual Athlon XP1600, and can't do good things > > for the variance. The pessimization is larger on faster machines of > > course. This is fixed in NetBSD. FreeBSD only has the hackaround of > > reducing the timeout from 500 msec to 100 msec. > > > FreeBSD also provides disabled at the moment kqueue(2) based > implementation of the above wait. Now that Jonathan is back, > perhaps he could look into the issues if they still exist? I tried this first. It fixed make and didn't cause any kernel problems here, but is not necessary with correct programming of select(). It might be a micro-optimization relative to select though -- a slopy benchmark showed that it was 0.2% faster for makeworld. References: %%% Index: main.c =================================================================== RCS file: /home/ncvs/src/usr.bin/make/main.c,v retrieving revision 1.81 diff -u -2 -r1.81 main.c --- main.c 17 Dec 2002 04:26:22 -0000 1.81 +++ main.c 21 Mar 2003 23:41:47 -0000 @@ -411,4 +411,8 @@ } +void +catch_child(int sig) +{ +} /*- @@ -452,4 +456,20 @@ /* avoid faults on read-only strings */ static char syspath[] = _PATH_DEFSYSPATH; + + { + /* + * Catch SIGCHLD so that we get kicked out of select() when we + * need to look at a child. This is only known to matter for the + * -j case (perhaps without -P). + * + * XXX this is intentionally misplaced. + */ + struct sigaction sa; + + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; + sa.sa_handler = catch_child; + sigaction(SIGCHLD, &sa, NULL); + } #ifdef WANT_ENV_MKLVL %%% %%% RCS file: /home/NetBSD/NetBSD-cvs/src/usr.bin/make/job.c,v Working file: job.c head: 1.75 ... ---------------------------- revision 1.73 date: 2002/11/16 22:22:23; author: gson; state: Exp; lines: +98 -57 Fixed race condition that would cause make -j to pause for five seconds if a SIGCHLD arrived while make was not blocked in poll(), by making the SIGCHLD handler write to a pipe included in the poll. Avoided the need to implement a duplicate fix for the USE_SELECT case by emulating poll() in terms of select() when USE_SELECT is defined. Fixes bin/18895. ---------------------------- ... ---------------------------- revision 1.37 date: 2000/12/05 15:20:10; author: sommerfeld; state: Exp; lines: +35 -4 correct performance regression of recent change from select() to poll() for parallel make: - Make the poll() code behave more like the select() code: sleep for a bit waiting for output rather than busy-wait (eww). - Install a no-op SIGCHLD handler so that poll/select wake up early (with -1/EINTR) when a child exits. - Change the default sleep time from 500ms to 5 seconds since we now wake up promptly when a child exits. ---------------------------- %%% %%% RCS file: /home/ncvs/src/usr.bin/make/job.h,v Working file: job.h head: 1.20 ... ---------------------------- revision 1.8 date: 1997/04/21 20:32:11; author: phk; state: Exp; lines: +2 -2 branches: 1.8.2; In these XXX MHz days, waiting 500ms for a process to do something is really far too long. Let us try 100ms instead, if you have a PP200, maybe that's even too long. This should speed up make -j# builds. I wonder why SIGCHLD isn't used... ---------------------------- %%% Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030402174522.X25929>