lkml.org 
[lkml]   [2007]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: iperf: performance regression (was b44 driver problem?)
    On Mon, 04 Jun 2007 19:32:48 +0200
    Thomas Gleixner <tglx@linutronix.de> wrote:

    > On Mon, 2007-06-04 at 09:59 -0700, Stephen Hemminger wrote:
    > > > > 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) = 0
    > > >
    > > > Well, gettimeofday() is not affected by the highres code, but
    > > >
    > > > > nanosleep({0, 0}, NULL) = 0
    > > > > nanosleep({0, 0}, NULL) = 0
    > > >
    > > > is. 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>
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-06-04 20:09    [W:0.025 / U:186.356 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site