Date: Thu, 07 Nov 2002 23:28:33 -0500 From: Mark Allman <mallman@grc.nasa.gov> To: freebsd-net@FreeBSD.ORG Cc: "Joseph Ishac" <Joseph.Ishac@grc.nasa.gov>, bdimond@grc.nasa.gov Subject: Re: Problem in High Speed and Long Delay with FreeBSD Message-ID: <200211080428.XAA29327@lawyers.ir.bbn.com> In-Reply-To: <20021101112001.E3259@grc.nasa.gov>
next in thread | previous in thread | raw e-mail | index | archive | help
Folks- Lots of interesting thoughts on this thread already. But, we have not yet figured it out. So, a further data point... I have been playing this evening on my machine at home -- a way old p5 running freebsd 4.7. I am seeing the same problem as we see at GRC on the freebsd 4.1 boxes. As I see it we can have one of a few possible problems: * For some reason the application is not able to fill the socket buffer. * For some reason TCP is not grabbing everything from the socket buffer. * TCP's congestion control is getting hosed somehow into thinking we need to slow down. So, my idea goes something like this: Say I have a connection with a X byte socket buffer. I start a timer, open a TCP connection, write Y bytes (Y < X), close the connection and stop the timer. The time should be very small in this case, because I am really timing how long it take the app to send data to the OS. (I am not enabling SO_LINGER). So, I ran some tests, as follows (sockbuf == X, dataen == Y): sockbuf datalen snd_time rcv_time --------------------------------------------- 16384 15000 0.000 0.617 150000 140000 0.003 4.021 500000 495000 0.015 14.083 1000000 995000 0.042 28.577 1500000 1490000 0.079 47.986 1600000 1590000 0.088 44.055 1800000 1790000 0.108 50.810 1900000 1890000 0.117 55.010 2000000 1990000 1.011 57.666 2100000 2090000 3.845 60.233 3000000 2990000 39.594 122.308 So, except for the last 3 lines all the tests easily filled up the socket buffers and exited. But, in the third line from the bottom we started to see something else. We "filled" the buffers until we could fill no more and had to wait for some ACKs to allow the buffer to drain before dumping everything in it. But, the socket buffer is bigger than the data stream so this should not be an issue, right? The situation only gets worse as we increase the transfer sizes (and socket buffer sizes). The break point seems to be somewhere near 2MB. For instance, when sending almost 3MB the sender though the transfer took ~40 seconds, while the receiver accurately shows ~122 seconds. That shows that the sender had to wait for a third of the data to drain from the network to get all its data into the socket buffers. But, that should not have been. One more piece of information... The socket descriptor is placed in non-blocking mode. I write in 8KB chunks. So, I do a select(), and write accordingly. However, even though I cannot write into the socket buffer at times, select() never fails to say that I can write the descriptor *and* I never see a short write(). But, clearly I am blocking or I'd shoot everything into the socket buffer. Does any of this make any sense to anyone? Any ideas on what might be wrong here? Any suggestions on places to start looking? Thanks! allman -- Mark Allman -- NASA GRC/BBN -- http://roland.grc.nasa.gov/~mallman/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200211080428.XAA29327>