netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 2/2] tcp_cubic: better follow cubic curve after idle period
       [not found] <1441808667.4619.21.camel@edumazet-glaptop2.roam.corp.google.com>
@ 2015-09-10  4:55 ` Eric Dumazet
  2015-09-10 17:59   ` David Miller
  0 siblings, 1 reply; 2+ messages in thread
From: Eric Dumazet @ 2015-09-10  4:55 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, Yuchung Cheng, Neal Cardwell, Jana Iyengar,
	Stephen Hemminger, Sangtae Ha, Lawrence Brakmo

From: Eric Dumazet <edumazet@google.com>

Jana Iyengar found an interesting issue on CUBIC :

The epoch is only updated/reset initially and when experiencing losses.
The delta "t" of now - epoch_start can be arbitrary large after app idle
as well as the bic_target. Consequentially the slope (inverse of
ca->cnt) would be really large, and eventually ca->cnt would be
lower-bounded in the end to 2 to have delayed-ACK slow-start behavior.

This particularly shows up when slow_start_after_idle is disabled
as a dangerous cwnd inflation (1.5 x RTT) after few seconds of idle
time.

Jana initial fix was to reset epoch_start if app limited,
but Neal pointed out it would ask the CUBIC algorithm to recalculate the
curve so that we again start growing steeply upward from where cwnd is
now (as CUBIC does just after a loss). Ideally we'd want the cwnd growth
curve to be the same shape, just shifted later in time by the amount of
the idle period.

Reported-by: Jana Iyengar <jri@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Sangtae Ha <sangtae.ha@gmail.com>
Cc: Lawrence Brakmo <lawrence@brakmo.org>
---
 net/ipv4/tcp_cubic.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
index 28011fb1f4a2..c6ded6b2a79f 100644
--- a/net/ipv4/tcp_cubic.c
+++ b/net/ipv4/tcp_cubic.c
@@ -151,6 +151,21 @@ static void bictcp_init(struct sock *sk)
 		tcp_sk(sk)->snd_ssthresh = initial_ssthresh;
 }
 
+static void bictcp_cwnd_event(struct sock *sk, enum tcp_ca_event event)
+{
+	if (event == CA_EVENT_TX_START) {
+		s32 delta = tcp_time_stamp - tcp_sk(sk)->lsndtime;
+		struct bictcp *ca = inet_csk_ca(sk);
+
+		/* We were application limited (idle) for a while.
+		 * Shift epoch_start to keep cwnd growth to cubic curve.
+		 */
+		if (ca->epoch_start && delta > 0)
+			ca->epoch_start += delta;
+		return;
+	}
+}
+
 /* calculate the cubic root of x using a table lookup followed by one
  * Newton-Raphson iteration.
  * Avg err ~= 0.195%
@@ -450,6 +465,7 @@ static struct tcp_congestion_ops cubictcp __read_mostly = {
 	.cong_avoid	= bictcp_cong_avoid,
 	.set_state	= bictcp_state,
 	.undo_cwnd	= bictcp_undo_cwnd,
+	.cwnd_event	= bictcp_cwnd_event,
 	.pkts_acked     = bictcp_acked,
 	.owner		= THIS_MODULE,
 	.name		= "cubic",

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH net 2/2] tcp_cubic: better follow cubic curve after idle period
  2015-09-10  4:55 ` [PATCH net 2/2] tcp_cubic: better follow cubic curve after idle period Eric Dumazet
@ 2015-09-10 17:59   ` David Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2015-09-10 17:59 UTC (permalink / raw)
  To: eric.dumazet
  Cc: netdev, ycheng, ncardwell, jri, stephen, sangtae.ha, lawrence

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Wed, 09 Sep 2015 21:55:07 -0700

> From: Eric Dumazet <edumazet@google.com>
> 
> Jana Iyengar found an interesting issue on CUBIC :
> 
> The epoch is only updated/reset initially and when experiencing losses.
> The delta "t" of now - epoch_start can be arbitrary large after app idle
> as well as the bic_target. Consequentially the slope (inverse of
> ca->cnt) would be really large, and eventually ca->cnt would be
> lower-bounded in the end to 2 to have delayed-ACK slow-start behavior.
> 
> This particularly shows up when slow_start_after_idle is disabled
> as a dangerous cwnd inflation (1.5 x RTT) after few seconds of idle
> time.
> 
> Jana initial fix was to reset epoch_start if app limited,
> but Neal pointed out it would ask the CUBIC algorithm to recalculate the
> curve so that we again start growing steeply upward from where cwnd is
> now (as CUBIC does just after a loss). Ideally we'd want the cwnd growth
> curve to be the same shape, just shifted later in time by the amount of
> the idle period.
> 
> Reported-by: Jana Iyengar <jri@google.com>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Signed-off-by: Yuchung Cheng <ycheng@google.com>
> Signed-off-by: Neal Cardwell <ncardwell@google.com>

Applied.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-09-10 17:59 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1441808667.4619.21.camel@edumazet-glaptop2.roam.corp.google.com>
2015-09-10  4:55 ` [PATCH net 2/2] tcp_cubic: better follow cubic curve after idle period Eric Dumazet
2015-09-10 17:59   ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).