tcp: retry more conservatively on local congestion
Previously when the sender fails to retransmit a data packet on timeout due to congestion in the local host (e.g. throttling in qdisc), it'll retry within an RTO up to 500ms. In low-RTT networks such as data-centers, RTO is often far below the default minimum 200ms (and the cap 500ms). Then local host congestion could trigger a retry storm pouring gas to the fire. Worse yet, the retry counter (icsk_retransmits) is not properly updated so the aggressive retry may exceed the system limit (15 rounds) until the packet finally slips through. On such rare events, it's wise to retry more conservatively (500ms) and update the stats properly to reflect these incidents and follow the system limit. Note that this is consistent with the behavior when a keep-alive probe is dropped due to local congestion. Change-Id: I39ca48f733faefcda4e9cc091fb3c860fc9e0708 Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Neal Cardwell <ncardwell@google.com> Reviewed-by: Soheil Hassas Yeganeh <soheil@google.com> Git-Commit: 590d2026d62418bb27de9ca87526e9131c1f48af Git-repo: https://android.googlesource.com/kernel/common/ Signed-off-by: Kaustubh Pandey <kapandey@codeaurora.org>
This commit is contained in:
parent
5eb4f3dce3
commit
8591132ecd
1 changed files with 3 additions and 5 deletions
|
@ -531,14 +531,13 @@ void tcp_retransmit_timer(struct sock *sk)
|
|||
|
||||
tcp_enter_loss(sk);
|
||||
|
||||
icsk->icsk_retransmits++;
|
||||
if (tcp_retransmit_skb(sk, tcp_rtx_queue_head(sk), 1) > 0) {
|
||||
/* Retransmission failed because of local congestion,
|
||||
* do not backoff.
|
||||
* Let senders fight for local resources conservatively.
|
||||
*/
|
||||
if (!icsk->icsk_retransmits)
|
||||
icsk->icsk_retransmits = 1;
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
min(icsk->icsk_rto, TCP_RESOURCE_PROBE_INTERVAL),
|
||||
TCP_RESOURCE_PROBE_INTERVAL,
|
||||
TCP_RTO_MAX);
|
||||
goto out;
|
||||
}
|
||||
|
@ -559,7 +558,6 @@ void tcp_retransmit_timer(struct sock *sk)
|
|||
* the 120 second clamps though!
|
||||
*/
|
||||
icsk->icsk_backoff++;
|
||||
icsk->icsk_retransmits++;
|
||||
|
||||
out_reset_timer:
|
||||
/* If stream is thin, use linear timeouts. Since 'icsk_backoff' is
|
||||
|
|
Loading…
Reference in a new issue