Date: Thu, 1 Mar 2012 02:23:15 +0100 From: Luigi Rizzo <rizzo@iet.unipi.it> To: Bruce Evans <brde@optusnet.com.au> Cc: arch@FreeBSD.org Subject: Re: select/poll/usleep precision on FreeBSD vs Linux vs OSX Message-ID: <20120301012315.GB14508@onelab2.iet.unipi.it> In-Reply-To: <20120301071145.O879@besplex.bde.org> References: <20120229194042.GA10921@onelab2.iet.unipi.it> <20120301071145.O879@besplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Mar 01, 2012 at 11:33:46AM +1100, Bruce Evans wrote: > On Wed, 29 Feb 2012, Luigi Rizzo wrote: > > >I have always been annoyed by the fact that FreeBSD rounds timeouts > >in select/usleep/poll in very conservative ways, so i decided to > >try how other systems behave in this respect. Attached is a simple > >program that you should be able to compile and run on various OS > >and see what happens. > > Many are broken, indeed. > > The simple program isn't attached. ... > > > > | Actual timeout > > | select | poll | usleep| > > timeout | FBSD | Linux | OSX | FBSD | FBSD | > > usec | 9.0 | Vbox | 10.6 | 9.0 | 9.0 | > > --------+-------+-------+--------+-------+-------+ > > 1 2000 99 6 0 2000 > > 10 2000 109 15 0 2000 > > 50 2000 149 66 0 2000 > > 100 2000 196 133 0 2000 > > 500 2000 597 617 0 2000 > > 1000 2000 1103 1136 2000 2000 > > 1001 3000 1103 1136 2000 3000 <--- > > 1500 3000 1608 1631 2000 3000 <--- > > 2000 3000 2096 2127 3000 3000 > > 2001 4000 3000 4000 <--- > > 3001 5000 4000 5000 <--- > > > >Note how the rounding (poll has the timeout in milliseconds) affects > > You must have synced with timer interrupts to get the above. Timeouts yes i have -- the test code does almost nothing after returning from a select, on a system that does some amount of work times could be up to 1000us shorter. Still a huge error on short timeouts. I should also comment that these are average values on an otherwise idle system -- i will try to post a histogram of the actual values, it might well be that osx and linux have quantized values very different from the average (though this would violate the specs, so i suspect instead that they have some cheap one-shot timers). For FreeBSD I have also rounded the bsd values (actual averages are -1/+3us over 1sec experiments). > timeouts at the cost of efficiency. But I don't like timeouts. When > they are used a lot, they are a form of busy waiting. This is only > acceptable if you have CPU to burn). sometimes you have no other way to get a notification. > It remains to explain why the above results show that poll() but not > select() is broken for small timeouts (they are turned into 0 us for no it is just that my application that does the rounding down as the API only accepts milliseconds. Thanks for the extensive comments. cheers luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120301012315.GB14508>