Re: Sftp slow on both our centos installs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]




On Apr 30, 2007, at 9:34 PM, Jamie Lists wrote:

The Question:
Is there some sort of speed limitation somewhere in the ssh/sftp daemon?

Here's a couple potential problems

1. CPU usage. sftp is more intensive than CPU. Don't run out the Mac even though it worked fine with another machine - the algorithm negotiation might have gone differently. Look at the CPU utilization with a tool like top. The pessimistic assumption is that no bytes are being sent during the percentage of the time the CPU is busy.

2. TCP windows. This one's a bit complex to expain:

The deal is that between sftp on machine A sending bytes and sftp on machine B receiving them, machine A's kernel is responsible for retrying sends until machine B's kernel acknowledges them (thus it needs to keep them in a send buffer), and machine B's kernel is responsible for buffering them until the sftp process is ready to deal with them.

Machine B advertises how many bytes are free in its receive buffer through the TCP window. This number is important for performance: that's the number of bytes machine B can send before receiving an acknowledgement, so if it's less than (ping time) * (bandwidth), it can limit throughput.

So first, what is the ping time between these two machines? Calculate this number accordingly, which is usually called the bandwidth*delay product.

Now run sftp between the machines while running tcpdump. On your Macintosh, try something like this:

    $ sudo /usr/sbin/tcpdump -ni en0 'port ssh and tcp-syn != 0'

That will dump out the initiating packets of the connection only. For me, an ssh connection from my OS X 10.4.9 machine to my CentOS 5 machine looks like this:

18:09:48.824252 IP 10.4.253.189.53581 > 10.4.254.87.22: S 1900985803:1900985803(0) win 65535 <mss 1460,nop,wscale 0,nop,nop,timestamp 468743802 0,sackOK,eol> 18:09:48.824434 IP 10.4.254.87.22 > 10.4.253.189.53581: S 4196469947:4196469947(0) ack 1900985804 win 5792 <mss 1460,sackOK,timestamp 280331387 468743802,nop,wscale 7>

My Macintosh (10.4.253.189) is advertising a TCP window size of 65535 bytes.

My Linux box (10.4.254.87) is doing something a bit more complicated. When TCP was originally created, they didn't foresee the need for window sizes greater than 65535. It's using an option called TCP window scaling to multiply its advertised window size by 2^7. So it's advertising a window size of 741k...if the Mac supports window scaling as well...otherwise, a dismal 5792 bytes. In this case, my Mac does claim support for window scaling, so the full size is used.

I'm using 100 Mbps Ethernet and my round-trip ping times between the machines are at most 0.3 ms, so full utilization requires this window size:

100 * 10^6 bits/sec * (byte / 8 bits) * (0.3 * 10^-3 s) = 3000 bytes.

so both window sizes are plenty. But if I were using gigabit Ethernet with a full millisecond of latency:

100 * 10^9 bits/sec * (byte / 8 bits) * (10^-3 s) = 1000000 bytes = 100 kbytes

I could send at full speed from the Mac to the Linux machine but not the other way around, as the Mac's receive window is too small.

--
Scott Lamb <http://www.slamb.org/>


_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
http://lists.centos.org/mailman/listinfo/centos

[Index of Archives]     [CentOS]     [CentOS Announce]     [CentOS Development]     [CentOS ARM Devel]     [CentOS Docs]     [CentOS Virtualization]     [Carrier Grade Linux]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Linux USB]
  Powered by Linux