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>