Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 06 Jul 1998 13:03:20 -0700
From:      "Chris Csanady" <cc@tarsier.ca.sandia.gov>
To:        Bill Fenner <fenner@FreeBSD.ORG>
Cc:        cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG, cvs-sys@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/kern uipc_socket.c 
Message-ID:  <199807062003.NAA28886@tarsier.ca.sandia.gov>
In-Reply-To: Your message of "Mon, 06 Jul 1998 12:27:17 PDT." <199807061927.MAA23940@freefall.freebsd.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
Cool!  I'm quite happy to see a fix for this--could someone please commit
this to -stable?

Chris

>fenner      1998/07/06 12:27:16 PDT
>
>  Modified files:
>    sys/kern             uipc_socket.c 
>  Log:
>  Introduce (fairly hacky) workaround for odd TCP behavior with application
>   writes of size (100,208]+N*MCLBYTES.
>  
>  The bug:
>   sosend() hands each mbuf off to the protocol output routine as soon as it
>   has copied it, in the hopes of increasing parallelism (see
>    http://www.kohala.com/~rstevens/vanj.88jul20.txt ). This works well for
>   TCP as long as the first mbuf handed off is at least the MSS.  However,
>   when doing small writes (between MHLEN and MINCLSIZE), the transaction is
>   split into 2 small MBUF's and each is individually handed off to TCP.
>   TCP assumes that the first small mbuf is the whole transaction, so sends
>   a small packet.  When the second small mbuf arrives, Nagle prevents TCP
>   from sending it so it must wait for a (potentially delayed) ACK.  This
>   sends throughput down the toilet.
>  
>  The workaround:
>   Set the "atomic" flag when we're doing small writes.  The "atomic" flag
>   has two meanings:
>   1. Copy all of the data into a chain of mbufs before handing off to the
>      protocol.
>   2. Leave room for a datagram header in said mbuf chain.
>   TCP wants the first but doesn't want the second.  However, the second
>   simply results in some memory wastage (but is why the workaround is a
>   hack and not a fix).
>  
>  The real fix:
>   The real fix for this problem is to introduce something like a "requested
>   transfer size" variable in the socket->protocol interface.  sosend()
>   would then accumulate an mbuf chain until it exceeded the "requested
>   transfer size".  TCP could set it to the TCP MSS (note that the
>   current interface causes strange TCP behaviors when the MSS > MCLBYTES;
>   nobody notices because MCLBYTES > ethernet's MTU).
>  
>  Revision  Changes    Path
>  1.41      +2 -1      src/sys/kern/uipc_socket.c






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