tcp-tso: do not split TSO packets at retransmit time
Linux TCP stack painfully segments all TSO/GSO packets before retransmits. This was fine back in the days when TSO/GSO were emerging, with their bugs, but we believe the dark age is over. Keeping big packets in write queues, but also in stack traversal has a lot of benefits. - Less memory overhead, because write queues have less skbs - Less cpu overhead at ACK processing. - Better SACK processing, as lot of studies mentioned how awful linux was at this ;) - Less cpu overhead to send the rtx packets (IP stack traversal, netfilter traversal, drivers...) - Better latencies in presence of losses. - Smaller spikes in fq like packet schedulers, as retransmits are not constrained by TCP Small Queues. 1 % packet losses are common today, and at 100Gbit speeds, this translates to ~80,000 losses per second. Losses are often correlated, and we see many retransmit events leading to 1-MSS train of packets, at the time hosts are already under stress. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
8cee83dd29
commit
10d3be5692
@@ -404,7 +404,7 @@ void tcp_retransmit_timer(struct sock *sk)
|
||||
goto out;
|
||||
}
|
||||
tcp_enter_loss(sk);
|
||||
tcp_retransmit_skb(sk, tcp_write_queue_head(sk));
|
||||
tcp_retransmit_skb(sk, tcp_write_queue_head(sk), 1);
|
||||
__sk_dst_reset(sk);
|
||||
goto out_reset_timer;
|
||||
}
|
||||
@@ -436,7 +436,7 @@ void tcp_retransmit_timer(struct sock *sk)
|
||||
|
||||
tcp_enter_loss(sk);
|
||||
|
||||
if (tcp_retransmit_skb(sk, tcp_write_queue_head(sk)) > 0) {
|
||||
if (tcp_retransmit_skb(sk, tcp_write_queue_head(sk), 1) > 0) {
|
||||
/* Retransmission failed because of local congestion,
|
||||
* do not backoff.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user