Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Dec 1998 18:47:04 -0800
From:      Mike Smith <mike@smith.net.au>
To:        Michael Robinson <robinson@netrinsics.com>
Cc:        freebsd-stable@FreeBSD.ORG
Subject:   Re: MLEN < write length < MINCLSIZE "bug" 
Message-ID:  <199812150247.SAA02006@dingo.cdrom.com>
In-Reply-To: Your message of "Mon, 14 Dec 1998 14:37:09 GMT." <199812141437.OAA00472@netrinsics.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
> I previously wrote:
> >Which brings us back to where we started.  Squid and ORBit (at the very
> >least) exhibit severe performance degradation with the current 
> >MLEN < write length < MINCLSIZE bug.  There isn't an open PR (that I can
> >find), and the Squid FAQ advocates a kernel patch that breaks X Windows 
> >(among other things).
> >
> >If someone who is familiar with the fundamental problem could explain it
> >to me in more detail, along with some possible solutions, I could try to 
> >play with it.
> 
> Well, no one explained it to me, but I played with it anyway.  I've come to
> the following conclusions:
> 
>   1. This isn't a bug.  It's a performance tradeoff of memory efficiency
>      (allocating an mbuf cluster) versus protocol efficiency (sending 
>      two packets).
> 
>   2. MINCLSIZE is an arbitrary value.  It only serves to set the threshold
>      for the above performance tradeoff.
> 
>   3. For certain applications which are latency-sensitive and send many 
>      packets in the MLEN < len < MINCLSIZE range over TCP (such as SQUID
>      and IIOP), the current threshold setting is completely inappropriate.
>      However, for other applications (such as large FTP servers), reducing
>      MINCLSIZE would be completely inappropriate.
> 
>   4. One solution is to make MINCLSIZE a kernel config option.  This is ugly,
>      but simple to implement and relatively non-intrusive.

It should be a sysctl variable, not a kernel option, in this case.  But 
that's certainly the simplest way to go.  Want to implement this?

>   5. Another solution is to add a socket option, and modify kern/uipc_socket.c
>      something like this:
> 
>      -      if (resid >= MINCLSIZE) {
>      +      if ((resid >= MINCLSIZE) ||
>      +          ((resid > MLEN) && (so->so_options & SO_NOSPLIT))) {
>                 MCLGET(m, M_WAIT);
>                 if ((m->m_flags & M_EXT) == 0)
>                     goto nopages;
>                 mlen = MCLBYTES;
>                 len = min(min(mlen, resid), space);
>             } else { 
> 
>      With a socket option, applications that wanted low latency (at the
>      expense of more memory usage) could specify that on a per-socket basis.
>      This is less ugly, but requires extensive changes to documentation, 
>      header files, and application software.

Do you think you could come up with a heuristic that would be able to 
detect when the current behaviour was losing, reliably?  If so, you 
could use this to switch the option...

-- 
\\  Sometimes you're ahead,       \\  Mike Smith
\\  sometimes you're behind.      \\  mike@smith.net.au
\\  The race is long, and in the  \\  msmith@freebsd.org
\\  end it's only with yourself.  \\  msmith@cdrom.com



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message



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