tcp_output starving -- is due to mbuf get delay?

Borje Josefsson bj at dc.luth.se
Fri Apr 11 09:35:06 PDT 2003


On Fri, 11 Apr 2003 09:22:47 PDT Terry Lambert wrote:

> Borje Josefsson wrote:
> > I should add that I have tried with MTU 1500 also. Using NetBSD as sender
> > works fine (just a little bit higher CPU load). When we tried MTU1500 with
> > FreeBSD as sender, we got even lower performance.
> > 
> > Somebody else in this thread said that he had got full GE speed between
> > two FreeBSD boxes connected back-to-back. I don't question that, but that
> > doesn't prove anything. The problem arises when You are trying to do this
> > long-distance and have to handle a large mbuf queue.
> 
> The boxes were not connected "back to back", they were connected
> through three Gigabit switches and a VLAN trunk.  But they were in
> a lab, yes.
> 
> I'd be happy to try long distance for you, and even go so far as
> to fix the problem for you, if you are willing to drop 10GBit fiber
> to my house.  8-) 8-). 
> 
> As far as a large mbuf queue, one thing that's an obvious difference
> is SACK support; however, this can not be the problem, since the
> NetBSD->FreeBSD speed is unafected (supposedly).
> 
> What is the FreeBSD->NetBSD speed?
> 
> Some knobs to try on FreeBSD:

ttcp-t: buflen=61440, nbuf=20345, align=16384/0, port=5001
ttcp-t: socket
ttcp-t: connect
ttcp-t: 1249996800 bytes in 16.82 real seconds = 567.09 Mbit/sec +++
ttcp-t: 20345 I/O calls, msec/call = 0.85, calls/sec = 1209.79
ttcp-t: 0.0user 15.5sys 0:16real 92% 16i+380d 326maxrss 0+15pf 16+232csw

During that time "top" shows (on the sender):

CPU states:  0.4% user,  0.0% nice, 93.0% system,  6.6% interrupt,  0.0% 
idle

Just for comparation, running in the other direction (with NetBSD as 
sender):

CPU states:  0.0% user,  0.0% nice, 19.9% system, 13.9% interrupt, 66.2% 
idle

Netstat of that test:

 bge0 in       bge0 out              total in      total out            
 packets  errs  packets  errs colls   packets  errs  packets  errs colls
   14709     0    22742     0     0     14709     0    22742     0     0
   18602     0    28002     0     0     18602     0    28002     0     0
   18603     0    28006     0     0     18603     0    28006     0     0
   18599     0    28009     0     0     18600     0    28009     0     0
   18605     0    28006     0     0     18605     0    28006     0     0
   18607     0    28006     0     0     18608     0    28006     0     0
   18608     0    28006     0     0     18608     0    28006     0     0
 bge0 in       bge0 out              total in      total out            
 packets  errs  packets  errs colls   packets  errs  packets  errs colls
14389511   908 14772089     0     0  18404167   908 18231823     0     0
   18607     0    28003     0     0     18607     0    28003     0     0
   18598     0    28006     0     0     18599     0    28006     0     0
    5823     0     8161     0     0      5823     0     8161     0     0

Note how stable it is!


> 	net.inet.ip.intr_queue_maxlen		-> 300
> 	net.inet.ip.check_interface		-> 0
> 	net.inet.tcp.rfc1323			-> 0
> 	net.inet.tcp.inflight_enable		-> 1
> 	net.inet.tcp.inflight_debug		-> 0
> 	net.inet.tcp.delayed_ack		-> 0
> 	net.inet.tcp.newreno			-> 0
> 	net.inet.tcp.slowstart_flightsize	-> 4
> 	net.inet.tcp.msl			-> 1000
> 	net.inet.tcp.always_keepalive		-> 0
> 	net.inet.tcp.sendspace			-> 65536 (on sender)

Hmm. Isn't 65536 an order of magnitude to low? I used 
tcp.sendspace=3223281 for the test above. RTTmax = 20.63 ms. Buffer size 
needed = 2578625 bytes, and then add a few %.

> Don't try them all at once and expect magic; you will probably need
> some combination.
> 
> Also, try recompiling your kernel *without* IPSEC support.

I'll do that.

--Börje



More information about the freebsd-hackers mailing list