Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Jul 1998 12:27:17 -0700 (PDT)
From:      Bill Fenner <fenner@FreeBSD.ORG>
To:        cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG, cvs-sys@FreeBSD.ORG
Subject:   cvs commit: src/sys/kern uipc_socket.c
Message-ID:  <199807061927.MAA23940@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
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?199807061927.MAA23940>