Skip site navigation (1)Skip section navigation (2)
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>

index | next in thread | previous in thread | raw e-mail

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


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120301012315.GB14508>