The TCPIP nagle algorithm can slow down network
19 September 2003 by Snakefoot | Comment » | Trackback OffJohn Nagle specified a way to acknowledge several received packets with a single ACK, also called the Nagle Algorithm or Nagling or delayed acknowledge RFC 2581. The delayed ACK packet is sent within a certain interval and acknowledges all the packets received since last interval. The interval depends on a timeout value (default 200 ms) and outstanding ACKs (default 2). This saves network bandwidth and helps against congestion, but can sacrifice max network throughput.
To configure the max outstanding ACKs in Windows XP/2003/Vista/2008:
To configure the interval timeout in Win2000 SP3+:[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}]
TcpAckFrequency = 2 (Default=2, 1=Disables nagling, 2-n = If n outstanding ACKs before timed interval, sent ACK)
More Info MS KB Q328890
More Info MS KB 815230 (XP/2003 needs hotfix or SP2 for it to work)
More Info MS KB 935458 (Vista needs hotfix or SP1 for it to work)
To configure the interval timeout in WinNT SP4 (Go to the Services-key and do a search for "TCPIP" to find the different adapters using TCPIP):[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}]
TcpDelAckTicks = 1 (Default=2, 0=Disables nagling, 1-6 = 100-600 ms)
More Info MS KB Q311833
More Info MS KB Q321098
More Info MS KB Q321169
Note if disabling or shortening delayed ACK on a few machines (Like a file-server or domain-controller), then it will probably result in greater network performance for those machines. If on large corporate network and disabling delayed ACK for all computers, then it will most likely lower the available bandwidth for actual filetransfer as more of the bandwidth is used for sending ACKs.[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \{Adapter-Name} \Parameters \Tcpip]
TcpDelAckTicks = 1 (Default=2, 0=Disables nagling, 1-6 = 100-600 ms)
Note before trying to disable ACK delay (RFC 1122) one should at least consider the following:
- Increased performance will only be seen if requests are sent to your machine, and the requesters doesn't request anything else before your machine replies back(ACK) to the first request.
- Some additions to the above statement:
- If the application doing socket communication uses the socket option TCP_NODELAY, then it will override the default delayed ACK frequency.
- If all of the upload bandwidth is already used (easy if slow connection), then then disabling delayed ACK will lower performance because it will generate even more upload traffic.
- If on a half duplex connection, then disabling delayed ACK will lower performance because only one party can sent at a time (Receiver will block the sender when sending ACK).
- If on a ethernet hub with other computers(Instead of a switch), then disabling delayed ACK will lower performance because the increased traffic will increase chance of collision and require retransmissions.
Note SMB Signing requires that SMB commands are processed synchronously, so a client is only allowed to send the next SMB command when it receives ACK of the previous one (Only one outstanding). This means that a client can max sent 5 SMB Commands/sec, as it has to wait for the Server's 200 ms ACK delay before it is allowed to sent the next SMB Command. This can cause very low performance when copying small files to a Server with SMB signing enabled (Imagine copying 1000 files of 1 Kbyte).
Note if a computer's only job is to receive large files or streaming data, one can increase performance by increasing the number of outstanding ACKs before it sends an ACK (TcpAckFrequency). It will allow acknowledgment of large chunks of data with a single ACK packet instead of sending ACK for every 2 packet. Make sure that the TCPIP RWIN is larger than TcpAckFrequency*MTU, as the sender will stop sending data if it fills the TCPIP RWIN without getting an ACK. Recommended values:
- 1 GigaBit: TcpAckFrequency = 13 (RWIN = 64 KByte)
- 100 MegaBit: TcpAckFrequency = 5 (RWIN = 17 KByte)
- 10 MegaBit: TcpAckFrequency = 2 (RWIN = 8 KByte)
More Info MS KB Q823764
Tags:
Category:
Updated: 29 January 2008
Comment by CharlesH - 9 November 2004 @ 22:16 Reply
Where did you get your info on this? I can only get win2k to recognize the setting and not NT4. Did you test this or get it to work?
The Microsoft site states…