Permalink
Browse files

tcp_cubic: better follow cubic curve after idle period

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>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information...
Eric Dumazet authored and davem330 committed Sep 10, 2015
1 parent 05c5a46 commit 30927520dbae297182990bb21d08762bcc35ce1d
Showing with 16 additions and 0 deletions.
  1. +16 −0 net/ipv4/tcp_cubic.c
View
@@ -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",

41 comments on commit 3092752

@zhouyongtao

This comment has been minimized.

Show comment
Hide comment
@zhouyongtao

zhouyongtao Sep 28, 2015

不明觉厉的样子

zhouyongtao replied Sep 28, 2015

不明觉厉的样子

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang Sep 28, 2015

what mean ?

shaoyongyang replied Sep 28, 2015

what mean ?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean ?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean ?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what mean?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

mean ?

@shaoyongyang

This comment has been minimized.

Show comment
Hide comment
@shaoyongyang

shaoyongyang replied Sep 28, 2015

what man?

@vingc

This comment has been minimized.

Show comment
Hide comment
@vingc

vingc Sep 28, 2015

膜拜,感谢贡献者

vingc replied Sep 28, 2015

膜拜,感谢贡献者

@douglarek

This comment has been minimized.

Show comment
Hide comment
@douglarek

douglarek Sep 28, 2015

It's Cool, thanks

douglarek replied Sep 28, 2015

It's Cool, thanks

@anythink-wx

This comment has been minimized.

Show comment
Hide comment
@anythink-wx

anythink-wx replied Sep 28, 2015

顶~

@openproject

This comment has been minimized.

Show comment
Hide comment
@openproject

openproject replied Sep 28, 2015

So good!

@Honghe

This comment has been minimized.

Show comment
Hide comment
@Honghe

Honghe Sep 28, 2015

对 cubic algorithm 不知,因此看不懂此重要修复,可惜了

Honghe replied Sep 28, 2015

对 cubic algorithm 不知,因此看不懂此重要修复,可惜了

@xormplus

This comment has been minimized.

Show comment
Hide comment
@xormplus

xormplus replied Sep 28, 2015

good job

@teddysun

This comment has been minimized.

Show comment
Hide comment
@teddysun

teddysun Sep 28, 2015

Signed-off-by: Yuchung Cheng ycheng@google.com

I guess, this is a Chinese name.
Good job.

teddysun replied Sep 28, 2015

Signed-off-by: Yuchung Cheng ycheng@google.com

I guess, this is a Chinese name.
Good job.

@lebiru

This comment has been minimized.

Show comment
Hide comment
@lebiru

lebiru Sep 28, 2015

awesome 👍

lebiru replied Sep 28, 2015

awesome 👍

@swaechter

This comment has been minimized.

Show comment
Hide comment
@swaechter

swaechter Sep 28, 2015

Is the return inside the if statement really needed?

swaechter replied Sep 28, 2015

Is the return inside the if statement really needed?

@liuchangdong

This comment has been minimized.

Show comment
Hide comment
@liuchangdong

liuchangdong replied Sep 29, 2015

good job

@porscheyin

This comment has been minimized.

Show comment
Hide comment
@porscheyin

porscheyin Sep 29, 2015

Yuchung Cheng is from Taiwan

porscheyin replied Sep 29, 2015

Yuchung Cheng is from Taiwan

@name327

This comment has been minimized.

Show comment
Hide comment
@name327

name327 Sep 29, 2015

我赵日天并不服

name327 replied Sep 29, 2015

我赵日天并不服

@kenmux

This comment has been minimized.

Show comment
Hide comment
@kenmux

kenmux Sep 29, 2015

Why mention about this man specially? Why?
They're all from Google. Good jobs, guys!

kenmux replied Sep 29, 2015

Why mention about this man specially? Why?
They're all from Google. Good jobs, guys!

@dhdone

This comment has been minimized.

Show comment
Hide comment
@dhdone

dhdone Sep 29, 2015

感谢修复者

dhdone replied Sep 29, 2015

感谢修复者

@zhenhua

This comment has been minimized.

Show comment
Hide comment
@zhenhua

zhenhua Sep 29, 2015

How much performance improvement could we have by applying this fix? Could anyone give us a hint?

zhenhua replied Sep 29, 2015

How much performance improvement could we have by applying this fix? Could anyone give us a hint?

@marctmiller

This comment has been minimized.

Show comment
Hide comment
@marctmiller

marctmiller Sep 29, 2015

marctmiller replied Sep 29, 2015

@hephaex

This comment has been minimized.

Show comment
Hide comment
@hephaex

hephaex Sep 29, 2015

hephaex replied Sep 29, 2015

@guhb

This comment has been minimized.

Show comment
Hide comment
@guhb

guhb Sep 29, 2015

看不懂~先顶一个

guhb replied Sep 29, 2015

看不懂~先顶一个

@kbengine

This comment has been minimized.

Show comment
Hide comment
@kbengine

kbengine replied Oct 3, 2015

wow!

@rafavg77

This comment has been minimized.

Show comment
Hide comment
@rafavg77

rafavg77 Oct 4, 2015

Good Job!

rafavg77 replied Oct 4, 2015

Good Job!

@LINGQ1991

This comment has been minimized.

Show comment
Hide comment
@LINGQ1991

LINGQ1991 Oct 4, 2015

不明觉厉!!!

LINGQ1991 replied Oct 4, 2015

不明觉厉!!!

@gbjtv

This comment has been minimized.

Show comment
Hide comment
@gbjtv

gbjtv Oct 6, 2015

Will this make it into other lts kernels?

gbjtv replied Oct 6, 2015

Will this make it into other lts kernels?

@theharveyz

This comment has been minimized.

Show comment
Hide comment
@theharveyz

theharveyz replied Oct 13, 2015

awesome!

@dale76uk

This comment has been minimized.

Show comment
Hide comment
@dale76uk

dale76uk Oct 25, 2015

Hi,
I'm running linux mint 17.1, how do I apply this patch?
Thanks in advance

dale76uk replied Oct 25, 2015

Hi,
I'm running linux mint 17.1, how do I apply this patch?
Thanks in advance

@marctmiller

This comment has been minimized.

Show comment
Hide comment
@marctmiller

marctmiller Oct 25, 2015

marctmiller replied Oct 25, 2015

@nkeck720

This comment has been minimized.

Show comment
Hide comment
@nkeck720

nkeck720 Oct 25, 2015

nkeck720 replied Oct 25, 2015

@dale76uk

This comment has been minimized.

Show comment
Hide comment
@dale76uk

dale76uk Oct 26, 2015

marc, there is no need to be so rude! I'm not that naive.

dale76uk replied Oct 26, 2015

marc, there is no need to be so rude! I'm not that naive.

@marctmiller

This comment has been minimized.

Show comment
Hide comment
@marctmiller

marctmiller Oct 26, 2015

marctmiller replied Oct 26, 2015

@arjun024

This comment has been minimized.

Show comment
Hide comment
@arjun024

arjun024 Oct 28, 2015

Contributor

👏

Contributor

arjun024 replied Oct 28, 2015

👏

@chandlerding

This comment has been minimized.

Show comment
Hide comment
@chandlerding

chandlerding Nov 16, 2015

Well , we just need wait for redhat to backport this patch and roll up the new kernel updates...

chandlerding replied Nov 16, 2015

Well , we just need wait for redhat to backport this patch and roll up the new kernel updates...

@losywee

This comment has been minimized.

Show comment
Hide comment
@losywee

losywee replied Mar 5, 2016

Thanks.

Please sign in to comment.