Re: iperf: performance regression (was b44 driver problem?)
From: Stephen Hemminger <hidden>
Date: 2007-06-04 18:06:30
Also in:
linux-wireless, lkml
On Mon, 04 Jun 2007 19:32:48 +0200 Thomas Gleixner [off-list ref] wrote:
On Mon, 2007-06-04 at 09:59 -0700, Stephen Hemminger wrote:quoted
quoted
quoted
gettimeofday({1180973726, 982754}, NULL) = 0 recv(4, "\0\0\0\0\0\0\0\1\0\0\23\211\0\0\0\0\0\0\0\0\377\377\364"..., 8192, 0) = 8192 gettimeofday({1180973726, 983790}, NULL) = 0Well, gettimeofday() is not affected by the highres code, butquoted
nanosleep({0, 0}, NULL) = 0 nanosleep({0, 0}, NULL) = 0is. The nanosleep call with a relative timeout of 0 returns immediately with highres enabled, while it sleeps at least until the next tick arrives when highres is off. Are there more of those stupid sleeps in the code ?GLIBC pthread_mutex does it, YES it is a problem! Looks like the old behavior is required for ABI compatibility. iperf server has several threads. One thread is using pthread_mutex_lock to wait for the other thread. It looks like pthread_mutex_lock is using nanosleep as yield().I doubt that. This is in the iperf code itself. void thread_rest ( void ) { #if defined( HAVE_THREAD ) #if defined( HAVE_POSIX_THREAD ) // TODO add checks for sched_yield or pthread_yield and call that // if available usleep( 0 ); ----------^^^^ It results in a nanosleep({0,0}, NULL) tglx
Yes, the following patch makes iperf work better than ever. But are other broken applications going to have same problem. Sounds like the old "who runs first" fork() problems.
--- iperf-2.0.2/compat/Thread.c.orig 2005-05-03 08:15:51.000000000 -0700
+++ iperf-2.0.2/compat/Thread.c 2007-06-04 10:54:21.000000000 -0700@@ -405,9 +405,13 @@ void thread_rest ( void ) { #if defined( HAVE_THREAD ) #if defined( HAVE_POSIX_THREAD ) - // TODO add checks for sched_yield or pthread_yield and call that - // if available + +#if defined( _POSIX_PRIORITY_SCHEDULING ) + sched_yield(); +#else usleep( 0 ); +#endif + #else // Win32 SwitchToThread( ); #endif
--
Stephen Hemminger <shemminger@linux-foundation.org>